diff --git a/README.md b/README.md index 386bc6e..07f4a48 100644 --- a/README.md +++ b/README.md @@ -13,8 +13,8 @@ Før brug skal man oprette en bruger på [Dataforsyningen](https://dataforsyning 1. Opret en bruger på [Dataforsyningen](https://www.dataforsyningen.dk) 2. Log ind på dataforsyningen.dk med din nye bruger, og opret en token. 3. Indsæt `` - Eller hav filen liggende på din egen server: `` 4. Indsæt `
`-tag, dér hvor du vil have kortet. @@ -73,14 +73,14 @@ F.eks. i dette tilfælde, hvor vi har bygget okapi ind i filerne `bundled.js` og ### CDN ```html - ``` ### Lokal kopi -Download filen: `https://okapi.dataforsyningen.dk/lib/okapi-1.8.1.min.js` +Download filen: `https://okapi.dataforsyningen.dk/lib/okapi-1.9.0.min.js` ```html @@ -88,7 +88,7 @@ Download filen: `https://okapi.dataforsyningen.dk/lib/okapi-1.8.1.min.js` ### CSS -Vores standard styling kan findes her: `https://okapi.dataforsyningen.dk/lib/okapi-1.8.1.min.css` +Vores standard styling kan findes her: `https://okapi.dataforsyningen.dk/lib/okapi-1.9.0.min.css` ## Anvendelse diff --git a/dist/index.js b/dist/index.js index ae903d7..c7b7170 100644 --- a/dist/index.js +++ b/dist/index.js @@ -1,17 +1,17 @@ -var Mm=Object.create;var nc=Object.defineProperty;var vm=Object.getOwnPropertyDescriptor;var Cm=Object.getOwnPropertyNames;var Sm=Object.getPrototypeOf,Tm=Object.prototype.hasOwnProperty;var sc=(s,t)=>()=>(t||s((t={exports:{}}).exports,t),t.exports);var Rm=(s,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Cm(t))!Tm.call(s,n)&&n!==e&&nc(s,n,{get:()=>t[n],enumerable:!(i=vm(t,n))||i.enumerable});return s};var Ho=(s,t,e)=>(e=s!=null?Mm(Sm(s)):{},Rm(t||!s||!s.__esModule?nc(e,"default",{value:s,enumerable:!0}):e,s));var id=sc((wh,bh)=>{(function(s,t){typeof wh=="object"&&typeof bh<"u"?bh.exports=t():typeof define=="function"&&define.amd?define(t):s.proj4=t()})(wh,function(){"use strict";function s(r,h){if(r[h])return r[h];for(var c,g=Object.keys(r),f=h.toLowerCase().replace(fn,""),_=-1;++_0?90:-90)):(r.lat0=a(r.lat1>0?90:-90),r.lat_ts=r.lat1)}function u(r){var h=this;if(arguments.length===2){var c=arguments[1];typeof c=="string"?c.charAt(0)==="+"?u[r]=Vt(arguments[1]):u[r]=zl(arguments[1]):u[r]=c}else if(arguments.length===1){if(Array.isArray(r))return r.map(function(g){Array.isArray(g)?u.apply(h,g):u(g)});if(typeof r=="string"){if(r in u)return u[r]}else"EPSG"in r?u["EPSG:"+r.EPSG]=r:"ESRI"in r?u["ESRI:"+r.ESRI]=r:"IAU2000"in r?u["IAU2000:"+r.IAU2000]=r:console.log(r);return}}function d(r){return typeof r=="string"}function m(r){return r in u}function x(r){return Sf.some(function(h){return r.indexOf(h)>-1})}function E(r){var h=s(r,"authority");if(h){var c=s(h,"epsg");return c&&Tf.indexOf(c)>-1}}function C(r){var h=s(r,"extension");if(h)return s(h,"proj4")}function T(r){return r[0]==="+"}function w(r){if(!d(r))return r;if(m(r))return u[r];if(x(r)){var h=zl(r);if(E(h))return u["EPSG:3857"];var c=C(h);return c?Vt(c):h}return T(r)?Vt(r):void 0}function M(r){return r}function v(r,h){var c=Sr.length;return r.names?(Sr[c]=r,r.names.forEach(function(g){Cr[g.toLowerCase()]=c}),this):(console.log(h),!0)}function I(r,h,c,g){var f=r*r,_=h*h,y=(f-_)/f,p=0;return g?(f=(r*=1-y*(cn+y*(un+y*dn)))*r,y=0):p=Math.sqrt(y),{es:y,e:p,ep2:(f-_)/_}}function L(r,h,c,g,f){if(!r){var _=s(at,g);_||(_=wf),r=_.a,h=_.b,c=_.rf}return c&&!h&&(h=(1-1/c)*r),(c===0||Math.abs(r-h)3&&(p.datum_params[3]===0&&p.datum_params[4]===0&&p.datum_params[5]===0&&p.datum_params[6]===0||(p.datum_type=yi,p.datum_params[3]*=zi,p.datum_params[4]*=zi,p.datum_params[5]*=zi,p.datum_params[6]=p.datum_params[6]/1e6+1))),y&&(p.datum_type=xi,p.grids=y),p.a=c,p.b=g,p.es=f,p.ep2=_,p}function P(r){return r===void 0?null:r.split(",").map(F)}function F(r){if(r.length===0)return null;var h=r[0]==="@";return h&&(r=r.slice(1)),r==="null"?{name:"null",mandatory:!h,grid:null,isNull:!0}:{name:r,mandatory:!h,grid:Ul[r]||null,isNull:!1}}function N(r){return r/3600*Math.PI/180}function G(r){var h=r.getInt32(8,!1);return h!==11&&((h=r.getInt32(8,!0))!==11&&console.warn("Failed to detect nadgrid endian-ness, defaulting to little-endian"),!0)}function W(r,h){return{nFields:r.getInt32(8,h),nSubgridFields:r.getInt32(24,h),nSubgrids:r.getInt32(40,h),shiftType:Y(r,56,64).trim(),fromSemiMajorAxis:r.getFloat64(120,h),fromSemiMinorAxis:r.getFloat64(136,h),toSemiMajorAxis:r.getFloat64(152,h),toSemiMinorAxis:r.getFloat64(168,h)}}function Y(r,h,c){return String.fromCharCode.apply(null,new Uint8Array(r.buffer.slice(h,c)))}function Z(r,h,c){for(var g=176,f=[],_=0;_5e-11)&&(r.datum_type===_i?r.datum_params[0]===h.datum_params[0]&&r.datum_params[1]===h.datum_params[1]&&r.datum_params[2]===h.datum_params[2]:r.datum_type!==yi||r.datum_params[0]===h.datum_params[0]&&r.datum_params[1]===h.datum_params[1]&&r.datum_params[2]===h.datum_params[2]&&r.datum_params[3]===h.datum_params[3]&&r.datum_params[4]===h.datum_params[4]&&r.datum_params[5]===h.datum_params[5]&&r.datum_params[6]===h.datum_params[6])}function K(r,h,c){var g,f,_,y,p=r.x,S=r.y,R=r.z?r.z:0;if(S<-z&&S>-1.001*z)S=-z;else if(S>z&&S<1.001*z)S=z;else{if(S<-z)return{x:-1/0,y:-1/0,z:r.z};if(S>z)return{x:1/0,y:1/0,z:r.z}}return p>Math.PI&&(p-=2*Math.PI),f=Math.sin(S),y=Math.cos(S),_=f*f,g=c/Math.sqrt(1-h*_),{x:(g+R)*y*Math.cos(p),y:(g+R)*y*Math.sin(p),z:(g*(1-h)+R)*f}}function V(r,h,c,g){var f,_,y,p,S,R,O,A,k,U,D,j,ot,nt,yt,ct,Gt=r.x,te=r.y,Wt=r.z?r.z:0;if(f=Math.sqrt(Gt*Gt+te*te),_=Math.sqrt(Gt*Gt+te*te+Wt*Wt),f/c<1e-12){if(nt=0,_/c<1e-12)return yt=z,ct=-g,{x:r.x,y:r.y,z:r.z}}else nt=Math.atan2(te,Gt);y=Wt/_,A=(p=f/_)*(1-h)*(S=1/Math.sqrt(1-h*(2-h)*p*p)),k=y*S,ot=0;do ot++,R=h*(O=c/Math.sqrt(1-h*k*k))/(O+(ct=f*A+Wt*k-O*(1-h*k*k))),j=(D=y*(S=1/Math.sqrt(1-R*(2-R)*p*p)))*A-(U=p*(1-R)*S)*k,A=U,k=D;while(j*j>1e-24&&ot<30);return yt=Math.atan(D/Math.abs(U)),{x:nt,y:yt,z:ct}}function dt(r,h,c){if(h===_i)return{x:r.x+c[0],y:r.y+c[1],z:r.z+c[2]};if(h===yi){var g=c[0],f=c[1],_=c[2],y=c[3],p=c[4],S=c[5],R=c[6];return{x:R*(r.x-S*r.y+p*r.z)+g,y:R*(S*r.x+r.y-y*r.z)+f,z:R*(-p*r.x+y*r.y+r.z)+_}}}function ht(r,h,c){if(h===_i)return{x:r.x-c[0],y:r.y-c[1],z:r.z-c[2]};if(h===yi){var g=c[0],f=c[1],_=c[2],y=c[3],p=c[4],S=c[5],R=c[6],O=(r.x-g)/R,A=(r.y-f)/R,k=(r.z-_)/R;return{x:O+S*A-p*k,y:-S*O+A+y*k,z:p*O-y*A+k}}}function Lt(r){return r===_i||r===yi}function B(r,h,c){if(r.grids===null||r.grids.length===0)return console.log("Grid shift grids not found"),-1;var g={x:-c.x,y:c.y},f={x:Number.NaN,y:Number.NaN},_=[];t:for(var y=0;yg.y||U>g.x||ot1e-12&&Math.abs(y.y)>1e-12);if(S<0)return console.log("Inverse grid shift iterator failed to converge."),g;g.x=J(_.x+c.ll[0]),g.y=_.y+c.ll[1]}else isNaN(_.x)||(g.x=r.x+_.x,g.y=r.y+_.y);return g}function _t(r,h){var c,g={x:r.x/h.del[0],y:r.y/h.del[1]},f={x:Math.floor(g.x),y:Math.floor(g.y)},_={x:g.x-1*f.x,y:g.y-1*f.y},y={x:Number.NaN,y:Number.NaN};if(f.x<0||f.x>=h.lim[0]||f.y<0||f.y>=h.lim[1])return y;c=f.y*h.lim[0]+f.x;var p={x:h.cvs[c][0],y:h.cvs[c][1]};c++;var S={x:h.cvs[c][0],y:h.cvs[c][1]};c+=h.lim[0];var R={x:h.cvs[c][0],y:h.cvs[c][1]};c--;var O={x:h.cvs[c][0],y:h.cvs[c][1]},A=_.x*_.y,k=_.x*(1-_.y),U=(1-_.x)*(1-_.y),D=(1-_.x)*_.y;return y.x=U*p.x+k*S.x+D*O.x+A*R.x,y.y=U*p.y+k*S.y+D*O.y+A*R.y,y}function Mt(r){if(typeof Number.isFinite=="function"){if(Number.isFinite(r))return;throw new TypeError("coordinates must be finite numbers")}if(typeof r!="number"||r!==r||!isFinite(r))throw new TypeError("coordinates must be finite numbers")}function Je(r,h){return(r.datum.datum_type===_i||r.datum.datum_type===yi||r.datum.datum_type===xi)&&h.datumCode!=="WGS84"||(h.datum.datum_type===_i||h.datum.datum_type===yi||h.datum.datum_type===xi)&&r.datumCode!=="WGS84"}function he(r,h,c,g){var f,_=(c=Array.isArray(c)?jl(c):{x:c.x,y:c.y,z:c.z,m:c.m}).z!==void 0;if(Lf(c),r.datum&&h.datum&&Je(r,h)&&(c=he(r,f=new tt("WGS84"),c,g),r=f),g&&r.axis!=="enu"&&(c=Wl(r,!1,c)),r.projName==="longlat")c={x:c.x*Ut,y:c.y*Ut,z:c.z||0};else if(r.to_meter&&(c={x:c.x*r.to_meter,y:c.y*r.to_meter,z:c.z||0}),!(c=r.inverse(c)))return;if(r.from_greenwich&&(c.x+=r.from_greenwich),c=bf(r.datum,h.datum,c))return h.from_greenwich&&(c={x:c.x-h.from_greenwich,y:c.y,z:c.z||0}),h.projName==="longlat"?c={x:c.x*wt,y:c.y*wt,z:c.z||0}:(c=h.forward(c),h.to_meter&&(c={x:c.x/h.to_meter,y:c.y/h.to_meter,z:c.z||0})),g&&h.axis!=="enu"?Wl(h,!0,c):(c&&!_&&delete c.z,c)}function Dt(r,h,c,g){var f,_,y;return Array.isArray(c)?(f=he(r,h,c,g)||{x:NaN,y:NaN},c.length>2?r.name!==void 0&&r.name==="geocent"||h.name!==void 0&&h.name==="geocent"?typeof f.z=="number"?[f.x,f.y,f.z].concat(c.splice(3)):[f.x,f.y,c[2]].concat(c.splice(3)):[f.x,f.y].concat(c.splice(2)):[f.x,f.y]):(_=he(r,h,c,g),(y=Object.keys(c)).length===2||y.forEach(function(p){if(r.name!==void 0&&r.name==="geocent"||h.name!==void 0&&h.name==="geocent"){if(p==="x"||p==="y"||p==="z")return}else if(p==="x"||p==="y")return;_[p]=c[p]}),_)}function Ie(r){return r instanceof tt?r:r.oProj?r.oProj:tt(r)}function Bt(r,h,c){r=Ie(r);var g,f=!1;return h===void 0?(h=r,r=Xl,f=!0):(h.x!==void 0||Array.isArray(h))&&(c=h,h=r,r=Xl,f=!0),h=Ie(h),c?Dt(r,h,c):(g={forward:function(_,y){return Dt(r,h,_,y)},inverse:function(_,y){return Dt(h,r,_,y)}},f&&(g.oProj=h),g)}function an(r,h){return h=h||5,Fn(hn({lat:r[1],lon:r[0]}),h)}function fi(r){var h=we(Qt(r.toUpperCase()));return h.lat&&h.lon?[h.lon,h.lat]:[(h.left+h.right)/2,(h.top+h.bottom)/2]}function Di(r){return r*(Math.PI/180)}function Ne(r){return r/Math.PI*180}function hn(r){var h,c,g,f,_,y,p,S=r.lat,R=r.lon,O=6378137,A=Di(S),k=Di(R);p=Math.floor((R+180)/6)+1,R===180&&(p=60),S>=56&&S<64&&R>=3&&R<12&&(p=32),S>=72&&S<84&&(R>=0&&R<9?p=31:R>=9&&R<21?p=33:R>=21&&R<33?p=35:R>=33&&R<42&&(p=37)),y=Di(6*(p-1)-180+3),h=O/Math.sqrt(1-.00669438*Math.sin(A)*Math.sin(A)),c=Math.tan(A)*Math.tan(A),g=.006739496752268451*Math.cos(A)*Math.cos(A);var U=.9996*h*((f=Math.cos(A)*(k-y))+(1-c+g)*f*f*f/6+(5-18*c+c*c+72*g-.39089081163157013)*f*f*f*f*f/120)+5e5,D=.9996*((_=O*(.9983242984503243*A-.002514607064228144*Math.sin(2*A)+2639046602129982e-21*Math.sin(4*A)-3418046101696858e-24*Math.sin(6*A)))+h*Math.tan(A)*(f*f/2+(5-c+9*g+4*g*g)*f*f*f*f/24+(61-58*c+c*c+600*g-2.2240339282485886)*f*f*f*f*f*f/720));return S<0&&(D+=1e7),{northing:Math.round(D),easting:Math.round(U),zoneNumber:p,zoneLetter:On(S)}}function we(r){var h=r.northing,c=r.easting,g=r.zoneLetter,f=r.zoneNumber;if(f<0||f>60)return null;var _,y,p,S,R,O,A,k,U=6378137,D=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),j=c-5e5,ot=h;g<"N"&&(ot-=1e7),O=6*(f-1)-180+3,k=(A=ot/.9996/6367449145945056e-9)+(3*D/2-27*D*D*D/32)*Math.sin(2*A)+(21*D*D/16-55*D*D*D*D/32)*Math.sin(4*A)+151*D*D*D/96*Math.sin(6*A),_=U/Math.sqrt(1-.00669438*Math.sin(k)*Math.sin(k)),y=Math.tan(k)*Math.tan(k),p=.006739496752268451*Math.cos(k)*Math.cos(k),S=.99330562*U/Math.pow(1-.00669438*Math.sin(k)*Math.sin(k),1.5),R=j/(.9996*_);var nt=k-_*Math.tan(k)/S*(R*R/2-(5+3*y+10*p-4*p*p-.06065547077041606)*R*R*R*R/24+(61+90*y+298*p+45*y*y-1.6983531815716497-3*p*p)*R*R*R*R*R*R/720);nt=Ne(nt);var yt=(R-(1+2*y+p)*R*R*R/6+(5-2*p+28*y-3*p*p+.05391597401814761+24*y*y)*R*R*R*R*R/120)/Math.cos(k);yt=O+Ne(yt);var ct;if(r.accuracy){var Gt=we({northing:r.northing+r.accuracy,easting:r.easting+r.accuracy,zoneLetter:r.zoneLetter,zoneNumber:r.zoneNumber});ct={top:Gt.lat,right:Gt.lon,bottom:nt,left:yt}}else ct={lat:nt,lon:yt};return ct}function On(r){var h="Z";return 84>=r&&r>=72?h="X":72>r&&r>=64?h="W":64>r&&r>=56?h="V":56>r&&r>=48?h="U":48>r&&r>=40?h="T":40>r&&r>=32?h="S":32>r&&r>=24?h="R":24>r&&r>=16?h="Q":16>r&&r>=8?h="P":8>r&&r>=0?h="N":0>r&&r>=-8?h="M":-8>r&&r>=-16?h="L":-16>r&&r>=-24?h="K":-24>r&&r>=-32?h="J":-32>r&&r>=-40?h="H":-40>r&&r>=-48?h="G":-48>r&&r>=-56?h="F":-56>r&&r>=-64?h="E":-64>r&&r>=-72?h="D":-72>r&&r>=-80&&(h="C"),h}function Fn(r,h){var c="00000"+r.easting,g="00000"+r.northing;return r.zoneNumber+r.zoneLetter+kn(r.easting,r.northing,r.zoneNumber)+c.substr(c.length-5,h)+g.substr(g.length-5,h)}function kn(r,h,c){var g=mi(c);return Ss(Math.floor(r/1e5),Math.floor(h/1e5)%20,g)}function mi(r){var h=r%Yl;return h===0&&(h=Yl),h}function Ss(r,h,c){var g=c-1,f=Kl.charCodeAt(g),_=ql.charCodeAt(g),y=f+r-1,p=_+h,S=!1;return y>bs&&(y=y-bs+Dn-1,S=!0),(y===ge||fge||(y>ge||fbe||(y>be||fbs&&(y=y-bs+Dn-1),p>ws?(p=p-ws+Dn-1,S=!0):S=!1,(p===ge||_ge||(p>ge||_be||(p>be||_ws&&(p=p-ws+Dn-1),String.fromCharCode(y)+String.fromCharCode(p)}function Qt(r){if(r&&r.length===0)throw"MGRSPoint coverting from nothing";for(var h,c=r.length,g=null,f="",_=0;!/[A-Z]/.test(h=r.charAt(_));){if(_>=2)throw"MGRSPoint bad conversion from: "+r;f+=h,_++}var y=parseInt(f,10);if(_===0||_+3>c)throw"MGRSPoint bad conversion from: "+r;var p=r.charAt(_++);if(p<="A"||p==="B"||p==="Y"||p>="Z"||p==="I"||p==="O")throw"MGRSPoint zone letter "+p+" not handled: "+r;g=r.substring(_,_+=2);for(var S=mi(y),R=me(g.charAt(0),S),O=ve(g.charAt(1),S);O()=>(t||s((t={exports:{}}).exports,t),t.exports);var Im=(s,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Sm(t))!Rm.call(s,n)&&n!==e&&hc(s,n,{get:()=>t[n],enumerable:!(i=Cm(t,n))||i.enumerable});return s};var ta=(s,t,e)=>(e=s!=null?vm(Tm(s)):{},Im(t||!s||!s.__esModule?hc(e,"default",{value:s,enumerable:!0}):e,s));var sd=lc((Ph,Oh)=>{(function(s,t){typeof Ph=="object"&&typeof Oh<"u"?Oh.exports=t():typeof define=="function"&&define.amd?define(t):s.proj4=t()})(Ph,function(){"use strict";function s(r,h){if(r[h])return r[h];for(var c,g=Object.keys(r),f=h.toLowerCase().replace(gn,""),_=-1;++_0?90:-90)):(r.lat0=a(r.lat1>0?90:-90),r.lat_ts=r.lat1)}function u(r){var h=this;if(arguments.length===2){var c=arguments[1];typeof c=="string"?c.charAt(0)==="+"?u[r]=Vt(arguments[1]):u[r]=Xl(arguments[1]):u[r]=c}else if(arguments.length===1){if(Array.isArray(r))return r.map(function(g){Array.isArray(g)?u.apply(h,g):u(g)});if(typeof r=="string"){if(r in u)return u[r]}else"EPSG"in r?u["EPSG:"+r.EPSG]=r:"ESRI"in r?u["ESRI:"+r.ESRI]=r:"IAU2000"in r?u["IAU2000:"+r.IAU2000]=r:console.log(r);return}}function d(r){return typeof r=="string"}function m(r){return r in u}function x(r){return Tf.some(function(h){return r.indexOf(h)>-1})}function E(r){var h=s(r,"authority");if(h){var c=s(h,"epsg");return c&&Rf.indexOf(c)>-1}}function C(r){var h=s(r,"extension");if(h)return s(h,"proj4")}function T(r){return r[0]==="+"}function w(r){if(!d(r))return r;if(m(r))return u[r];if(x(r)){var h=Xl(r);if(E(h))return u["EPSG:3857"];var c=C(h);return c?Vt(c):h}return T(r)?Vt(r):void 0}function M(r){return r}function v(r,h){var c=Lr.length;return r.names?(Lr[c]=r,r.names.forEach(function(g){br[g.toLowerCase()]=c}),this):(console.log(h),!0)}function I(r,h,c,g){var f=r*r,_=h*h,y=(f-_)/f,p=0;return g?(f=(r*=1-y*(dn+y*(fn+y*mn)))*r,y=0):p=Math.sqrt(y),{es:y,e:p,ep2:(f-_)/_}}function L(r,h,c,g,f){if(!r){var _=s(ht,g);_||(_=bf),r=_.a,h=_.b,c=_.rf}return c&&!h&&(h=(1-1/c)*r),(c===0||Math.abs(r-h)3&&(p.datum_params[3]===0&&p.datum_params[4]===0&&p.datum_params[5]===0&&p.datum_params[6]===0||(p.datum_type=Mi,p.datum_params[3]*=Bi,p.datum_params[4]*=Bi,p.datum_params[5]*=Bi,p.datum_params[6]=p.datum_params[6]/1e6+1))),y&&(p.datum_type=vi,p.grids=y),p.a=c,p.b=g,p.es=f,p.ep2=_,p}function P(r){return r===void 0?null:r.split(",").map(F)}function F(r){if(r.length===0)return null;var h=r[0]==="@";return h&&(r=r.slice(1)),r==="null"?{name:"null",mandatory:!h,grid:null,isNull:!0}:{name:r,mandatory:!h,grid:Kl[r]||null,isNull:!1}}function N(r){return r/3600*Math.PI/180}function G(r){var h=r.getInt32(8,!1);return h!==11&&((h=r.getInt32(8,!0))!==11&&console.warn("Failed to detect nadgrid endian-ness, defaulting to little-endian"),!0)}function W(r,h){return{nFields:r.getInt32(8,h),nSubgridFields:r.getInt32(24,h),nSubgrids:r.getInt32(40,h),shiftType:Y(r,56,64).trim(),fromSemiMajorAxis:r.getFloat64(120,h),fromSemiMinorAxis:r.getFloat64(136,h),toSemiMajorAxis:r.getFloat64(152,h),toSemiMinorAxis:r.getFloat64(168,h)}}function Y(r,h,c){return String.fromCharCode.apply(null,new Uint8Array(r.buffer.slice(h,c)))}function Z(r,h,c){for(var g=176,f=[],_=0;_5e-11)&&(r.datum_type===Ei?r.datum_params[0]===h.datum_params[0]&&r.datum_params[1]===h.datum_params[1]&&r.datum_params[2]===h.datum_params[2]:r.datum_type!==Mi||r.datum_params[0]===h.datum_params[0]&&r.datum_params[1]===h.datum_params[1]&&r.datum_params[2]===h.datum_params[2]&&r.datum_params[3]===h.datum_params[3]&&r.datum_params[4]===h.datum_params[4]&&r.datum_params[5]===h.datum_params[5]&&r.datum_params[6]===h.datum_params[6])}function K(r,h,c){var g,f,_,y,p=r.x,S=r.y,R=r.z?r.z:0;if(S<-z&&S>-1.001*z)S=-z;else if(S>z&&S<1.001*z)S=z;else{if(S<-z)return{x:-1/0,y:-1/0,z:r.z};if(S>z)return{x:1/0,y:1/0,z:r.z}}return p>Math.PI&&(p-=2*Math.PI),f=Math.sin(S),y=Math.cos(S),_=f*f,g=c/Math.sqrt(1-h*_),{x:(g+R)*y*Math.cos(p),y:(g+R)*y*Math.sin(p),z:(g*(1-h)+R)*f}}function H(r,h,c,g){var f,_,y,p,S,R,O,A,k,B,D,j,ot,nt,yt,ct,Gt=r.x,te=r.y,Wt=r.z?r.z:0;if(f=Math.sqrt(Gt*Gt+te*te),_=Math.sqrt(Gt*Gt+te*te+Wt*Wt),f/c<1e-12){if(nt=0,_/c<1e-12)return yt=z,ct=-g,{x:r.x,y:r.y,z:r.z}}else nt=Math.atan2(te,Gt);y=Wt/_,A=(p=f/_)*(1-h)*(S=1/Math.sqrt(1-h*(2-h)*p*p)),k=y*S,ot=0;do ot++,R=h*(O=c/Math.sqrt(1-h*k*k))/(O+(ct=f*A+Wt*k-O*(1-h*k*k))),j=(D=y*(S=1/Math.sqrt(1-R*(2-R)*p*p)))*A-(B=p*(1-R)*S)*k,A=B,k=D;while(j*j>1e-24&&ot<30);return yt=Math.atan(D/Math.abs(B)),{x:nt,y:yt,z:ct}}function dt(r,h,c){if(h===Ei)return{x:r.x+c[0],y:r.y+c[1],z:r.z+c[2]};if(h===Mi){var g=c[0],f=c[1],_=c[2],y=c[3],p=c[4],S=c[5],R=c[6];return{x:R*(r.x-S*r.y+p*r.z)+g,y:R*(S*r.x+r.y-y*r.z)+f,z:R*(-p*r.x+y*r.y+r.z)+_}}}function lt(r,h,c){if(h===Ei)return{x:r.x-c[0],y:r.y-c[1],z:r.z-c[2]};if(h===Mi){var g=c[0],f=c[1],_=c[2],y=c[3],p=c[4],S=c[5],R=c[6],O=(r.x-g)/R,A=(r.y-f)/R,k=(r.z-_)/R;return{x:O+S*A-p*k,y:-S*O+A+y*k,z:p*O-y*A+k}}}function At(r){return r===Ei||r===Mi}function U(r,h,c){if(r.grids===null||r.grids.length===0)return console.log("Grid shift grids not found"),-1;var g={x:-c.x,y:c.y},f={x:Number.NaN,y:Number.NaN},_=[];t:for(var y=0;yg.y||B>g.x||ot1e-12&&Math.abs(y.y)>1e-12);if(S<0)return console.log("Inverse grid shift iterator failed to converge."),g;g.x=J(_.x+c.ll[0]),g.y=_.y+c.ll[1]}else isNaN(_.x)||(g.x=r.x+_.x,g.y=r.y+_.y);return g}function _t(r,h){var c,g={x:r.x/h.del[0],y:r.y/h.del[1]},f={x:Math.floor(g.x),y:Math.floor(g.y)},_={x:g.x-1*f.x,y:g.y-1*f.y},y={x:Number.NaN,y:Number.NaN};if(f.x<0||f.x>=h.lim[0]||f.y<0||f.y>=h.lim[1])return y;c=f.y*h.lim[0]+f.x;var p={x:h.cvs[c][0],y:h.cvs[c][1]};c++;var S={x:h.cvs[c][0],y:h.cvs[c][1]};c+=h.lim[0];var R={x:h.cvs[c][0],y:h.cvs[c][1]};c--;var O={x:h.cvs[c][0],y:h.cvs[c][1]},A=_.x*_.y,k=_.x*(1-_.y),B=(1-_.x)*(1-_.y),D=(1-_.x)*_.y;return y.x=B*p.x+k*S.x+D*O.x+A*R.x,y.y=B*p.y+k*S.y+D*O.y+A*R.y,y}function Mt(r){if(typeof Number.isFinite=="function"){if(Number.isFinite(r))return;throw new TypeError("coordinates must be finite numbers")}if(typeof r!="number"||r!==r||!isFinite(r))throw new TypeError("coordinates must be finite numbers")}function ti(r,h){return(r.datum.datum_type===Ei||r.datum.datum_type===Mi||r.datum.datum_type===vi)&&h.datumCode!=="WGS84"||(h.datum.datum_type===Ei||h.datum.datum_type===Mi||h.datum.datum_type===vi)&&r.datumCode!=="WGS84"}function he(r,h,c,g){var f,_=(c=Array.isArray(c)?Vl(c):{x:c.x,y:c.y,z:c.z,m:c.m}).z!==void 0;if(Af(c),r.datum&&h.datum&&ti(r,h)&&(c=he(r,f=new tt("WGS84"),c,g),r=f),g&&r.axis!=="enu"&&(c=ql(r,!1,c)),r.projName==="longlat")c={x:c.x*Bt,y:c.y*Bt,z:c.z||0};else if(r.to_meter&&(c={x:c.x*r.to_meter,y:c.y*r.to_meter,z:c.z||0}),!(c=r.inverse(c)))return;if(r.from_greenwich&&(c.x+=r.from_greenwich),c=Lf(r.datum,h.datum,c))return h.from_greenwich&&(c={x:c.x-h.from_greenwich,y:c.y,z:c.z||0}),h.projName==="longlat"?c={x:c.x*bt,y:c.y*bt,z:c.z||0}:(c=h.forward(c),h.to_meter&&(c={x:c.x/h.to_meter,y:c.y/h.to_meter,z:c.z||0})),g&&h.axis!=="enu"?ql(h,!0,c):(c&&!_&&delete c.z,c)}function Dt(r,h,c,g){var f,_,y;return Array.isArray(c)?(f=he(r,h,c,g)||{x:NaN,y:NaN},c.length>2?r.name!==void 0&&r.name==="geocent"||h.name!==void 0&&h.name==="geocent"?typeof f.z=="number"?[f.x,f.y,f.z].concat(c.splice(3)):[f.x,f.y,c[2]].concat(c.splice(3)):[f.x,f.y].concat(c.splice(2)):[f.x,f.y]):(_=he(r,h,c,g),(y=Object.keys(c)).length===2||y.forEach(function(p){if(r.name!==void 0&&r.name==="geocent"||h.name!==void 0&&h.name==="geocent"){if(p==="x"||p==="y"||p==="z")return}else if(p==="x"||p==="y")return;_[p]=c[p]}),_)}function Ie(r){return r instanceof tt?r:r.oProj?r.oProj:tt(r)}function Ut(r,h,c){r=Ie(r);var g,f=!1;return h===void 0?(h=r,r=Hl,f=!0):(h.x!==void 0||Array.isArray(h))&&(c=h,h=r,r=Hl,f=!0),h=Ie(h),c?Dt(r,h,c):(g={forward:function(_,y){return Dt(r,h,_,y)},inverse:function(_,y){return Dt(h,r,_,y)}},f&&(g.oProj=h),g)}function ln(r,h){return h=h||5,Dn(cn({lat:r[1],lon:r[0]}),h)}function pi(r){var h=we(Qt(r.toUpperCase()));return h.lat&&h.lon?[h.lon,h.lat]:[(h.left+h.right)/2,(h.top+h.bottom)/2]}function zi(r){return r*(Math.PI/180)}function De(r){return r/Math.PI*180}function cn(r){var h,c,g,f,_,y,p,S=r.lat,R=r.lon,O=6378137,A=zi(S),k=zi(R);p=Math.floor((R+180)/6)+1,R===180&&(p=60),S>=56&&S<64&&R>=3&&R<12&&(p=32),S>=72&&S<84&&(R>=0&&R<9?p=31:R>=9&&R<21?p=33:R>=21&&R<33?p=35:R>=33&&R<42&&(p=37)),y=zi(6*(p-1)-180+3),h=O/Math.sqrt(1-.00669438*Math.sin(A)*Math.sin(A)),c=Math.tan(A)*Math.tan(A),g=.006739496752268451*Math.cos(A)*Math.cos(A);var B=.9996*h*((f=Math.cos(A)*(k-y))+(1-c+g)*f*f*f/6+(5-18*c+c*c+72*g-.39089081163157013)*f*f*f*f*f/120)+5e5,D=.9996*((_=O*(.9983242984503243*A-.002514607064228144*Math.sin(2*A)+2639046602129982e-21*Math.sin(4*A)-3418046101696858e-24*Math.sin(6*A)))+h*Math.tan(A)*(f*f/2+(5-c+9*g+4*g*g)*f*f*f*f/24+(61-58*c+c*c+600*g-2.2240339282485886)*f*f*f*f*f*f/720));return S<0&&(D+=1e7),{northing:Math.round(D),easting:Math.round(B),zoneNumber:p,zoneLetter:Nn(S)}}function we(r){var h=r.northing,c=r.easting,g=r.zoneLetter,f=r.zoneNumber;if(f<0||f>60)return null;var _,y,p,S,R,O,A,k,B=6378137,D=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),j=c-5e5,ot=h;g<"N"&&(ot-=1e7),O=6*(f-1)-180+3,k=(A=ot/.9996/6367449145945056e-9)+(3*D/2-27*D*D*D/32)*Math.sin(2*A)+(21*D*D/16-55*D*D*D*D/32)*Math.sin(4*A)+151*D*D*D/96*Math.sin(6*A),_=B/Math.sqrt(1-.00669438*Math.sin(k)*Math.sin(k)),y=Math.tan(k)*Math.tan(k),p=.006739496752268451*Math.cos(k)*Math.cos(k),S=.99330562*B/Math.pow(1-.00669438*Math.sin(k)*Math.sin(k),1.5),R=j/(.9996*_);var nt=k-_*Math.tan(k)/S*(R*R/2-(5+3*y+10*p-4*p*p-.06065547077041606)*R*R*R*R/24+(61+90*y+298*p+45*y*y-1.6983531815716497-3*p*p)*R*R*R*R*R*R/720);nt=De(nt);var yt=(R-(1+2*y+p)*R*R*R/6+(5-2*p+28*y-3*p*p+.05391597401814761+24*y*y)*R*R*R*R*R/120)/Math.cos(k);yt=O+De(yt);var ct;if(r.accuracy){var Gt=we({northing:r.northing+r.accuracy,easting:r.easting+r.accuracy,zoneLetter:r.zoneLetter,zoneNumber:r.zoneNumber});ct={top:Gt.lat,right:Gt.lon,bottom:nt,left:yt}}else ct={lat:nt,lon:yt};return ct}function Nn(r){var h="Z";return 84>=r&&r>=72?h="X":72>r&&r>=64?h="W":64>r&&r>=56?h="V":56>r&&r>=48?h="U":48>r&&r>=40?h="T":40>r&&r>=32?h="S":32>r&&r>=24?h="R":24>r&&r>=16?h="Q":16>r&&r>=8?h="P":8>r&&r>=0?h="N":0>r&&r>=-8?h="M":-8>r&&r>=-16?h="L":-16>r&&r>=-24?h="K":-24>r&&r>=-32?h="J":-32>r&&r>=-40?h="H":-40>r&&r>=-48?h="G":-48>r&&r>=-56?h="F":-56>r&&r>=-64?h="E":-64>r&&r>=-72?h="D":-72>r&&r>=-80&&(h="C"),h}function Dn(r,h){var c="00000"+r.easting,g="00000"+r.northing;return r.zoneNumber+r.zoneLetter+Gn(r.easting,r.northing,r.zoneNumber)+c.substr(c.length-5,h)+g.substr(g.length-5,h)}function Gn(r,h,c){var g=_i(c);return ws(Math.floor(r/1e5),Math.floor(h/1e5)%20,g)}function _i(r){var h=r%Zl;return h===0&&(h=Zl),h}function ws(r,h,c){var g=c-1,f=Jl.charCodeAt(g),_=$l.charCodeAt(g),y=f+r-1,p=_+h,S=!1;return y>Os&&(y=y-Os+Un-1,S=!0),(y===ge||fge||(y>ge||fbe||(y>be||fOs&&(y=y-Os+Un-1),p>Ps?(p=p-Ps+Un-1,S=!0):S=!1,(p===ge||_ge||(p>ge||_be||(p>be||_Ps&&(p=p-Ps+Un-1),String.fromCharCode(y)+String.fromCharCode(p)}function Qt(r){if(r&&r.length===0)throw"MGRSPoint coverting from nothing";for(var h,c=r.length,g=null,f="",_=0;!/[A-Z]/.test(h=r.charAt(_));){if(_>=2)throw"MGRSPoint bad conversion from: "+r;f+=h,_++}var y=parseInt(f,10);if(_===0||_+3>c)throw"MGRSPoint bad conversion from: "+r;var p=r.charAt(_++);if(p<="A"||p==="B"||p==="Y"||p>="Z"||p==="I"||p==="O")throw"MGRSPoint zone letter "+p+" not handled: "+r;g=r.substring(_,_+=2);for(var S=_i(y),R=me(g.charAt(0),S),O=ve(g.charAt(1),S);O0&&(k=1e5/Math.pow(10,nt),U=r.substring(_,_+nt),yt=parseFloat(U)*k,D=r.substring(_+nt),ct=parseFloat(D)*k),j=yt+R,ot=ct+O,{easting:j,northing:ot,zoneLetter:p,zoneNumber:y,accuracy:k}}function me(r,h){for(var c=Kl.charCodeAt(h-1),g=1e5,f=!1;c!==r.charCodeAt(0);){if(++c===ge&&c++,c===be&&c++,c>bs){if(f)throw"Bad character: "+r;c=Dn,f=!0}g+=1e5}return g}function ve(r,h){if(r>"V")throw"MGRSPoint given invalid Northing "+r;for(var c=ql.charCodeAt(h-1),g=0,f=!1;c!==r.charCodeAt(0);){if(++c===ge&&c++,c===be&&c++,c>ws){if(f)throw"Bad character: "+r;c=Dn,f=!0}g+=1e5}return g}function De(r){var h;switch(r){case"C":h=11e5;break;case"D":h=2e6;break;case"E":h=28e5;break;case"F":h=37e5;break;case"G":h=46e5;break;case"H":h=55e5;break;case"J":h=64e5;break;case"K":h=73e5;break;case"L":h=82e5;break;case"M":h=91e5;break;case"N":h=0;break;case"P":h=8e5;break;case"Q":h=17e5;break;case"R":h=26e5;break;case"S":h=35e5;break;case"T":h=44e5;break;case"U":h=53e5;break;case"V":h=62e5;break;case"W":h=7e6;break;case"X":h=79e5;break;default:h=-1}if(h>=0)return h;throw"Invalid zone letter: "+r}function Ce(r,h,c){if(!(this instanceof Ce))return new Ce(r,h,c);if(Array.isArray(r))this.x=r[0],this.y=r[1],this.z=r[2]||0;else if(typeof r=="object")this.x=r.x,this.y=r.y,this.z=r.z||0;else if(typeof r=="string"&&h===void 0){var g=r.split(",");this.x=parseFloat(g[0],10),this.y=parseFloat(g[1],10),this.z=parseFloat(g[2],10)||0}else this.x=r,this.y=h,this.z=c||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}function gi(r){var h=["Hotine_Oblique_Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin"],c=typeof r.PROJECTION=="object"?Object.keys(r.PROJECTION)[0]:r.PROJECTION;return"no_uoff"in r||"no_off"in r||h.indexOf(c)!==-1}function $e(r){var h,c=[];return c[0]=r*Kf,h=r*r,c[0]+=h*qf,c[1]=h*Hf,h*=r,c[0]+=h*Vf,c[1]+=h*Zf,c[2]=h*Jf,c}function Gi(r,h){var c=r+r;return r+h[0]*Math.sin(c)+h[1]*Math.sin(c+c)+h[2]*Math.sin(c+c+c)}function pi(r,h,c,g){var f;return rmt&&f<=z+mt?(g.value=vt.AREA_1,f-=z):f>z+mt||f<=-(z+mt)?(g.value=vt.AREA_2,f=f>=0?f-xt:f+xt):(g.value=vt.AREA_3,f+=z)),f}function kt(r,h){var c=r+h;return c<-xt?c+=qt:c>+xt&&(c-=qt),c}function Ts(r,h,c,g){for(var f=h;g;--g){var _=r(f);if(f-=_,Math.abs(_)=this.text.length)return;r=this.text[this.place++]}switch(this.state){case Ht:return this.neutral(r);case 2:return this.keyword(r);case 4:return this.quoted(r);case 5:return this.afterquote(r);case 3:return this.number(r);case-1:return}},t.prototype.afterquote=function(r){if(r==='"')return this.word+='"',void(this.state=4);if(vr.test(r))return this.word=this.word.trim(),void this.afterItem(r);throw new Error(`havn't handled "`+r+'" in afterquote yet, index '+this.place)},t.prototype.afterItem=function(r){return r===","?(this.word!==null&&this.currentObject.push(this.word),this.word=null,void(this.state=Ht)):r==="]"?(this.level--,this.word!==null&&(this.currentObject.push(this.word),this.word=null),this.state=Ht,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},t.prototype.number=function(r){if(!Gl.test(r)){if(vr.test(r))return this.word=parseFloat(this.word),void this.afterItem(r);throw new Error(`havn't handled "`+r+'" in number yet, index '+this.place)}this.word+=r},t.prototype.quoted=function(r){r!=='"'?this.word+=r:this.state=5},t.prototype.keyword=function(r){if(vf.test(r))this.word+=r;else{if(r==="["){var h=[];return h.push(this.word),this.level++,this.root===null?this.root=h:this.currentObject.push(h),this.stack.push(this.currentObject),this.currentObject=h,void(this.state=Ht)}if(!vr.test(r))throw new Error(`havn't handled "`+r+'" in keyword yet, index '+this.place);this.afterItem(r)}},t.prototype.neutral=function(r){if(Xo.test(r))return this.word=r,void(this.state=2);if(r==='"')return this.word="",void(this.state=4);if(Gl.test(r))return this.word=r,void(this.state=3);{if(!vr.test(r))throw new Error(`havn't handled "`+r+'" in neutral yet, index '+this.place);this.afterItem(r)}},t.prototype.output=function(){for(;this.place90&&c*wt<-90&&h*wt>180&&h*wt<-180)return null;var g,f;if(Math.abs(Math.abs(c)-z)<=X)return null;if(this.sphere)g=this.x0+this.a*this.k0*J(h-this.long0),f=this.y0+this.a*this.k0*Math.log(Math.tan(mt+.5*c));else{var _=Math.sin(c),y=ze(this.e,c,_);g=this.x0+this.a*this.k0*J(h-this.long0),f=this.y0-this.a*this.k0*Math.log(y)}return r.x=g,r.y=f,r},inverse:function(r){var h,c,g=r.x-this.x0,f=r.y-this.y0;if(this.sphere)c=z-2*Math.atan(Math.exp(-f/(this.a*this.k0)));else{var _=Math.exp(-f/(this.a*this.k0));if((c=Is(this.e,_))===-9999)return null}return h=J(this.long0+g/(this.a*this.k0)),r.x=h,r.y=c,r},names:["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{init:function(){},forward:M,inverse:M,names:["longlat","identity"]}],Cr={},Sr=[],If={start:function(){Rf.forEach(v)},add:v,get:function(r){if(!r)return!1;var h=r.toLowerCase();return Cr[h]!==void 0&&Sr[Cr[h]]?Sr[Cr[h]]:void 0}},at={};at.MERIT={a:6378137,rf:298.257,ellipseName:"MERIT 1983"},at.SGS85={a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},at.GRS80={a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},at.IAU76={a:6378140,rf:298.257,ellipseName:"IAU 1976"},at.airy={a:6377563396e-3,b:635625691e-2,ellipseName:"Airy 1830"},at.APL4={a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},at.NWL9D={a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},at.mod_airy={a:6377340189e-3,b:6356034446e-3,ellipseName:"Modified Airy"},at.andrae={a:637710443e-2,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},at.aust_SA={a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},at.GRS67={a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},at.bessel={a:6377397155e-3,rf:299.1528128,ellipseName:"Bessel 1841"},at.bess_nam={a:6377483865e-3,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},at.clrk66={a:63782064e-1,b:63565838e-1,ellipseName:"Clarke 1866"},at.clrk80={a:6378249145e-3,rf:293.4663,ellipseName:"Clarke 1880 mod."},at.clrk80ign={a:63782492e-1,b:6356515,rf:293.4660213,ellipseName:"Clarke 1880 (IGN)"},at.clrk58={a:6378293645208759e-9,rf:294.2606763692654,ellipseName:"Clarke 1858"},at.CPM={a:63757387e-1,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},at.delmbr={a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},at.engelis={a:637813605e-2,rf:298.2566,ellipseName:"Engelis 1985"},at.evrst30={a:6377276345e-3,rf:300.8017,ellipseName:"Everest 1830"},at.evrst48={a:6377304063e-3,rf:300.8017,ellipseName:"Everest 1948"},at.evrst56={a:6377301243e-3,rf:300.8017,ellipseName:"Everest 1956"},at.evrst69={a:6377295664e-3,rf:300.8017,ellipseName:"Everest 1969"},at.evrstSS={a:6377298556e-3,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},at.fschr60={a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},at.fschr60m={a:6378155,rf:298.3,ellipseName:"Fischer 1960"},at.fschr68={a:6378150,rf:298.3,ellipseName:"Fischer 1968"},at.helmert={a:6378200,rf:298.3,ellipseName:"Helmert 1906"},at.hough={a:6378270,rf:297,ellipseName:"Hough"},at.intl={a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},at.kaula={a:6378163,rf:298.24,ellipseName:"Kaula 1961"},at.lerch={a:6378139,rf:298.257,ellipseName:"Lerch 1979"},at.mprts={a:6397300,rf:191,ellipseName:"Maupertius 1738"},at.new_intl={a:63781575e-1,b:63567722e-1,ellipseName:"New International 1967"},at.plessis={a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},at.krass={a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},at.SEasia={a:6378155,b:63567733205e-4,ellipseName:"Southeast Asia"},at.walbeck={a:6376896,b:63558348467e-4,ellipseName:"Walbeck"},at.WGS60={a:6378165,rf:298.3,ellipseName:"WGS 60"},at.WGS66={a:6378145,rf:298.25,ellipseName:"WGS 66"},at.WGS7={a:6378135,rf:298.26,ellipseName:"WGS 72"};var wf=at.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"};at.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"};var Zt={};Zt.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},Zt.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},Zt.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},Zt.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},Zt.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},Zt.potsdam={towgs84:"598.1,73.7,418.2,0.202,0.045,-2.455,6.7",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},Zt.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},Zt.hermannskogel={towgs84:"577.326,90.129,463.919,5.137,1.474,5.297,2.4232",ellipse:"bessel",datumName:"Hermannskogel"},Zt.osni52={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"airy",datumName:"Irish National"},Zt.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},Zt.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},Zt.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},Zt.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},Zt.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},Zt.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},Zt.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},Zt.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"};var Ul={};tt.projections=If,tt.projections.start();var bf=function(r,h,c){if(q(r,h)||r.datum_type===ln||h.datum_type===ln)return c;var g=r.a,f=r.es;if(r.datum_type===xi){if(B(r,!1,c)!==0)return;g=6378137,f=.0066943799901413165}var _=h.a,y=h.b,p=h.es;return h.datum_type===xi&&(_=6378137,y=6356752314e-3,p=.0066943799901413165),f!==p||g!==_||Lt(r.datum_type)||Lt(h.datum_type)?(c=K(c,f,g),Lt(r.datum_type)&&(c=dt(c,r.datum_type,r.datum_params)),Lt(h.datum_type)&&(c=ht(c,h.datum_type,h.datum_params)),c=V(c,p,_,y),h.datum_type!==xi||B(h,!0,c)===0?c:void 0):c},Wl=function(r,h,c){var g,f,_,y=c.x,p=c.y,S=c.z||0,R={};for(_=0;_<3;_++)if(!h||_!==2||c.z!==void 0)switch(_===0?(g=y,f="ew".indexOf(r.axis[_])!==-1?"x":"y"):_===1?(g=p,f="ns".indexOf(r.axis[_])!==-1?"y":"x"):(g=S,f="z"),r.axis[_]){case"e":R[f]=g;break;case"w":R[f]=-g;break;case"n":R[f]=g;break;case"s":R[f]=-g;break;case"u":c[f]!==void 0&&(R.z=g);break;case"d":c[f]!==void 0&&(R.z=-g);break;default:return null}return R},jl=function(r){var h={x:r[0],y:r[1]};return r.length>2&&(h.z=r[2]),r.length>3&&(h.m=r[3]),h},Lf=function(r){Mt(r.x),Mt(r.y)},Xl=tt("WGS84"),Yl=6,Kl="AJSAJS",ql="AFAFAF",Dn=65,ge=73,be=79,ws=86,bs=90,Af={forward:an,inverse:function(r){var h=we(Qt(r.toUpperCase()));return h.lat&&h.lon?[h.lon,h.lat,h.lon,h.lat]:[h.left,h.bottom,h.right,h.top]},toPoint:fi};Ce.fromMGRS=function(r){return new Ce(fi(r))},Ce.prototype.toMGRS=function(r){return an([this.x,this.y],r)};var Vl=.01068115234375,Hl=function(r){var h=[];h[0]=1-r*(.25+r*(.046875+r*(.01953125+r*Vl))),h[1]=r*(.75-r*(.046875+r*(.01953125+r*Vl)));var c=r*r;return h[2]=c*(.46875-r*(.013020833333333334+.007120768229166667*r)),c*=r,h[3]=c*(.3645833333333333-.005696614583333333*r),h[4]=c*r*.3076171875,h},Tr=function(r,h,c,g){return c*=h,h*=h,g[0]*r-c*(g[1]+h*(g[2]+h*(g[3]+h*g[4])))},Zl=function(r,h,c){for(var g=1/(1-h),f=r,_=20;_;--_){var y=Math.sin(f),p=1-h*y*y;if(p=(Tr(f,y,Math.cos(f),c)-r)*(p*Math.sqrt(p))*g,f-=p,Math.abs(p)X?Math.tan(_):0,D=Math.pow(U,2),j=Math.pow(D,2);h=1-this.es*Math.pow(p,2),R/=Math.sqrt(h);var ot=Tr(_,p,S,this.en);c=this.a*(this.k0*R*(1+O/6*(1-D+A+O/20*(5-18*D+j+14*A-58*D*A+O/42*(61+179*j-j*D-479*D)))))+this.x0,g=this.a*(this.k0*(ot-this.ml0+p*y*R/2*(1+O/12*(5-D+9*A+4*k+O/30*(61+j-58*D+270*A-330*D*A+O/56*(1385+543*j-j*D-3111*D))))))+this.y0}else{var nt=S*Math.sin(y);if(Math.abs(Math.abs(nt)-1)=1){if(nt-1>X)return 93;g=0}else g=Math.acos(g);_<0&&(g=-g),g=this.a*this.k0*(g-this.lat0)+this.y0}return r.x=c,r.y=g,r},inverse:function(r){var h,c,g,f,_=(r.x-this.x0)*(1/this.a),y=(r.y-this.y0)*(1/this.a);if(this.es)if(h=this.ml0+y/this.k0,c=Zl(h,this.es,this.en),Math.abs(c)X?Math.tan(c):0,O=this.ep2*Math.pow(S,2),A=Math.pow(O,2),k=Math.pow(R,2),U=Math.pow(k,2);h=1-this.es*Math.pow(p,2);var D=_*Math.sqrt(h)/this.k0,j=Math.pow(D,2);g=c-(h*=R)*j/(1-this.es)*.5*(1-j/12*(5+3*k-9*O*k+O-4*A-j/30*(61+90*k-252*O*k+45*U+46*O-j/56*(1385+3633*k+4095*U+1574*U*k)))),f=J(this.long0+D*(1-j/6*(1+2*k+O-j/20*(5+28*k+24*U+8*O*k+6*O-j/42*(61+662*k+1320*U+720*U*k))))/S)}else g=z*Rs(y),f=0;else{var ot=Math.exp(_/this.k0),nt=.5*(ot-1/ot),yt=this.lat0+y/this.k0,ct=Math.cos(yt);h=Math.sqrt((1-Math.pow(ct,2))/(1+Math.pow(nt,2))),g=Math.asin(h),y<0&&(g=-g),f=nt===0&&ct===0?0:J(Math.atan2(nt,ct)+this.long0)}return r.x=f,r.y=g,r},names:["Fast_Transverse_Mercator","Fast Transverse Mercator"]},Jl=function(r){var h=Math.exp(r);return h=(h-1/h)/2},Be=function(r,h){r=Math.abs(r),h=Math.abs(h);var c=Math.max(r,h),g=Math.min(r,h)/(c||1);return c*Math.sqrt(1+Math.pow(g,2))},Pf=function(r){var h=1+r,c=h-1;return c===0?r:r*Math.log(h)/c},Of=function(r){var h=Math.abs(r);return h=Pf(h*(1+h/(Be(1,h)+1))),r<0?-h:h},Yo=function(r,h){for(var c,g=2*Math.cos(2*h),f=r.length-1,_=r[f],y=0;--f>=0;)c=g*_-y+r[f],y=_,_=c;return h+c*Math.sin(2*h)},Ff=function(r,h){for(var c,g=2*Math.cos(h),f=r.length-1,_=r[f],y=0;--f>=0;)c=g*_-y+r[f],y=_,_=c;return Math.sin(h)*c},kf=function(r){var h=Math.exp(r);return h=(h+1/h)/2},$l=function(r,h,c){for(var g,f,_=Math.sin(h),y=Math.cos(h),p=Jl(c),S=kf(c),R=2*y*S,O=-2*_*p,A=r.length-1,k=r[A],U=0,D=0,j=0;--A>=0;)g=D,f=U,k=R*(D=k)-g-O*(U=j)+r[A],j=O*D-f+R*U;return R=_*S,O=y*p,[R*k-O*j,R*j+O*k]},Ir={init:function(){if(!this.approx&&(isNaN(this.es)||this.es<=0))throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.');this.approx&&(Rr.init.apply(this),this.forward=Rr.forward,this.inverse=Rr.inverse),this.x0=this.x0!==void 0?this.x0:0,this.y0=this.y0!==void 0?this.y0:0,this.long0=this.long0!==void 0?this.long0:0,this.lat0=this.lat0!==void 0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var r=this.es/(1+Math.sqrt(1-this.es)),h=r/(2-r),c=h;this.cgb[0]=h*(2+h*(-2/3+h*(h*(116/45+h*(26/45+h*(-2854/675)))-2))),this.cbg[0]=h*(h*(2/3+h*(4/3+h*(-82/45+h*(32/45+h*(4642/4725)))))-2),c*=h,this.cgb[1]=c*(7/3+h*(h*(-227/45+h*(2704/315+h*(2323/945)))-1.6)),this.cbg[1]=c*(5/3+h*(-16/15+h*(-13/9+h*(904/315+h*(-1522/945))))),c*=h,this.cgb[2]=c*(56/15+h*(-136/35+h*(-1262/105+h*(73814/2835)))),this.cbg[2]=c*(-26/15+h*(34/21+h*(1.6+h*(-12686/2835)))),c*=h,this.cgb[3]=c*(4279/630+h*(-332/35+h*(-399572/14175))),this.cbg[3]=c*(1237/630+h*(h*(-24832/14175)-2.4)),c*=h,this.cgb[4]=c*(4174/315+h*(-144838/6237)),this.cbg[4]=c*(-734/315+h*(109598/31185)),c*=h,this.cgb[5]=c*(601676/22275),this.cbg[5]=c*(444337/155925),c=Math.pow(h,2),this.Qn=this.k0/(1+h)*(1+c*(.25+c*(1/64+c/256))),this.utg[0]=h*(h*(2/3+h*(-37/96+h*(1/360+h*(81/512+h*(-96199/604800)))))-.5),this.gtu[0]=h*(.5+h*(-2/3+h*(5/16+h*(41/180+h*(-127/288+h*(7891/37800)))))),this.utg[1]=c*(-1/48+h*(-1/15+h*(437/1440+h*(-46/105+h*(1118711/3870720))))),this.gtu[1]=c*(13/48+h*(h*(557/1440+h*(281/630+h*(-1983433/1935360)))-.6)),c*=h,this.utg[2]=c*(-17/480+h*(37/840+h*(209/4480+h*(-5569/90720)))),this.gtu[2]=c*(61/240+h*(-103/140+h*(15061/26880+h*(167603/181440)))),c*=h,this.utg[3]=c*(-4397/161280+h*(11/504+h*(830251/7257600))),this.gtu[3]=c*(49561/161280+h*(-179/168+h*(6601661/7257600))),c*=h,this.utg[4]=c*(-4583/161280+h*(108847/3991680)),this.gtu[4]=c*(34729/80640+h*(-3418889/1995840)),c*=h,this.utg[5]=-.03233083094085698*c,this.gtu[5]=.6650675310896665*c;var g=Yo(this.cbg,this.lat0);this.Zb=-this.Qn*(g+Ff(this.gtu,2*g))},forward:function(r){var h=J(r.x-this.long0),c=r.y;c=Yo(this.cbg,c);var g=Math.sin(c),f=Math.cos(c),_=Math.sin(h),y=Math.cos(h);c=Math.atan2(g,y*f),h=Math.atan2(_*f,Be(g,f*y)),h=Of(Math.tan(h));var p=$l(this.gtu,2*c,2*h);c+=p[0],h+=p[1];var S,R;return Math.abs(h)<=2.623395162778?(S=this.a*(this.Qn*h)+this.x0,R=this.a*(this.Qn*c+this.Zb)+this.y0):(S=1/0,R=1/0),r.x=S,r.y=R,r},inverse:function(r){var h=(r.x-this.x0)*(1/this.a),c=(r.y-this.y0)*(1/this.a);c=(c-this.Zb)/this.Qn,h/=this.Qn;var g,f;if(Math.abs(h)<=2.623395162778){var _=$l(this.utg,2*c,2*h);c+=_[0],h+=_[1],h=Math.atan(Jl(h));var y=Math.sin(c),p=Math.cos(c),S=Math.sin(h),R=Math.cos(h);c=Math.atan2(y*R,Be(S,R*p)),h=Math.atan2(S,R*p),g=J(h+this.long0),f=Yo(this.cgb,c)}else g=1/0,f=1/0;return r.x=g,r.y=f,r},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc","Transverse_Mercator","Transverse Mercator","tmerc"]},Nf=function(r,h){if(r===void 0){if((r=Math.floor(30*(J(h)+Math.PI)/Math.PI)+1)<0)return 0;if(r>60)return 60}return r},Df={init:function(){var r=Nf(this.zone,this.long0);if(r===void 0)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(r)-183)*Ut,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,Ir.init.apply(this),this.forward=Ir.forward,this.inverse=Ir.inverse},names:["Universal Transverse Mercator System","utm"],dependsOn:"etmerc"},Ko=function(r,h){return Math.pow((1-r)/(1+r),h)},Gf=20,qo={init:function(){var r=Math.sin(this.lat0),h=Math.cos(this.lat0);h*=h,this.rc=Math.sqrt(1-this.es)/(1-this.es*r*r),this.C=Math.sqrt(1+this.es*h*h/(1-this.es)),this.phic0=Math.asin(r/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+mt)/(Math.pow(Math.tan(.5*this.lat0+mt),this.C)*Ko(this.e*r,this.ratexp))},forward:function(r){var h=r.x,c=r.y;return r.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*c+mt),this.C)*Ko(this.e*Math.sin(c),this.ratexp))-z,r.x=this.C*h,r},inverse:function(r){for(var h=r.x/this.C,c=r.y,g=Math.pow(Math.tan(.5*c+mt)/this.K,1/this.C),f=Gf;f>0&&(c=2*Math.atan(g*Ko(this.e*Math.sin(r.y),-.5*this.e))-z,!(Math.abs(c-r.y)<1e-14));--f)r.y=c;return f?(r.x=h,r.y=c,r):null},names:["gauss"]},zf={init:function(){qo.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},forward:function(r){var h,c,g,f;return r.x=J(r.x-this.long0),qo.forward.apply(this,[r]),h=Math.sin(r.y),c=Math.cos(r.y),g=Math.cos(r.x),f=this.k0*this.R2/(1+this.sinc0*h+this.cosc0*c*g),r.x=f*c*Math.sin(r.x),r.y=f*(this.cosc0*h-this.sinc0*c*g),r.x=this.a*r.x+this.x0,r.y=this.a*r.y+this.y0,r},inverse:function(r){var h,c,g,f,_;if(r.x=(r.x-this.x0)/this.a,r.y=(r.y-this.y0)/this.a,r.x/=this.k0,r.y/=this.k0,_=Math.sqrt(r.x*r.x+r.y*r.y)){var y=2*Math.atan2(_,this.R2);h=Math.sin(y),c=Math.cos(y),f=Math.asin(c*this.sinc0+r.y*h*this.cosc0/_),g=Math.atan2(r.x*h,_*this.cosc0*c-r.y*this.sinc0*h)}else f=this.phic0,g=0;return r.x=g,r.y=f,qo.inverse.apply(this,[r]),r.x=J(r.x+this.long0),r},names:["Stereographic_North_Pole","Oblique_Stereographic","sterea","Oblique Stereographic Alternative","Double_Stereographic"]},Bf={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?this.k0===1&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=X&&(this.k0=.5*(1+Rs(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=X&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),this.k0===1&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=X&&Math.abs(Math.cos(this.lat_ts))>X&&(this.k0=.5*this.cons*Qe(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/ze(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=Qe(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-z,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(r){var h,c,g,f,_,y,p=r.x,S=r.y,R=Math.sin(S),O=Math.cos(S),A=J(p-this.long0);return Math.abs(Math.abs(p-this.long0)-Math.PI)<=X&&Math.abs(S+this.lat0)<=X?(r.x=NaN,r.y=NaN,r):this.sphere?(h=2*this.k0/(1+this.sinlat0*R+this.coslat0*O*Math.cos(A)),r.x=this.a*h*O*Math.sin(A)+this.x0,r.y=this.a*h*(this.coslat0*R-this.sinlat0*O*Math.cos(A))+this.y0,r):(c=2*Math.atan(this.ssfn_(S,R,this.e))-z,f=Math.cos(c),g=Math.sin(c),Math.abs(this.coslat0)<=X?(_=ze(this.e,S*this.con,this.con*R),y=2*this.a*this.k0*_/this.cons,r.x=this.x0+y*Math.sin(p-this.long0),r.y=this.y0-this.con*y*Math.cos(p-this.long0),r):(Math.abs(this.sinlat0)0?this.long0+Math.atan2(r.x,-1*r.y):this.long0+Math.atan2(r.x,r.y):this.long0+Math.atan2(r.x*Math.sin(p),y*this.coslat0*Math.cos(p)-r.y*this.sinlat0*Math.sin(p))),r.x=h,r.y=c,r)}if(Math.abs(this.coslat0)<=X){if(y<=X)return c=this.lat0,h=this.long0,r.x=h,r.y=c,r;r.x*=this.con,r.y*=this.con,g=y*this.cons/(2*this.a*this.k0),c=this.con*Is(this.e,g),h=this.con*J(this.con*this.long0+Math.atan2(r.x,-1*r.y))}else f=2*Math.atan(y*this.cosX0/(2*this.a*this.k0*this.ms1)),h=this.long0,y<=X?_=this.X0:(_=Math.asin(Math.cos(f)*this.sinX0+r.y*Math.sin(f)*this.cosX0/y),h=J(this.long0+Math.atan2(r.x*Math.sin(f),y*this.cosX0*Math.cos(f)-r.y*this.sinX0*Math.sin(f)))),c=-1*Is(this.e,Math.tan(.5*(z+_)));return r.x=h,r.y=c,r},names:["stere","Stereographic_South_Pole","Polar Stereographic (variant B)","Polar_Stereographic"],ssfn_:function(r,h,c){return h*=c,Math.tan(.5*(z+r))*Math.pow((1-h)/(1+h),.5*c)}},Uf={init:function(){var r=this.lat0;this.lambda0=this.long0;var h=Math.sin(r),c=this.a,g=1/this.rf,f=2*g-Math.pow(g,2),_=this.e=Math.sqrt(f);this.R=this.k0*c*Math.sqrt(1-f)/(1-f*Math.pow(h,2)),this.alpha=Math.sqrt(1+f/(1-f)*Math.pow(Math.cos(r),4)),this.b0=Math.asin(h/this.alpha);var y=Math.log(Math.tan(Math.PI/4+this.b0/2)),p=Math.log(Math.tan(Math.PI/4+r/2)),S=Math.log((1+_*h)/(1-_*h));this.K=y-this.alpha*p+this.alpha*_/2*S},forward:function(r){var h=Math.log(Math.tan(Math.PI/4-r.y/2)),c=this.e/2*Math.log((1+this.e*Math.sin(r.y))/(1-this.e*Math.sin(r.y))),g=-this.alpha*(h+c)+this.K,f=2*(Math.atan(Math.exp(g))-Math.PI/4),_=this.alpha*(r.x-this.lambda0),y=Math.atan(Math.sin(_)/(Math.sin(this.b0)*Math.tan(f)+Math.cos(this.b0)*Math.cos(_))),p=Math.asin(Math.cos(this.b0)*Math.sin(f)-Math.sin(this.b0)*Math.cos(f)*Math.cos(_));return r.y=this.R/2*Math.log((1+Math.sin(p))/(1-Math.sin(p)))+this.y0,r.x=this.R*y+this.x0,r},inverse:function(r){for(var h=r.x-this.x0,c=r.y-this.y0,g=h/this.R,f=2*(Math.atan(Math.exp(c/this.R))-Math.PI/4),_=Math.asin(Math.cos(this.b0)*Math.sin(f)+Math.sin(this.b0)*Math.cos(f)*Math.cos(g)),y=Math.atan(Math.sin(g)/(Math.cos(this.b0)*Math.cos(g)-Math.sin(this.b0)*Math.tan(f))),p=this.lambda0+y/this.alpha,S=0,R=_,O=-1e3,A=0;Math.abs(R-O)>1e-7;){if(++A>20)return;S=1/this.alpha*(Math.log(Math.tan(Math.PI/4+_/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(R))/2)),O=R,R=2*Math.atan(Math.exp(S))-Math.PI/2}return r.x=p,r.y=R,r},names:["somerc"]},Gn=1e-7,Wf={init:function(){var r,h,c,g,f,_,y,p,S,R,O,A=0,k=0,U=0,D=0,j=0,ot=0,nt=0;this.no_off=gi(this),this.no_rot="no_rot"in this;var yt=!1;"alpha"in this&&(yt=!0);var ct=!1;if("rectified_grid_angle"in this&&(ct=!0),yt&&(nt=this.alpha),ct&&(A=this.rectified_grid_angle*Ut),yt||ct)k=this.longc;else if(U=this.long1,j=this.lat1,D=this.long2,ot=this.lat2,Math.abs(j-ot)<=Gn||(r=Math.abs(j))<=Gn||Math.abs(r-z)<=Gn||Math.abs(Math.abs(this.lat0)-z)<=Gn||Math.abs(Math.abs(ot)-z)<=Gn)throw new Error;var Gt=1-this.es;h=Math.sqrt(Gt),Math.abs(this.lat0)>X?(p=Math.sin(this.lat0),c=Math.cos(this.lat0),r=1-this.es*p*p,this.B=c*c,this.B=Math.sqrt(1+this.es*this.B*this.B/Gt),this.A=this.B*this.k0*h/r,(f=(g=this.B*h/(c*Math.sqrt(r)))*g-1)<=0?f=0:(f=Math.sqrt(f),this.lat0<0&&(f=-f)),this.E=f+=g,this.E*=Math.pow(ze(this.e,this.lat0,p),this.B)):(this.B=1/h,this.A=this.k0,this.E=g=f=1),yt||ct?(yt?(O=Math.asin(Math.sin(nt)/g),ct||(A=nt)):(O=A,nt=Math.asin(g*Math.sin(O))),this.lam0=k-Math.asin(.5*(f-1/f)*Math.tan(O))/this.B):(_=Math.pow(ze(this.e,j,Math.sin(j)),this.B),y=Math.pow(ze(this.e,ot,Math.sin(ot)),this.B),f=this.E/_,S=(y-_)/(y+_),R=((R=this.E*this.E)-y*_)/(R+y*_),(r=U-D)<-Math.pi?D-=qt:r>Math.pi&&(D+=qt),this.lam0=J(.5*(U+D)-Math.atan(R*Math.tan(.5*this.B*(U-D))/S)/this.B),O=Math.atan(2*Math.sin(this.B*J(U-this.lam0))/(f-1/f)),A=nt=Math.asin(g*Math.sin(O))),this.singam=Math.sin(O),this.cosgam=Math.cos(O),this.sinrot=Math.sin(A),this.cosrot=Math.cos(A),this.rB=1/this.B,this.ArB=this.A*this.rB,this.BrA=1/this.ArB,this.no_off?this.u_0=0:(this.u_0=Math.abs(this.ArB*Math.atan(Math.sqrt(g*g-1)/Math.cos(nt))),this.lat0<0&&(this.u_0=-this.u_0)),f=.5*O,this.v_pole_n=this.ArB*Math.log(Math.tan(mt-f)),this.v_pole_s=this.ArB*Math.log(Math.tan(mt+f))},forward:function(r){var h,c,g,f,_,y,p,S,R={};if(r.x=r.x-this.lam0,Math.abs(Math.abs(r.y)-z)>X){if(_=this.E/Math.pow(ze(this.e,r.y,Math.sin(r.y)),this.B),y=1/_,h=.5*(_-y),c=.5*(_+y),f=Math.sin(this.B*r.x),g=(h*this.singam-f*this.cosgam)/c,Math.abs(Math.abs(g)-1)0?this.v_pole_n:this.v_pole_s,p=this.ArB*r.y;return this.no_rot?(R.x=p,R.y=S):(p-=this.u_0,R.x=S*this.cosrot+p*this.sinrot,R.y=p*this.cosrot-S*this.sinrot),R.x=this.a*R.x+this.x0,R.y=this.a*R.y+this.y0,R},inverse:function(r){var h,c,g,f,_,y,p,S={};if(r.x=(r.x-this.x0)*(1/this.a),r.y=(r.y-this.y0)*(1/this.a),this.no_rot?(c=r.y,h=r.x):(c=r.x*this.cosrot-r.y*this.sinrot,h=r.y*this.cosrot+r.x*this.sinrot+this.u_0),g=Math.exp(-this.BrA*c),f=.5*(g-1/g),_=.5*(g+1/g),y=Math.sin(this.BrA*h),p=(y*this.cosgam+f*this.singam)/_,Math.abs(Math.abs(p)-1)X?this.ns=Math.log(g/p)/Math.log(f/S):this.ns=h,isNaN(this.ns)&&(this.ns=h),this.f0=g/(this.ns*Math.pow(f,this.ns)),this.rh=this.a*this.f0*Math.pow(R,this.ns),this.title||(this.title="Lambert Conformal Conic")}},forward:function(r){var h=r.x,c=r.y;Math.abs(2*Math.abs(c)-Math.PI)<=X&&(c=Rs(c)*(z-2*X));var g,f,_=Math.abs(Math.abs(c)-z);if(_>X)g=ze(this.e,c,Math.sin(c)),f=this.a*this.f0*Math.pow(g,this.ns);else{if((_=c*this.ns)<=0)return null;f=0}var y=this.ns*J(h-this.long0);return r.x=this.k0*(f*Math.sin(y))+this.x0,r.y=this.k0*(this.rh-f*Math.cos(y))+this.y0,r},inverse:function(r){var h,c,g,f,_,y=(r.x-this.x0)/this.k0,p=this.rh-(r.y-this.y0)/this.k0;this.ns>0?(h=Math.sqrt(y*y+p*p),c=1):(h=-Math.sqrt(y*y+p*p),c=-1);var S=0;if(h!==0&&(S=Math.atan2(c*y,c*p)),h!==0||this.ns>0){if(c=1/this.ns,g=Math.pow(h/(this.a*this.f0),c),(f=Is(this.e,g))===-9999)return null}else f=-z;return _=J(S/this.ns+this.long0),r.x=_,r.y=f,r},names:["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_1SP","Lambert_Conformal_Conic_2SP","lcc","Lambert Conic Conformal (1SP)","Lambert Conic Conformal (2SP)"]},Xf={init:function(){this.a=6377397155e-3,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(r){var h,c,g,f,_,y,p,S=r.x,R=r.y,O=J(S-this.long0);return h=Math.pow((1+this.e*Math.sin(R))/(1-this.e*Math.sin(R)),this.alfa*this.e/2),c=2*(Math.atan(this.k*Math.pow(Math.tan(R/2+this.s45),this.alfa)/h)-this.s45),g=-O*this.alfa,f=Math.asin(Math.cos(this.ad)*Math.sin(c)+Math.sin(this.ad)*Math.cos(c)*Math.cos(g)),_=Math.asin(Math.cos(c)*Math.sin(g)/Math.cos(f)),y=this.n*_,p=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(f/2+this.s45),this.n),r.y=p*Math.cos(y)/1,r.x=p*Math.sin(y)/1,this.czech||(r.y*=-1,r.x*=-1),r},inverse:function(r){var h,c,g,f,_,y,p,S=r.x;r.x=r.y,r.y=S,this.czech||(r.y*=-1,r.x*=-1),_=Math.sqrt(r.x*r.x+r.y*r.y),f=Math.atan2(r.y,r.x)/Math.sin(this.s0),g=2*(Math.atan(Math.pow(this.ro0/_,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),h=Math.asin(Math.cos(this.ad)*Math.sin(g)-Math.sin(this.ad)*Math.cos(g)*Math.cos(f)),c=Math.asin(Math.cos(g)*Math.sin(f)/Math.cos(h)),r.x=this.long0-c/this.alfa,y=h,p=0;var R=0;do r.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(h/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(y))/(1-this.e*Math.sin(y)),this.e/2))-this.s45),Math.abs(y-r.y)<1e-10&&(p=1),y=r.y,R+=1;while(p===0&&R<15);return R>=15?null:r},names:["Krovak","krovak"]},le=function(r,h,c,g,f){return r*f-h*Math.sin(2*f)+c*Math.sin(4*f)-g*Math.sin(6*f)},Ls=function(r){return 1-.25*r*(1+r/16*(3+1.25*r))},As=function(r){return .375*r*(1+.25*r*(1+.46875*r))},Ps=function(r){return .05859375*r*r*(1+.75*r)},Os=function(r){return r*r*r*(35/3072)},zn=function(r,h,c){var g=h*c;return r/Math.sqrt(1-g*g)},Bn=function(r){return Math.abs(r)1e-7?(c=r*h,(1-r*r)*(h/(1-c*c)-.5/r*Math.log((1-c)/(1+c)))):2*h},Kf=.3333333333333333,qf=.17222222222222222,Vf=.10257936507936508,Hf=.06388888888888888,Zf=.0664021164021164,Jf=.016415012942191543,$f={init:function(){var r=Math.abs(this.lat0);if(Math.abs(r-z)0){var h;switch(this.qp=Bi(this.e,1),this.mmf=.5/(1-this.es),this.apa=$e(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),h=Math.sin(this.lat0),this.sinb1=Bi(this.e,h)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*h*h)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(r){var h,c,g,f,_,y,p,S,R,O,A=r.x,k=r.y;if(A=J(A-this.long0),this.sphere){if(_=Math.sin(k),O=Math.cos(k),g=Math.cos(A),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((c=this.mode===this.EQUIT?1+O*g:1+this.sinph0*_+this.cosph0*O*g)<=X)return null;h=(c=Math.sqrt(2/c))*O*Math.sin(A),c*=this.mode===this.EQUIT?_:this.cosph0*_-this.sinph0*O*g}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(g=-g),Math.abs(k+this.lat0)=0?(h=(R=Math.sqrt(y))*f,c=g*(this.mode===this.S_POLE?R:-R)):h=c=0}}return r.x=this.a*h+this.x0,r.y=this.a*c+this.y0,r},inverse:function(r){r.x-=this.x0,r.y-=this.y0;var h,c,g,f,_,y,p,S=r.x/this.a,R=r.y/this.a;if(this.sphere){var O,A=0,k=0;if(O=Math.sqrt(S*S+R*R),(c=.5*O)>1)return null;switch(c=2*Math.asin(c),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(k=Math.sin(c),A=Math.cos(c)),this.mode){case this.EQUIT:c=Math.abs(O)<=X?0:Math.asin(R*k/O),S*=k,R=A*O;break;case this.OBLIQ:c=Math.abs(O)<=X?this.lat0:Math.asin(A*this.sinph0+R*k*this.cosph0/O),S*=k*this.cosph0,R=(A-Math.sin(c)*this.sinph0)*O;break;case this.N_POLE:R=-R,c=z-c;break;case this.S_POLE:c-=z}h=R!==0||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(S,R):0}else{if(p=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(S/=this.dd,R*=this.dd,(y=Math.sqrt(S*S+R*R))1&&(r=r>1?1:-1),Math.asin(r)},Qf={init:function(){Math.abs(this.lat1+this.lat2)X?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(r){var h=r.x,c=r.y;this.sin_phi=Math.sin(c),this.cos_phi=Math.cos(c);var g=Bi(this.e3,this.sin_phi),f=this.a*Math.sqrt(this.c-this.ns0*g)/this.ns0,_=this.ns0*J(h-this.long0),y=f*Math.sin(_)+this.x0,p=this.rh-f*Math.cos(_)+this.y0;return r.x=y,r.y=p,r},inverse:function(r){var h,c,g,f,_,y;return r.x-=this.x0,r.y=this.rh-r.y+this.y0,this.ns0>=0?(h=Math.sqrt(r.x*r.x+r.y*r.y),g=1):(h=-Math.sqrt(r.x*r.x+r.y*r.y),g=-1),f=0,h!==0&&(f=Math.atan2(g*r.x,g*r.y)),g=h*this.ns0/this.a,this.sphere?y=Math.asin((this.c-g*g)/(2*this.ns0)):(c=(this.c-g*g)/this.ns0,y=this.phi1z(this.e3,c)),_=J(f/this.ns0+this.long0),r.x=_,r.y=y,r},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(r,h){var c,g,f,_,y,p=Ui(.5*h);if(r0||Math.abs(_)<=X?(y=this.x0+1*this.a*c*Math.sin(g)/_,p=this.y0+1*this.a*(this.cos_p14*h-this.sin_p14*c*f)/_):(y=this.x0+this.infinity_dist*c*Math.sin(g),p=this.y0+this.infinity_dist*(this.cos_p14*h-this.sin_p14*c*f)),r.x=y,r.y=p,r},inverse:function(r){var h,c,g,f,_,y;return r.x=(r.x-this.x0)/this.a,r.y=(r.y-this.y0)/this.a,r.x/=this.k0,r.y/=this.k0,(h=Math.sqrt(r.x*r.x+r.y*r.y))?(f=Math.atan2(h,this.rc),c=Math.sin(f),g=Math.cos(f),y=Ui(g*this.sin_p14+r.y*c*this.cos_p14/h),_=Math.atan2(r.x*c,h*this.cos_p14*g-r.y*this.sin_p14*c),_=J(this.long0+_)):(y=this.phic0,_=0),r.x=_,r.y=y,r},names:["gnom"]},em=function(r,h){var c=1-(1-r*r)/(2*r)*Math.log((1-r)/(1+r));if(Math.abs(Math.abs(h)-c)<1e-6)return h<0?-1*z:z;for(var g,f,_,y,p=Math.asin(.5*h),S=0;S<30;S++)if(f=Math.sin(p),_=Math.cos(p),y=r*f,g=Math.pow(1-y*y,2)/(2*_)*(h/(1-r*r)-f/(1-y*y)+.5/r*Math.log((1-y)/(1+y))),p+=g,Math.abs(g)<=1e-10)return p;return NaN},im={init:function(){this.sphere||(this.k0=Qe(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(r){var h,c,g=r.x,f=r.y,_=J(g-this.long0);if(this.sphere)h=this.x0+this.a*_*Math.cos(this.lat_ts),c=this.y0+this.a*Math.sin(f)/Math.cos(this.lat_ts);else{var y=Bi(this.e,Math.sin(f));h=this.x0+this.a*this.k0*_,c=this.y0+this.a*y*.5/this.k0}return r.x=h,r.y=c,r},inverse:function(r){r.x-=this.x0,r.y-=this.y0;var h,c;return this.sphere?(h=J(this.long0+r.x/this.a/Math.cos(this.lat_ts)),c=Math.asin(r.y/this.a*Math.cos(this.lat_ts))):(c=em(this.e,2*r.y*this.k0/this.a),h=J(this.long0+r.x/(this.a*this.k0))),r.x=h,r.y=c,r},names:["cea"]},nm={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},forward:function(r){var h=r.x,c=r.y,g=J(h-this.long0),f=Bn(c-this.lat0);return r.x=this.x0+this.a*g*this.rc,r.y=this.y0+this.a*f,r},inverse:function(r){var h=r.x,c=r.y;return r.x=J(this.long0+(h-this.x0)/(this.a*this.rc)),r.y=Bn(this.lat0+(c-this.y0)/this.a),r},names:["Equirectangular","Equidistant_Cylindrical","eqc"]},Ql=20,sm={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=Ls(this.es),this.e1=As(this.es),this.e2=Ps(this.es),this.e3=Os(this.es),this.ml0=this.a*le(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(r){var h,c,g,f=r.x,_=r.y,y=J(f-this.long0);if(g=y*Math.sin(_),this.sphere)Math.abs(_)<=X?(h=this.a*y,c=-1*this.a*this.lat0):(h=this.a*Math.sin(g)/Math.tan(_),c=this.a*(Bn(_-this.lat0)+(1-Math.cos(g))/Math.tan(_)));else if(Math.abs(_)<=X)h=this.a*y,c=-1*this.ml0;else{var p=zn(this.a,this.e,Math.sin(_))/Math.tan(_);h=p*Math.sin(g),c=this.a*le(this.e0,this.e1,this.e2,this.e3,_)-this.ml0+p*(1-Math.cos(g))}return r.x=h+this.x0,r.y=c+this.y0,r},inverse:function(r){var h,c,g,f,_,y,p,S,R;if(g=r.x-this.x0,f=r.y-this.y0,this.sphere)if(Math.abs(f+this.a*this.lat0)<=X)h=J(g/this.a+this.long0),c=0;else{y=this.lat0+f/this.a,p=g*g/this.a/this.a+y*y,S=y;var O;for(_=Ql;_;--_)if(O=Math.tan(S),R=-1*(y*(S*O+1)-S-.5*(S*S+p)*O)/((S-y)/O-1),S+=R,Math.abs(R)<=X){c=S;break}h=J(this.long0+Math.asin(g*Math.tan(S)/this.a)/Math.sin(c))}else if(Math.abs(f+this.ml0)<=X)c=0,h=J(this.long0+g/this.a);else{y=(this.ml0+f)/this.a,p=g*g/this.a/this.a+y*y,S=y;var A,k,U,D,j;for(_=Ql;_;--_)if(j=this.e*Math.sin(S),A=Math.sqrt(1-j*j)*Math.tan(S),k=this.a*le(this.e0,this.e1,this.e2,this.e3,S),U=this.e0-2*this.e1*Math.cos(2*S)+4*this.e2*Math.cos(4*S)-6*this.e3*Math.cos(6*S),D=k/this.a,R=(y*(A*D+1)-D-.5*A*(D*D+p))/(this.es*Math.sin(2*S)*(D*D+p-2*y*D)/(4*A)+(y-D)*(A*U-2/Math.sin(2*S))-U),S-=R,Math.abs(R)<=X){c=S;break}A=Math.sqrt(1-this.es*Math.pow(Math.sin(c),2))*Math.tan(c),h=J(this.long0+Math.asin(g*A/this.a)/Math.sin(c))}return r.x=h,r.y=c,r},names:["Polyconic","poly"]},rm={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(r){var h,c=r.x,g=r.y-this.lat0,f=c-this.long0,_=g/zi*1e-5,y=f,p=1,S=0;for(h=1;h<=10;h++)p*=_,S+=this.A[h]*p;var R,O=S,A=y,k=1,U=0,D=0,j=0;for(h=1;h<=6;h++)R=U*O+k*A,k=k*O-U*A,U=R,D=D+this.B_re[h]*k-this.B_im[h]*U,j=j+this.B_im[h]*k+this.B_re[h]*U;return r.x=j*this.a+this.x0,r.y=D*this.a+this.y0,r},inverse:function(r){var h,c,g=r.x,f=r.y,_=g-this.x0,y=(f-this.y0)/this.a,p=_/this.a,S=1,R=0,O=0,A=0;for(h=1;h<=6;h++)c=R*y+S*p,S=S*y-R*p,R=c,O=O+this.C_re[h]*S-this.C_im[h]*R,A=A+this.C_im[h]*S+this.C_re[h]*R;for(var k=0;k.999999999999&&(c=.999999999999),h=Math.asin(c);var g=J(this.long0+r.x/(.900316316158*this.a*Math.cos(h)));g<-Math.PI&&(g=-Math.PI),g>Math.PI&&(g=Math.PI),c=(2*h+Math.sin(2*h))/Math.PI,Math.abs(c)>1&&(c=1);var f=Math.asin(c);return r.x=g,r.y=f,r},names:["Mollweide","moll"]},cm={init:function(){Math.abs(this.lat1+this.lat2)=0?(c=Math.sqrt(r.x*r.x+r.y*r.y),h=1):(c=-Math.sqrt(r.x*r.x+r.y*r.y),h=-1);var _=0;if(c!==0&&(_=Math.atan2(h*r.x,h*r.y)),this.sphere)return f=J(this.long0+_/this.ns),g=Bn(this.g-c/this.a),r.x=f,r.y=g,r;var y=this.g-c/this.a;return g=wr(y,this.e0,this.e1,this.e2,this.e3),f=J(this.long0+_/this.ns),r.x=f,r.y=g,r},names:["Equidistant_Conic","eqdc"]},um={init:function(){this.R=this.a},forward:function(r){var h,c,g=r.x,f=r.y,_=J(g-this.long0);Math.abs(f)<=X&&(h=this.x0+this.R*_,c=this.y0);var y=Ui(2*Math.abs(f/Math.PI));(Math.abs(_)<=X||Math.abs(Math.abs(f)-z)<=X)&&(h=this.x0,c=f>=0?this.y0+Math.PI*this.R*Math.tan(.5*y):this.y0+Math.PI*this.R*-Math.tan(.5*y));var p=.5*Math.abs(Math.PI/_-_/Math.PI),S=p*p,R=Math.sin(y),O=Math.cos(y),A=O/(R+O-1),k=A*A,U=A*(2/R-1),D=U*U,j=Math.PI*this.R*(p*(A-D)+Math.sqrt(S*(A-D)*(A-D)-(D+S)*(k-D)))/(D+S);_<0&&(j=-j),h=this.x0+j;var ot=S+A;return j=Math.PI*this.R*(U*ot-p*Math.sqrt((D+S)*(S+1)-ot*ot))/(D+S),c=f>=0?this.y0+j:this.y0-j,r.x=h,r.y=c,r},inverse:function(r){var h,c,g,f,_,y,p,S,R,O,A,k,U;return r.x-=this.x0,r.y-=this.y0,A=Math.PI*this.R,g=r.x/A,f=r.y/A,_=g*g+f*f,y=-Math.abs(f)*(1+_),p=y-2*f*f+g*g,S=-2*y+1+2*f*f+_*_,U=f*f/S+(2*p*p*p/S/S/S-9*y*p/S/S)/27,R=(y-p*p/3/S)/S,O=2*Math.sqrt(-R/3),A=3*U/R/O,Math.abs(A)>1&&(A=A>=0?1:-1),k=Math.acos(A)/3,c=r.y>=0?(-O*Math.cos(k+Math.PI/3)-p/3/S)*Math.PI:-(-O*Math.cos(k+Math.PI/3)-p/3/S)*Math.PI,h=Math.abs(g)2*z*this.a?void 0:(c=h/this.a,g=Math.sin(c),f=Math.cos(c),_=this.long0,Math.abs(h)<=X?y=this.lat0:(y=Ui(f*this.sin_p12+r.y*g*this.cos_p12/h),p=Math.abs(this.lat0)-z,_=J(Math.abs(p)<=X?this.lat0>=0?this.long0+Math.atan2(r.x,-r.y):this.long0-Math.atan2(-r.x,r.y):this.long0+Math.atan2(r.x*g,h*this.cos_p12*f-r.y*this.sin_p12*g))),r.x=_,r.y=y,r):(S=Ls(this.es),R=As(this.es),O=Ps(this.es),A=Os(this.es),Math.abs(this.sin_p12-1)<=X?(k=this.a*le(S,R,O,A,z),h=Math.sqrt(r.x*r.x+r.y*r.y),U=k-h,y=wr(U/this.a,S,R,O,A),_=J(this.long0+Math.atan2(r.x,-1*r.y)),r.x=_,r.y=y,r):Math.abs(this.sin_p12+1)<=X?(k=this.a*le(S,R,O,A,z),h=Math.sqrt(r.x*r.x+r.y*r.y),U=h-k,y=wr(U/this.a,S,R,O,A),_=J(this.long0+Math.atan2(r.x,r.y)),r.x=_,r.y=y,r):(h=Math.sqrt(r.x*r.x+r.y*r.y),ot=Math.atan2(r.x,r.y),D=zn(this.a,this.e,this.sin_p12),nt=Math.cos(ot),yt=this.e*this.cos_p12*nt,ct=-yt*yt/(1-this.es),Gt=3*this.es*(1-ct)*this.sin_p12*this.cos_p12*nt/(1-this.es),te=h/D,Wt=te-ct*(1+ct)*Math.pow(te,3)/6-Gt*(1+3*ct)*Math.pow(te,4)/24,Wi=1-ct*Wt*Wt/2-te*Wt*Wt*Wt/6,j=Math.asin(this.sin_p12*Math.cos(Wt)+this.cos_p12*Math.sin(Wt)*nt),_=J(this.long0+Math.asin(Math.sin(ot)*Math.sin(Wt)/Math.cos(j))),ji=Math.sin(j),y=Math.atan2((ji-this.es*Wi*this.sin_p12)*Math.tan(j),ji*(1-this.es)),r.x=_,r.y=y,r))},names:["Azimuthal_Equidistant","aeqd"]},fm={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(r){var h,c,g,f,_,y,p,S=r.x,R=r.y;return g=J(S-this.long0),h=Math.sin(R),c=Math.cos(R),f=Math.cos(g),((_=this.sin_p14*h+this.cos_p14*c*f)>0||Math.abs(_)<=X)&&(y=1*this.a*c*Math.sin(g),p=this.y0+1*this.a*(this.cos_p14*h-this.sin_p14*c*f)),r.x=y,r.y=p,r},inverse:function(r){var h,c,g,f,_,y,p;return r.x-=this.x0,r.y-=this.y0,h=Math.sqrt(r.x*r.x+r.y*r.y),c=Ui(h/this.a),g=Math.sin(c),f=Math.cos(c),y=this.long0,Math.abs(h)<=X?(p=this.lat0,r.x=y,r.y=p,r):(p=Ui(f*this.sin_p14+r.y*g*this.cos_p14/h),_=Math.abs(this.lat0)-z,Math.abs(_)<=X?(y=J(this.lat0>=0?this.long0+Math.atan2(r.x,-r.y):this.long0-Math.atan2(-r.x,r.y)),r.x=y,r.y=p,r):(y=J(this.long0+Math.atan2(r.x*g,h*this.cos_p14*f-r.y*this.sin_p14*g)),r.x=y,r.y=p,r))},names:["ortho"]},At={FRONT:1,RIGHT:2,BACK:3,LEFT:4,TOP:5,BOTTOM:6},vt={AREA_0:1,AREA_1:2,AREA_2:3,AREA_3:4},mm={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Quadrilateralized Spherical Cube",this.lat0>=z-mt/2?this.face=At.TOP:this.lat0<=-(z-mt/2)?this.face=At.BOTTOM:Math.abs(this.long0)<=mt?this.face=At.FRONT:Math.abs(this.long0)<=z+mt?this.face=this.long0>0?At.RIGHT:At.LEFT:this.face=At.BACK,this.es!==0&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(r){var h,c,g,f,_,y,p={x:0,y:0},S={value:0};if(r.x-=this.long0,h=this.es!==0?Math.atan(this.one_minus_f_squared*Math.tan(r.y)):r.y,c=r.x,this.face===At.TOP)f=z-h,c>=mt&&c<=z+mt?(S.value=vt.AREA_0,g=c-z):c>z+mt||c<=-(z+mt)?(S.value=vt.AREA_1,g=c>0?c-xt:c+xt):c>-(z+mt)&&c<=-mt?(S.value=vt.AREA_2,g=c+z):(S.value=vt.AREA_3,g=c);else if(this.face===At.BOTTOM)f=z+h,c>=mt&&c<=z+mt?(S.value=vt.AREA_0,g=-c+z):c=-mt?(S.value=vt.AREA_1,g=-c):c<-mt&&c>=-(z+mt)?(S.value=vt.AREA_2,g=-c-z):(S.value=vt.AREA_3,g=c>0?-c+xt:-c-xt);else{var R,O,A,k,U,D;this.face===At.RIGHT?c=kt(c,+z):this.face===At.BACK?c=kt(c,+xt):this.face===At.LEFT&&(c=kt(c,-z)),k=Math.sin(h),U=Math.cos(h),D=Math.sin(c),R=U*Math.cos(c),O=U*D,A=k,this.face===At.FRONT?g=pi(f=Math.acos(R),A,O,S):this.face===At.RIGHT?g=pi(f=Math.acos(O),A,-R,S):this.face===At.BACK?g=pi(f=Math.acos(-R),A,-O,S):this.face===At.LEFT?g=pi(f=Math.acos(-O),A,R,S):(f=g=0,S.value=vt.AREA_0)}return y=Math.atan(12/xt*(g+Math.acos(Math.sin(g)*Math.cos(mt))-z)),_=Math.sqrt((1-Math.cos(f))/(Math.cos(y)*Math.cos(y))/(1-Math.cos(Math.atan(1/Math.cos(g))))),S.value===vt.AREA_1?y+=z:S.value===vt.AREA_2?y+=xt:S.value===vt.AREA_3&&(y+=1.5*xt),p.x=_*Math.cos(y),p.y=_*Math.sin(y),p.x=p.x*this.a+this.x0,p.y=p.y*this.a+this.y0,r.x=p.x,r.y=p.y,r},inverse:function(r){var h,c,g,f,_,y,p,S,R,O={lam:0,phi:0},A={value:0};if(r.x=(r.x-this.x0)/this.a,r.y=(r.y-this.y0)/this.a,c=Math.atan(Math.sqrt(r.x*r.x+r.y*r.y)),h=Math.atan2(r.y,r.x),r.x>=0&&r.x>=Math.abs(r.y)?A.value=vt.AREA_0:r.y>=0&&r.y>=Math.abs(r.x)?(A.value=vt.AREA_1,h-=z):r.x<0&&-r.x>=Math.abs(r.y)?(A.value=vt.AREA_2,h=h<0?h+xt:h-xt):(A.value=vt.AREA_3,h+=z),R=xt/12*Math.tan(h),_=Math.sin(R)/(Math.cos(R)-1/Math.sqrt(2)),y=Math.atan(_),g=Math.cos(h),f=Math.tan(c),(p=1-g*g*f*f*(1-Math.cos(Math.atan(1/Math.cos(y)))))<-1?p=-1:p>1&&(p=1),this.face===At.TOP)S=Math.acos(p),O.phi=z-S,A.value===vt.AREA_0?O.lam=y+z:A.value===vt.AREA_1?O.lam=y<0?y+xt:y-xt:A.value===vt.AREA_2?O.lam=y-z:O.lam=y;else if(this.face===At.BOTTOM)S=Math.acos(p),O.phi=S-z,A.value===vt.AREA_0?O.lam=-y+z:A.value===vt.AREA_1?O.lam=-y:A.value===vt.AREA_2?O.lam=-y-z:O.lam=y<0?-y-xt:-y+xt;else{var k,U,D;R=(k=p)*k,U=(R+=(D=R>=1?0:Math.sqrt(1-R)*Math.sin(y))*D)>=1?0:Math.sqrt(1-R),A.value===vt.AREA_1?(R=U,U=-D,D=R):A.value===vt.AREA_2?(U=-U,D=-D):A.value===vt.AREA_3&&(R=U,U=D,D=-R),this.face===At.RIGHT?(R=k,k=-U,U=R):this.face===At.BACK?(k=-k,U=-U):this.face===At.LEFT&&(R=k,k=U,U=-R),O.phi=Math.acos(-D)-z,O.lam=Math.atan2(U,k),this.face===At.RIGHT?O.lam=kt(O.lam,-z):this.face===At.BACK?O.lam=kt(O.lam,-xt):this.face===At.LEFT&&(O.lam=kt(O.lam,+z))}if(this.es!==0){var j,ot,nt;j=O.phi<0?1:0,ot=Math.tan(O.phi),nt=this.b/Math.sqrt(ot*ot+this.one_minus_f_squared),O.phi=Math.atan(Math.sqrt(this.a*this.a-nt*nt)/(this.one_minus_f*nt)),j&&(O.phi=-O.phi)}return O.lam+=this.long0,r.x=O.lam,r.y=O.phi,r},names:["Quadrilateralized Spherical Cube","Quadrilateralized_Spherical_Cube","qsc"]},Vo=[[1,22199e-21,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-986701e-12],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,18736e-12],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,934959e-12],[.7986,-.00755338,-500009e-10,935324e-12],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],Fs=[[-520417e-23,.0124,121431e-23,-845284e-16],[.062,.0124,-126793e-14,422642e-15],[.124,.0124,507171e-14,-160604e-14],[.186,.0123999,-190189e-13,600152e-14],[.248,.0124002,710039e-13,-224e-10],[.31,.0123992,-264997e-12,835986e-13],[.372,.0124029,988983e-12,-311994e-12],[.434,.0123893,-369093e-11,-435621e-12],[.4958,.0123198,-102252e-10,-345523e-12],[.5571,.0121916,-154081e-10,-582288e-12],[.6176,.0119938,-241424e-10,-525327e-12],[.6769,.011713,-320223e-10,-516405e-12],[.7346,.0113541,-397684e-10,-609052e-12],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-140374e-14],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],tc=.8487,ec=1.3523,ic=wt/5,gm=1/ic,Un=18,br=function(r,h){return r[0]+h*(r[1]+h*(r[2]+h*r[3]))},pm=function(r,h){return r[1]+h*(2*r[2]+3*h*r[3])},_m={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||"Robinson"},forward:function(r){var h=J(r.x-this.long0),c=Math.abs(r.y),g=Math.floor(c*ic);g<0?g=0:g>=Un&&(g=Un-1),c=wt*(c-gm*g);var f={x:br(Vo[g],c)*h,y:br(Fs[g],c)};return r.y<0&&(f.y=-f.y),f.x=f.x*this.a*tc+this.x0,f.y=f.y*this.a*ec+this.y0,f},inverse:function(r){var h={x:(r.x-this.x0)/(this.a*tc),y:Math.abs(r.y-this.y0)/(this.a*ec)};if(h.y>=1)h.x/=Vo[Un][0],h.y=r.y<0?-z:z;else{var c=Math.floor(h.y*Un);for(c<0?c=0:c>=Un&&(c=Un-1);;)if(Fs[c][0]>h.y)--c;else{if(!(Fs[c+1][0]<=h.y))break;++c}var g=Fs[c],f=5*(h.y-g[0])/(Fs[c+1][0]-g[0]);f=Ts(function(_){return(br(g,_)-h.y)/pm(g,_)},f,X,100),h.x/=br(Vo[c],f),h.y=(5*c+f)*Ut,r.y<0&&(h.y=-h.y)}return h.x=J(h.x+this.long0),h},names:["Robinson","robin"]},ym={init:function(){this.name="geocent"},forward:function(r){return K(r,this.es,this.a)},inverse:function(r){return V(r,this.es,this.a,this.b)},names:["Geocentric","geocentric","geocent","Geocent"]},ee={N_POLE:0,S_POLE:1,EQUIT:2,OBLIQ:3},ks={h:{def:1e5,num:!0},azi:{def:0,num:!0,degrees:!0},tilt:{def:0,num:!0,degrees:!0},long0:{def:0,num:!0},lat0:{def:0,num:!0}},xm={init:function(){if(Object.keys(ks).forEach(function(c){if(this[c]===void 0)this[c]=ks[c].def;else{if(ks[c].num&&isNaN(this[c]))throw new Error("Invalid parameter value, must be numeric "+c+" = "+this[c]);ks[c].num&&(this[c]=parseFloat(this[c]))}ks[c].degrees&&(this[c]=this[c]*Ut)}.bind(this)),Math.abs(Math.abs(this.lat0)-z)1e10)throw new Error("Invalid height");this.p=1+this.pn1,this.rp=1/this.p,this.h1=1/this.pn1,this.pfact=(this.p+1)*this.h1,this.es=0;var r=this.tilt,h=this.azi;this.cg=Math.cos(h),this.sg=Math.sin(h),this.cw=Math.cos(r),this.sw=Math.sin(r)},forward:function(r){r.x-=this.long0;var h,c,g=Math.sin(r.y),f=Math.cos(r.y),_=Math.cos(r.x);switch(this.mode){case ee.OBLIQ:c=this.sinph0*g+this.cosph0*f*_;break;case ee.EQUIT:c=f*_;break;case ee.S_POLE:c=-g;break;case ee.N_POLE:c=g}switch(c=this.pn1/(this.p-c),h=c*f*Math.sin(r.x),this.mode){case ee.OBLIQ:c*=this.cosph0*g-this.sinph0*f*_;break;case ee.EQUIT:c*=g;break;case ee.N_POLE:c*=-f*_;break;case ee.S_POLE:c*=f*_}var y,p;return y=c*this.cg+h*this.sg,p=1/(y*this.sw*this.h1+this.cw),h=(h*this.cg-c*this.sg)*this.cw*p,c=y*p,r.x=h*this.a,r.y=c*this.a,r},inverse:function(r){r.x/=this.a,r.y/=this.a;var h,c,g,f={x:r.x,y:r.y};g=1/(this.pn1-r.y*this.sw),h=this.pn1*r.x*g,c=this.pn1*r.y*this.cw*g,r.x=h*this.cg+c*this.sg,r.y=c*this.cg-h*this.sg;var _=Be(r.x,r.y);if(Math.abs(_)1e10)throw new Error;if(this.radius_g=1+this.radius_g_1,this.C=this.radius_g*this.radius_g-1,this.es!==0){var r=1-this.es,h=1/r;this.radius_p=Math.sqrt(r),this.radius_p2=r,this.radius_p_inv2=h,this.shape="ellipse"}else this.radius_p=1,this.radius_p2=1,this.radius_p_inv2=1,this.shape="sphere";this.title||(this.title="Geostationary Satellite View")},forward:function(r){var h,c,g,f,_=r.x,y=r.y;if(_-=this.long0,this.shape==="ellipse"){y=Math.atan(this.radius_p2*Math.tan(y));var p=this.radius_p/Be(this.radius_p*Math.cos(y),Math.sin(y));if(c=p*Math.cos(_)*Math.cos(y),g=p*Math.sin(_)*Math.cos(y),f=p*Math.sin(y),(this.radius_g-c)*c-g*g-f*f*this.radius_p_inv2<0)return r.x=Number.NaN,r.y=Number.NaN,r;h=this.radius_g-c,this.flip_axis?(r.x=this.radius_g_1*Math.atan(g/Be(f,h)),r.y=this.radius_g_1*Math.atan(f/h)):(r.x=this.radius_g_1*Math.atan(g/h),r.y=this.radius_g_1*Math.atan(f/Be(g,h)))}else this.shape==="sphere"&&(h=Math.cos(y),c=Math.cos(_)*h,g=Math.sin(_)*h,f=Math.sin(y),h=this.radius_g-c,this.flip_axis?(r.x=this.radius_g_1*Math.atan(g/Be(f,h)),r.y=this.radius_g_1*Math.atan(f/h)):(r.x=this.radius_g_1*Math.atan(g/h),r.y=this.radius_g_1*Math.atan(f/Be(g,h))));return r.x=r.x*this.a,r.y=r.y*this.a,r},inverse:function(r){var h,c,g,f,_=-1,y=0,p=0;if(r.x=r.x/this.a,r.y=r.y/this.a,this.shape==="ellipse"){this.flip_axis?(p=Math.tan(r.y/this.radius_g_1),y=Math.tan(r.x/this.radius_g_1)*Be(1,p)):(y=Math.tan(r.x/this.radius_g_1),p=Math.tan(r.y/this.radius_g_1)*Be(1,y));var S=p/this.radius_p;if(h=y*y+S*S+_*_,c=2*this.radius_g*_,(g=c*c-4*h*this.C)<0)return r.x=Number.NaN,r.y=Number.NaN,r;f=(-c-Math.sqrt(g))/(2*h),_=this.radius_g+f*_,y*=f,p*=f,r.x=Math.atan2(y,_),r.y=Math.atan(p*Math.cos(r.x)/_),r.y=Math.atan(this.radius_p_inv2*Math.tan(r.y))}else if(this.shape==="sphere"){if(this.flip_axis?(p=Math.tan(r.y/this.radius_g_1),y=Math.tan(r.x/this.radius_g_1)*Math.sqrt(1+p*p)):(y=Math.tan(r.x/this.radius_g_1),p=Math.tan(r.y/this.radius_g_1)*Math.sqrt(1+y*y)),h=y*y+p*p+_*_,c=2*this.radius_g*_,(g=c*c-4*h*this.C)<0)return r.x=Number.NaN,r.y=Number.NaN,r;f=(-c-Math.sqrt(g))/(2*h),_=this.radius_g+f*_,y*=f,p*=f,r.x=Math.atan2(y,_),r.y=Math.atan(p*Math.cos(r.x)/_)}return r.x=r.x+this.long0,r},names:["Geostationary Satellite View","Geostationary_Satellite","geos"]};return Bt.defaultDatum="WGS84",Bt.Proj=tt,Bt.WGS84=new Bt.Proj("WGS84"),Bt.Point=Ce,Bt.toPoint=jl,Bt.defs=u,Bt.nadgrid=function(r,h){var c=new DataView(h),g=G(c),f=W(c,g),_={header:f,subgrids:Z(c,f,g)};return Ul[r]=_,_},Bt.transform=he,Bt.mgrs=Af,Bt.version="2.9.2",function(r){r.Proj.projections.add(Rr),r.Proj.projections.add(Ir),r.Proj.projections.add(Df),r.Proj.projections.add(zf),r.Proj.projections.add(Bf),r.Proj.projections.add(Uf),r.Proj.projections.add(Wf),r.Proj.projections.add(jf),r.Proj.projections.add(Xf),r.Proj.projections.add(Yf),r.Proj.projections.add($f),r.Proj.projections.add(Qf),r.Proj.projections.add(tm),r.Proj.projections.add(im),r.Proj.projections.add(nm),r.Proj.projections.add(sm),r.Proj.projections.add(rm),r.Proj.projections.add(om),r.Proj.projections.add(hm),r.Proj.projections.add(lm),r.Proj.projections.add(cm),r.Proj.projections.add(um),r.Proj.projections.add(dm),r.Proj.projections.add(fm),r.Proj.projections.add(mm),r.Proj.projections.add(_m),r.Proj.projections.add(ym),r.Proj.projections.add(xm),r.Proj.projections.add(Em)}(Bt),Bt})});var Wh=sc((Bh,Uh)=>{(function(s,t){typeof Bh=="object"&&typeof Uh<"u"?Uh.exports=t():typeof define=="function"&&define.amd?define(t):(s=s||self).RBush=t()})(Bh,function(){"use strict";function s(M,v,I,L,b){(function P(F,N,G,W,Y){for(;W>G;){if(W-G>600){var Z=W-G+1,it=N-G+1,rt=Math.log(Z),Ct=.5*Math.exp(2*rt/3),tt=.5*Math.sqrt(rt*Ct*(Z-Ct)/Z)*(it-Z/2<0?-1:1),q=Math.max(G,Math.floor(N-it*Ct/Z+tt)),K=Math.min(W,Math.floor(N+(Z-it)*Ct/Z+tt));P(F,N,q,K,Y)}var V=F[N],dt=G,ht=W;for(t(F,G,N),Y(F[W],V)>0&&t(F,G,W);dt0;)ht--}Y(F[G],V)===0?t(F,G,ht):t(F,++ht,W),ht<=N&&(G=ht+1),N<=ht&&(W=ht-1)}})(M,v,I||0,L||M.length-1,b||e)}function t(M,v,I){var L=M[v];M[v]=M[I],M[I]=L}function e(M,v){return Mv?1:0}var i=function(M){M===void 0&&(M=9),this._maxEntries=Math.max(4,M),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()};function n(M,v,I){if(!I)return v.indexOf(M);for(var L=0;L=M.minX&&v.maxY>=M.minY}function T(M){return{children:M,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function w(M,v,I,L,b){for(var P=[v,I];P.length;)if(!((I=P.pop())-(v=P.pop())<=L)){var F=v+Math.ceil((I-v)/L/2)*L;s(M,F,v,I,b),P.push(v,F,F,I)}}return i.prototype.all=function(){return this._all(this.data,[])},i.prototype.search=function(M){var v=this.data,I=[];if(!C(M,v))return I;for(var L=this.toBBox,b=[];v;){for(var P=0;P=0&&b[v].children.length>this._maxEntries;)this._split(b,v),v--;this._adjustParentBBoxes(L,b,v)},i.prototype._split=function(M,v){var I=M[v],L=I.children.length,b=this._minEntries;this._chooseSplitAxis(I,b,L);var P=this._chooseSplitIndex(I,b,L),F=T(I.children.splice(P,I.children.length-P));F.height=I.height,F.leaf=I.leaf,o(I,this.toBBox),o(F,this.toBBox),v?M[v-1].children.push(F):this._splitRoot(I,F)},i.prototype._splitRoot=function(M,v){this.data=T([M,v]),this.data.height=M.height+1,this.data.leaf=!1,o(this.data,this.toBBox)},i.prototype._chooseSplitIndex=function(M,v,I){for(var L,b,P,F,N,G,W,Y=1/0,Z=1/0,it=v;it<=I-v;it++){var rt=a(M,0,it,this.toBBox),Ct=a(M,it,I,this.toBBox),tt=(b=rt,P=Ct,F=void 0,N=void 0,G=void 0,W=void 0,F=Math.max(b.minX,P.minX),N=Math.max(b.minY,P.minY),G=Math.min(b.maxX,P.maxX),W=Math.min(b.maxY,P.maxY),Math.max(0,G-F)*Math.max(0,W-N)),q=m(rt)+m(Ct);tt=v;Y--){var Z=M.children[Y];l(F,M.leaf?b(Z):Z),N+=x(F)}return N},i.prototype._adjustParentBBoxes=function(M,v,I){for(var L=I;L>=0;L--)l(v[L],M)},i.prototype._condense=function(M){for(var v=M.length-1,I=void 0;v>=0;v--)M[v].children.length===0?v>0?(I=M[v-1].children).splice(I.indexOf(M[v]),1):this.clear():o(M[v],this.toBBox)},i})});var Zo=class{constructor(t){this.propagationStopped,this.defaultPrevented,this.type=t,this.target=null}preventDefault(){this.defaultPrevented=!0}stopPropagation(){this.propagationStopped=!0}};function rc(s){s.stopPropagation()}var Jt=Zo;var Ue={PROPERTYCHANGE:"propertychange"};var Jo=class{constructor(){this.disposed=!1}dispose(){this.disposed||(this.disposed=!0,this.disposeInternal())}disposeInternal(){}},jn=Jo;function ti(s,t){return s>t?1:s0?n-1:n}return i-1}if(e>0){for(let n=1;n0||e&&a===0)})}function Ei(){return!0}function Mi(){return!1}function We(){}function hc(s){let t=!1,e,i,n;return function(){let o=Array.prototype.slice.call(arguments);return(!t||this!==n||!ie(o,i))&&(t=!0,n=this,i=o,e=s.apply(this,arguments)),e}}function ei(s){for(let t in s)delete s[t]}function vi(s){let t;for(t in s)return!1;return!t}var $o=class extends jn{constructor(t){super(),this.eventTarget_=t,this.pendingRemovals_=null,this.dispatching_=null,this.listeners_=null}addEventListener(t,e){if(!t||!e)return;let i=this.listeners_||(this.listeners_={}),n=i[t]||(i[t]=[]);n.includes(e)||n.push(e)}dispatchEvent(t){let e=typeof t=="string",i=e?t:t.type,n=this.listeners_&&this.listeners_[i];if(!n)return;let o=e?new Jt(t):t;o.target||(o.target=this.eventTarget_||this);let a=this.dispatching_||(this.dispatching_={}),l=this.pendingRemovals_||(this.pendingRemovals_={});i in a||(a[i]=0,l[i]=0),++a[i];let u;for(let d=0,m=n.length;d0:!1}removeEventListener(t,e){let i=this.listeners_&&this.listeners_[t];if(i){let n=i.indexOf(e);n!==-1&&(this.pendingRemovals_&&t in this.pendingRemovals_?(i[n]=We,++this.pendingRemovals_[t]):(i.splice(n,1),i.length===0&&delete this.listeners_[t]))}}},Yi=$o;var H={CHANGE:"change",ERROR:"error",BLUR:"blur",CLEAR:"clear",CONTEXTMENU:"contextmenu",CLICK:"click",DBLCLICK:"dblclick",DRAGENTER:"dragenter",DRAGOVER:"dragover",DROP:"drop",FOCUS:"focus",KEYDOWN:"keydown",KEYPRESS:"keypress",LOAD:"load",RESIZE:"resize",TOUCHMOVE:"touchmove",WHEEL:"wheel"};function st(s,t,e,i,n){if(i&&i!==s&&(e=e.bind(i)),n){let a=e;e=function(){s.removeEventListener(t,e),a.apply(this,arguments)}}let o={target:s,type:t,listener:e};return s.addEventListener(t,e),o}function Yn(s,t,e,i){return st(s,t,e,i,!0)}function ut(s){s&&s.target&&(s.target.removeEventListener(s.type,s.listener),ei(s))}var Kn=class extends Yi{constructor(){super(),this.on=this.onInternal,this.once=this.onceInternal,this.un=this.unInternal,this.revision_=0}changed(){++this.revision_,this.dispatchEvent(H.CHANGE)}getRevision(){return this.revision_}onInternal(t,e){if(Array.isArray(t)){let i=t.length,n=new Array(i);for(let o=0;o0;)this.pop()}extend(t){for(let e=0,i=t.length;ethis.getLength())throw new Error("Index out of bounds: "+t);this.unique_&&this.assertUnique_(e),this.array_.splice(t,0,e),this.updateLength_(),this.dispatchEvent(new qn($t.ADD,e,t))}pop(){return this.removeAt(this.getLength()-1)}push(t){this.unique_&&this.assertUnique_(t);let e=this.getLength();return this.insertAt(e,t),this.getLength()}remove(t){let e=this.array_;for(let i=0,n=e.length;i=this.getLength())return;let e=this.array_[t];return this.array_.splice(t,1),this.updateLength_(),this.dispatchEvent(new qn($t.REMOVE,e,t)),e}setAt(t,e){let i=this.getLength();if(t>=i){this.insertAt(t,e);return}if(t<0)throw new Error("Index out of bounds: "+t);this.unique_&&this.assertUnique_(e,t);let n=this.array_[t];this.array_[t]=e,this.dispatchEvent(new qn($t.REMOVE,n,t)),this.dispatchEvent(new qn($t.ADD,e,t))}updateLength_(){this.set(lc.LENGTH,this.array_.length)}assertUnique_(t,e){for(let i=0,n=this.array_.length;in&&(u=u|jt.RIGHT),lo&&(u=u|jt.ABOVE),u===jt.UNKNOWN&&(u=jt.INTERSECTING),u}function Ot(){return[1/0,1/0,-1/0,-1/0]}function Se(s,t,e,i,n){return n?(n[0]=s,n[1]=t,n[2]=e,n[3]=i,n):[s,t,e,i]}function mn(s){return Se(1/0,1/0,-1/0,-1/0,s)}function pc(s,t){let e=s[0],i=s[1];return Se(e,i,e,i,t)}function _c(s,t,e,i,n){let o=mn(n);return ra(o,s,t,e,i)}function Si(s,t){return s[0]==t[0]&&s[2]==t[2]&&s[1]==t[1]&&s[3]==t[3]}function Br(s,t){return t[0]s[2]&&(s[2]=t[2]),t[1]s[3]&&(s[3]=t[3]),s}function gn(s,t){t[0]s[2]&&(s[2]=t[0]),t[1]s[3]&&(s[3]=t[1])}function ra(s,t,e,i,n){for(;et[0]?i[0]=s[0]:i[0]=t[0],s[1]>t[1]?i[1]=s[1]:i[1]=t[1],s[2]=t[0]&&s[1]<=t[3]&&s[3]>=t[1]}function Hi(s){return s[2]=a&&w<=u),!i&&!!(o&jt.RIGHT)&&!(n&jt.RIGHT)&&(M=C-(E-u)*T,i=M>=l&&M<=d),!i&&!!(o&jt.BELOW)&&!(n&jt.BELOW)&&(w=E-(C-l)/T,i=w>=a&&w<=u),!i&&!!(o&jt.LEFT)&&!(n&jt.LEFT)&&(M=C-(E-a)*T,i=M>=l&&M<=d)}return i}function Mc(s,t,e,i){if(Hi(s))return mn(e);let n=[];if(i>1){let l=s[2]-s[0],u=s[3]-s[1];for(let d=0;d=e[2])){let n=gt(e),a=Math.floor((i[0]-e[0])/n)*n;s[0]-=a,s[2]-=a}return s}function vc(s,t){if(t.canWrapX()){let e=t.getExtent();if(!isFinite(s[0])||!isFinite(s[2]))return[[e[0],s[1],e[2],s[3]]];oa(s,t);let i=gt(e);if(gt(s)>i)return[[e[0],s[1],e[2],s[3]]];if(s[0]e[2])return[[s[0],s[1],e[2],s[3]],[e[0],s[1],s[2]-i,s[3]]]}return[s]}function pt(s,t,e){return Math.min(Math.max(s,t),e)}function Cc(s,t,e,i,n,o){let a=n-e,l=o-i;if(a!==0||l!==0){let u=((s-e)*a+(t-i)*l)/(a*a+l*l);u>1?(e=n,i=o):u>0&&(e+=a*u,i+=l*u)}return Ti(s,t,e,i)}function Ti(s,t,e,i){let n=e-s,o=i-t;return n*n+o*o}function Sc(s){let t=s.length;for(let i=0;io&&(o=u,n=l)}if(o===0)return null;let a=s[n];s[n]=s[i],s[i]=a;for(let l=i+1;l=0;i--){e[i]=s[i][t]/s[i][i];for(let n=i-1;n>=0;n--)s[n][t]-=s[n][i]*e[i]}return e}function Qn(s){return s*Math.PI/180}function Ae(s,t){let e=s%t;return e*t<0?e+t:e}function _e(s,t,e){return s+e*(t-s)}function jr(s,t){let e=Math.pow(10,t);return Math.round(s*e)/e}function zs(s,t){return Math.floor(jr(s,t))}function Bs(s,t){return Math.ceil(jr(s,t))}var km=/^#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})$/i,Nm=/^([a-z]*)$|^hsla?\(.*\)$/i;function Xr(s){return typeof s=="string"?s:aa(s)}function Dm(s){let t=document.createElement("div");if(t.style.color=s,t.style.color!==""){document.body.appendChild(t);let e=getComputedStyle(t).color;return document.body.removeChild(t),e}return""}var Gm=function(){let t={},e=0;return function(i){let n;if(t.hasOwnProperty(i))n=t[i];else{if(e>=1024){let o=0;for(let a in t)(o++&3)===0&&(delete t[a],--e)}n=zm(i),t[i]=n,++e}return n}}();function pn(s){return Array.isArray(s)?s:Gm(s)}function zm(s){let t,e,i,n,o;if(Nm.exec(s)&&(s=Dm(s)),km.exec(s)){let a=s.length-1,l;a<=4?l=1:l=2;let u=a===4||a===8;t=parseInt(s.substr(1+0*l,l),16),e=parseInt(s.substr(1+1*l,l),16),i=parseInt(s.substr(1+2*l,l),16),u?n=parseInt(s.substr(1+3*l,l),16):n=255,l==1&&(t=(t<<4)+t,e=(e<<4)+e,i=(i<<4)+i,u&&(n=(n<<4)+n)),o=[t,e,i,n/255]}else s.startsWith("rgba(")?(o=s.slice(5,-1).split(",").map(Number),Tc(o)):s.startsWith("rgb(")?(o=s.slice(4,-1).split(",").map(Number),o.push(1),Tc(o)):Q(!1,14);return o}function Tc(s){return s[0]=pt(s[0]+.5|0,0,255),s[1]=pt(s[1]+.5|0,0,255),s[2]=pt(s[2]+.5|0,0,255),s[3]=pt(s[3],0,1),s}function aa(s){let t=s[0];t!=(t|0)&&(t=t+.5|0);let e=s[1];e!=(e|0)&&(e=e+.5|0);let i=s[2];i!=(i|0)&&(i=i+.5|0);let n=s[3]===void 0?1:Math.round(s[3]*100)/100;return"rgba("+t+","+e+","+i+","+n+")"}var ha=class{constructor(){this.cache_={},this.cacheSize_=0,this.maxCacheSize_=32}clear(){this.cache_={},this.cacheSize_=0}canExpireCache(){return this.cacheSize_>this.maxCacheSize_}expire(){if(this.canExpireCache()){let t=0;for(let e in this.cache_){let i=this.cache_[e];(t++&3)===0&&!i.hasListener()&&(delete this.cache_[e],--this.cacheSize_)}}}get(t,e,i){let n=Rc(t,e,i);return n in this.cache_?this.cache_[n]:null}set(t,e,i,n){let o=Rc(t,e,i);this.cache_[o]=n,++this.cacheSize_}setSize(t){this.maxCacheSize_=t,this.expire()}};function Rc(s,t,e){let i=e?Xr(e):"null";return t+":"+s+":"+i}var ts=new ha;var Et={OPACITY:"opacity",VISIBLE:"visible",EXTENT:"extent",Z_INDEX:"zIndex",MAX_RESOLUTION:"maxResolution",MIN_RESOLUTION:"minResolution",MAX_ZOOM:"maxZoom",MIN_ZOOM:"minZoom",SOURCE:"source",MAP:"map"};var la=class extends Nt{constructor(t){super(),this.on,this.once,this.un,this.background_=t.background;let e=Object.assign({},t);typeof t.properties=="object"&&(delete e.properties,Object.assign(e,t.properties)),e[Et.OPACITY]=t.opacity!==void 0?t.opacity:1,Q(typeof e[Et.OPACITY]=="number",64),e[Et.VISIBLE]=t.visible!==void 0?t.visible:!0,e[Et.Z_INDEX]=t.zIndex,e[Et.MAX_RESOLUTION]=t.maxResolution!==void 0?t.maxResolution:1/0,e[Et.MIN_RESOLUTION]=t.minResolution!==void 0?t.minResolution:0,e[Et.MIN_ZOOM]=t.minZoom!==void 0?t.minZoom:-1/0,e[Et.MAX_ZOOM]=t.maxZoom!==void 0?t.maxZoom:1/0,this.className_=e.className!==void 0?e.className:"ol-layer",delete e.className,this.setProperties(e),this.state_=null}getBackground(){return this.background_}getClassName(){return this.className_}getLayerState(t){let e=this.state_||{layer:this,managed:t===void 0?!0:t},i=this.getZIndex();return e.opacity=pt(Math.round(this.getOpacity()*100)/100,0,1),e.visible=this.getVisible(),e.extent=this.getExtent(),e.zIndex=i===void 0&&!e.managed?1/0:i,e.maxResolution=this.getMaxResolution(),e.minResolution=Math.max(this.getMinResolution(),0),e.minZoom=this.getMinZoom(),e.maxZoom=this.getMaxZoom(),this.state_=e,e}getLayersArray(t){return ft()}getLayerStatesArray(t){return ft()}getExtent(){return this.get(Et.EXTENT)}getMaxResolution(){return this.get(Et.MAX_RESOLUTION)}getMinResolution(){return this.get(Et.MIN_RESOLUTION)}getMinZoom(){return this.get(Et.MIN_ZOOM)}getMaxZoom(){return this.get(Et.MAX_ZOOM)}getOpacity(){return this.get(Et.OPACITY)}getSourceState(){return ft()}getVisible(){return this.get(Et.VISIBLE)}getZIndex(){return this.get(Et.Z_INDEX)}setBackground(t){this.background_=t,this.changed()}setExtent(t){this.set(Et.EXTENT,t)}setMaxResolution(t){this.set(Et.MAX_RESOLUTION,t)}setMinResolution(t){this.set(Et.MIN_RESOLUTION,t)}setMaxZoom(t){this.set(Et.MAX_ZOOM,t)}setMinZoom(t){this.set(Et.MIN_ZOOM,t)}setOpacity(t){Q(typeof t=="number",64),this.set(Et.OPACITY,t)}setVisible(t){this.set(Et.VISIBLE,t)}setZIndex(t){this.set(Et.Z_INDEX,t)}disposeInternal(){this.state_&&(this.state_.layer=null,this.state_=null),super.disposeInternal()}},Yr=la;var de={PRERENDER:"prerender",POSTRENDER:"postrender",PRECOMPOSE:"precompose",POSTCOMPOSE:"postcompose",RENDERCOMPLETE:"rendercomplete"};var Yt={ANIMATING:0,INTERACTING:1};var Pe={CENTER:"center",RESOLUTION:"resolution",ROTATION:"rotation"};var Te={radians:6370997/(2*Math.PI),degrees:2*Math.PI*6370997/360,ft:.3048,m:1,"us-ft":1200/3937};var ca=class{constructor(t){this.code_=t.code,this.units_=t.units,this.extent_=t.extent!==void 0?t.extent:null,this.worldExtent_=t.worldExtent!==void 0?t.worldExtent:null,this.axisOrientation_=t.axisOrientation!==void 0?t.axisOrientation:"enu",this.global_=t.global!==void 0?t.global:!1,this.canWrapX_=!!(this.global_&&this.extent_),this.getPointResolutionFunc_=t.getPointResolution,this.defaultTileGrid_=null,this.metersPerUnit_=t.metersPerUnit}canWrapX(){return this.canWrapX_}getCode(){return this.code_}getExtent(){return this.extent_}getUnits(){return this.units_}getMetersPerUnit(){return this.metersPerUnit_||Te[this.units_]}getWorldExtent(){return this.worldExtent_}getAxisOrientation(){return this.axisOrientation_}isGlobal(){return this.global_}setGlobal(t){this.global_=t,this.canWrapX_=!!(t&&this.extent_)}getDefaultTileGrid(){return this.defaultTileGrid_}setDefaultTileGrid(t){this.defaultTileGrid_=t}setExtent(t){this.extent_=t,this.canWrapX_=!!(this.global_&&t)}setWorldExtent(t){this.worldExtent_=t}setGetPointResolution(t){this.getPointResolutionFunc_=t}getPointResolutionFunc(){return this.getPointResolutionFunc_}},es=ca;var Us=6378137,is=Math.PI*Us,Bm=[-is,-is,is,is],Um=[-180,-85,180,85],Kr=Us*Math.log(Math.tan(Math.PI/2)),Zi=class extends es{constructor(t){super({code:t,units:"m",extent:Bm,global:!0,worldExtent:Um,getPointResolution:function(e,i){return e/Math.cosh(i[1]/Us)}})}},ua=[new Zi("EPSG:3857"),new Zi("EPSG:102100"),new Zi("EPSG:102113"),new Zi("EPSG:900913"),new Zi("http://www.opengis.net/def/crs/EPSG/0/3857"),new Zi("http://www.opengis.net/gml/srs/epsg.xml#3857")];function Ic(s,t,e){let i=s.length;e=e>1?e:2,t===void 0&&(e>2?t=s.slice():t=new Array(i));for(let n=0;nKr?o=Kr:o<-Kr&&(o=-Kr),t[n+1]=o}return t}function wc(s,t,e){let i=s.length;e=e>1?e:2,t===void 0&&(e>2?t=s.slice():t=new Array(i));for(let n=0;na)return 1;if(a>o)return-1}return 0}function Oc(s,t){return s[0]+=+t[0],s[1]+=+t[1],s}function yn(s,t){let e=!0;for(let i=s.length-1;i>=0;--i)if(s[i]!=t[i]){e=!1;break}return e}function ss(s,t){let e=Math.cos(t),i=Math.sin(t),n=s[0]*e-s[1]*i,o=s[1]*e+s[0]*i;return s[0]=n,s[1]=o,s}function Fc(s,t){return s[0]*=t,s[1]*=t,s}function Vr(s,t){if(t.canWrapX()){let e=gt(t.getExtent()),i=ma(s,t,e);i&&(s[0]-=i*e)}return s}function ma(s,t,e){let i=t.getExtent(),n=0;return t.canWrapX()&&(s[0]i[2])&&(e=e||gt(i),n=Math.floor((s[0]-i[0])/e)),n}var Xm=63710088e-1;function ga(s,t,e){e=e||Xm;let i=Qn(s[1]),n=Qn(t[1]),o=(n-i)/2,a=Qn(t[0]-s[0])/2,l=Math.sin(o)*Math.sin(o)+Math.sin(a)*Math.sin(a)*Math.cos(i)*Math.cos(n);return 2*e*Math.atan2(Math.sqrt(l),Math.sqrt(1-l))}var kc={info:1,warn:2,error:3,none:4},Ym=kc.info;function Hr(...s){Ym>kc.warn||console.warn(...s)}var pa=!0;function _a(s){pa=!(s===void 0?!0:s)}function ya(s,t){if(t!==void 0){for(let e=0,i=s.length;e=l?t[o+u]:a[u]}return e}}function Gc(s,t,e,i){let n=Tt(s),o=Tt(t);_n(n,o,Nc(e)),_n(o,n,Nc(i))}function xn(s,t){return _a(),Mn(s,"EPSG:4326",t!==void 0?t:"EPSG:3857")}function Ii(s,t){if(s===t)return!0;let e=s.getUnits()===t.getUnits();return(s.getCode()===t.getCode()||Ws(s,t)===ya)&&e}function Ws(s,t){let e=s.getCode(),i=t.getCode(),n=qr(e,i);return n||(n=Dc),n}function En(s,t){let e=Tt(s),i=Tt(t);return Ws(e,i)}function Mn(s,t,e){return En(t,e)(s,void 0,s.length)}function js(s,t,e,i){let n=En(t,e);return Mc(s,n,void 0,i)}var Xe=null;function $r(){return Xe}function Xs(s,t){return Xe?Mn(s,t,Xe):s}function Ye(s,t){return Xe?Mn(s,Xe,t):(pa&&!yn(s,[0,0])&&s[0]>=-180&&s[0]<=180&&s[1]>=-90&&s[1]<=90&&(pa=!1,Hr("Call useGeographic() from ol/proj once to work with [longitude, latitude] coordinates.")),s)}function os(s,t){return Xe?js(s,t,Xe):s}function Ke(s,t){return Xe?js(s,Xe,t):s}function zc(s,t){if(!Xe)return s;let e=Tt(t).getUnits(),i=Xe.getUnits();return e&&i?s*Te[e]/Te[i]:s}function Ea(s,t,e){return function(i){let n,o;if(s.canWrapX()){let a=s.getExtent(),l=gt(a);i=i.slice(0),o=ma(i,s,l),o&&(i[0]=i[0]-o*l),i[0]=pt(i[0],a[0],a[2]),i[1]=pt(i[1],a[1],a[3]),n=e(i)}else n=e(i);return o&&t.canWrapX()&&(n[0]+=o*gt(t.getExtent())),n}}function Vm(){Zr(ua),Zr(da),qm(da,ua,Ic,wc)}Vm();function Ma(s,t,e){return function(i,n,o,a,l){if(!i)return;if(!n&&!t)return i;let u=t?0:o[0]*n,d=t?0:o[1]*n,m=l?l[0]:0,x=l?l[1]:0,E=s[0]+u/2+m,C=s[2]-u/2+m,T=s[1]+d/2+x,w=s[3]-d/2+x;E>C&&(E=(C+E)/2,C=E),T>w&&(T=(w+T)/2,w=T);let M=pt(i[0],E,C),v=pt(i[1],T,w);if(a&&e&&n){let I=30*n;M+=-I*Math.log(1+Math.max(0,E-i[0])/I)+I*Math.log(1+Math.max(0,i[0]-C)/I),v+=-I*Math.log(1+Math.max(0,T-i[1])/I)+I*Math.log(1+Math.max(0,i[1]-w)/I)}return[M,v]}}function Qr(s){return s}function va(s,t,e,i){let n=gt(t)/e[0],o=se(t)/e[1];return i?Math.min(s,Math.max(n,o)):Math.min(s,Math.min(n,o))}function Ca(s,t,e){let i=Math.min(s,t),n=50;return i*=Math.log(1+n*Math.max(0,s/t-1))/n+1,e&&(i=Math.max(i,e),i/=Math.log(1+n*Math.max(0,e/s-1))/n+1),pt(i,e/2,t*2)}function Bc(s,t,e,i){return t=t!==void 0?t:!0,function(n,o,a,l){if(n!==void 0){let u=s[0],d=s[s.length-1],m=e?va(u,e,a,i):u;if(l)return t?Ca(n,m,d):pt(n,d,m);let x=Math.min(m,n),E=Math.floor(Xn(s,x,o));return s[E]>m&&E1)x=e;else if(E>0){for(let C=0;Cn&&(n=d),o=l,a=u}return n}function Qc(s,t,e,i,n){for(let o=0,a=e.length;o0;){let x=d.pop(),E=d.pop(),C=0,T=s[E],w=s[E+1],M=s[x],v=s[x+1];for(let I=E+i;IC&&(m=I,C=P)}C>n&&(u[(m-t)/i]=1,E+i0&&w>C)&&(T<0&&M0&&M>T)){d=x,m=E;continue}o[a++]=d,o[a++]=m,l=d,u=m,d=x,m=E}return o[a++]=d,o[a++]=m,a}function su(s,t,e,i,n,o,a,l){for(let u=0,d=e.length;uo&&(d-l)*(o-u)-(n-l)*(m-u)>0&&a++:m<=o&&(d-l)*(o-u)-(n-l)*(m-u)<0&&a--,l=d,u=m}return a!==0}function eo(s,t,e,i,n,o){if(e.length===0||!Qi(s,t,e[0],i,n,o))return!1;for(let a=1,l=e.length;av&&(d=(m+x)/2,eo(s,t,e,i,d,T)&&(M=d,v=I)),m=x}return isNaN(M)&&(M=n[o]),a?(a.push(M,T,v),a):[M,T,v]}function hu(s,t,e,i,n){let o;for(t+=i;t=n[0]&&o[2]<=n[2]||o[1]>=n[1]&&o[3]<=n[3]?!0:hu(s,t,e,i,function(a,l){return Ec(n,a,l)}):!1}function ka(s,t,e,i,n){return!!(lu(s,t,e,i,n)||Qi(s,t,e,i,n[0],n[1])||Qi(s,t,e,i,n[0],n[3])||Qi(s,t,e,i,n[2],n[1])||Qi(s,t,e,i,n[2],n[3]))}function cu(s,t,e,i,n){if(!ka(s,t,e[0],i,n))return!1;if(e.length===1)return!0;for(let o=1,a=e.length;o0}function fu(s,t,e,i,n){n=n!==void 0?n:!1;for(let o=0,a=e.length;o1&&typeof arguments[e-1]=="function"&&(i=arguments[e-1],--e);let n=0;for(;n0}getInteracting(){return this.hints_[Yt.INTERACTING]>0}cancelAnimations(){this.setHint(Yt.ANIMATING,-this.hints_[Yt.ANIMATING]);let t;for(let e=0,i=this.animations_.length;e=0;--i){let n=this.animations_[i],o=!0;for(let a=0,l=n.length;a0?d/u.duration:1;m>=1?(u.complete=!0,m=1):o=!1;let x=u.easing(m);if(u.sourceCenter){let E=u.sourceCenter[0],C=u.sourceCenter[1],T=u.targetCenter[0],w=u.targetCenter[1];this.nextCenter_=u.targetCenter;let M=E+x*(T-E),v=C+x*(w-C);this.targetCenter_=[M,v]}if(u.sourceResolution&&u.targetResolution){let E=x===1?u.targetResolution:u.sourceResolution+x*(u.targetResolution-u.sourceResolution);if(u.anchor){let C=this.getViewportSize_(this.getRotation()),T=this.constraints_.resolution(E,0,C,!0);this.targetCenter_=this.calculateCenterZoom(T,u.anchor)}this.nextResolution_=u.targetResolution,this.targetResolution_=E,this.applyTargetState_(!0)}if(u.sourceRotation!==void 0&&u.targetRotation!==void 0){let E=x===1?Ae(u.targetRotation+Math.PI,2*Math.PI)-Math.PI:u.sourceRotation+x*(u.targetRotation-u.sourceRotation);if(u.anchor){let C=this.constraints_.rotation(E,!0);this.targetCenter_=this.calculateCenterRotate(C,u.anchor)}this.nextRotation_=u.targetRotation,this.targetRotation_=E}if(this.applyTargetState_(!0),e=!0,!u.complete)break}if(o){this.animations_[i]=null,this.setHint(Yt.ANIMATING,-1),this.nextCenter_=null,this.nextResolution_=NaN,this.nextRotation_=NaN;let a=n[0].callback;a&&io(a,!0)}}this.animations_=this.animations_.filter(Boolean),e&&this.updateAnimationKey_===void 0&&(this.updateAnimationKey_=requestAnimationFrame(this.updateAnimations_.bind(this)))}calculateCenterRotate(t,e){let i,n=this.getCenterInternal();return n!==void 0&&(i=[n[0]-e[0],n[1]-e[1]],ss(i,t-this.getRotation()),Oc(i,e)),i}calculateCenterZoom(t,e){let i,n=this.getCenterInternal(),o=this.getResolution();if(n!==void 0&&o!==void 0){let a=e[0]-t*(e[0]-n[0])/o,l=e[1]-t*(e[1]-n[1])/o;i=[a,l]}return i}getViewportSize_(t){let e=this.viewportSize_;if(t){let i=e[0],n=e[1];return[Math.abs(i*Math.cos(t))+Math.abs(n*Math.sin(t)),Math.abs(i*Math.sin(t))+Math.abs(n*Math.cos(t))]}return e}setViewportSize(t){this.viewportSize_=Array.isArray(t)?t.slice():[100,100],this.getAnimating()||this.resolveConstraints(0)}getCenter(){let t=this.getCenterInternal();return t&&Xs(t,this.getProjection())}getCenterInternal(){return this.get(Pe.CENTER)}getConstraints(){return this.constraints_}getConstrainResolution(){return this.get("constrainResolution")}getHints(t){return t!==void 0?(t[0]=this.hints_[0],t[1]=this.hints_[1],t):this.hints_.slice()}calculateExtent(t){let e=this.calculateExtentInternal(t);return os(e,this.getProjection())}calculateExtentInternal(t){t=t||this.getViewportSizeMinusPadding_();let e=this.getCenterInternal();Q(e,1);let i=this.getResolution();Q(i!==void 0,2);let n=this.getRotation();return Q(n!==void 0,3),Gs(e,i,n,t)}getMaxResolution(){return this.maxResolution_}getMinResolution(){return this.minResolution_}getMaxZoom(){return this.getZoomForResolution(this.minResolution_)}setMaxZoom(t){this.applyOptions_(this.getUpdatedOptions_({maxZoom:t}))}getMinZoom(){return this.getZoomForResolution(this.maxResolution_)}setMinZoom(t){this.applyOptions_(this.getUpdatedOptions_({minZoom:t}))}setConstrainResolution(t){this.applyOptions_(this.getUpdatedOptions_({constrainResolution:t}))}getProjection(){return this.projection_}getResolution(){return this.get(Pe.RESOLUTION)}getResolutions(){return this.resolutions_}getResolutionForExtent(t,e){return this.getResolutionForExtentInternal(Ke(t,this.getProjection()),e)}getResolutionForExtentInternal(t,e){e=e||this.getViewportSizeMinusPadding_();let i=gt(t)/e[0],n=se(t)/e[1];return Math.max(i,n)}getResolutionForValueFunction(t){t=t||2;let e=this.getConstrainedResolution(this.maxResolution_),i=this.minResolution_,n=Math.log(e/i)/Math.log(t);return function(o){return e/Math.pow(t,o*n)}}getRotation(){return this.get(Pe.ROTATION)}getValueForResolutionFunction(t){let e=Math.log(t||2),i=this.getConstrainedResolution(this.maxResolution_),n=this.minResolution_,o=Math.log(i/n)/e;return function(a){return Math.log(i/a)/e/o}}getViewportSizeMinusPadding_(t){let e=this.getViewportSize_(t),i=this.padding_;return i&&(e=[e[0]-i[1]-i[3],e[1]-i[0]-i[2]]),e}getState(){let t=this.getProjection(),e=this.getResolution(),i=this.getRotation(),n=this.getCenterInternal(),o=this.padding_;if(o){let a=this.getViewportSizeMinusPadding_();n=za(n,this.getViewportSize_(),[a[0]/2+o[3],a[1]/2+o[0]],e,i)}return{center:n.slice(0),projection:t!==void 0?t:null,resolution:e,nextCenter:this.nextCenter_,nextResolution:this.nextResolution_,nextRotation:this.nextRotation_,rotation:i,zoom:this.getZoom()}}getViewStateAndExtent(){return{viewState:this.getState(),extent:this.calculateExtent()}}getZoom(){let t,e=this.getResolution();return e!==void 0&&(t=this.getZoomForResolution(e)),t}getZoomForResolution(t){let e=this.minZoom_||0,i,n;if(this.resolutions_){let o=Xn(this.resolutions_,t,1);e=o,i=this.resolutions_[o],o==this.resolutions_.length-1?n=2:n=i/this.resolutions_[o+1]}else i=this.maxResolution_,n=this.zoomFactor_;return e+Math.log(i/t)/Math.log(n)}getResolutionForZoom(t){if(this.resolutions_){if(this.resolutions_.length<=1)return 0;let e=pt(Math.floor(t),0,this.resolutions_.length-2),i=this.resolutions_[e]/this.resolutions_[e+1];return this.resolutions_[e]/Math.pow(i,pt(t-e,0,1))}return this.maxResolution_/Math.pow(this.zoomFactor_,t-this.minZoom_)}fit(t,e){let i;if(Q(Array.isArray(t)||typeof t.getSimplifiedGeometry=="function",24),Array.isArray(t)){Q(!Hi(t),25);let n=Ke(t,this.getProjection());i=Da(n)}else if(t.getType()==="Circle"){let n=Ke(t.getExtent(),this.getProjection());i=Da(n),i.rotate(this.getRotation(),ii(n))}else{let n=$r();n?i=t.clone().transform(n,this.getProjection()):i=t}this.fitInternal(i,e)}rotatedExtentForGeometry(t){let e=this.getRotation(),i=Math.cos(e),n=Math.sin(-e),o=t.getFlatCoordinates(),a=t.getStride(),l=1/0,u=1/0,d=-1/0,m=-1/0;for(let x=0,E=o.length;x{this.dispatchEvent("sourceready")},0))),this.changed()}getFeatures(t){return this.renderer_?this.renderer_.getFeatures(t):Promise.resolve([])}getData(t){return!this.renderer_||!this.rendered?null:this.renderer_.getData(t)}isVisible(t){let e,i=this.getMapInternal();!t&&i&&(t=i.getView()),t instanceof Re?e={viewState:t.getState(),extent:t.calculateExtent()}:e=t,!e.layerStatesArray&&i&&(e.layerStatesArray=i.getLayerGroup().getLayerStatesArray());let n;e.layerStatesArray?n=e.layerStatesArray.find(a=>a.layer===this):n=this.getLayerState();let o=this.getExtent();return Ks(n,e.viewState)&&(!o||Ft(o,e.extent))}getAttributions(t){if(!this.isVisible(t))return[];let e,i=this.getSource();if(i&&(e=i.getAttributions()),!e)return[];let n=t instanceof Re?t.getViewStateAndExtent():t,o=e(n);return Array.isArray(o)||(o=[o]),o}render(t,e){let i=this.getRenderer();return i.prepareFrame(t)?(this.rendered=!0,i.renderFrame(t,e)):null}unrender(){this.rendered=!1}setMapInternal(t){t||this.unrender(),this.set(Et.MAP,t)}getMapInternal(){return this.get(Et.MAP)}setMap(t){this.mapPrecomposeKey_&&(ut(this.mapPrecomposeKey_),this.mapPrecomposeKey_=null),t||this.changed(),this.mapRenderKey_&&(ut(this.mapRenderKey_),this.mapRenderKey_=null),t&&(this.mapPrecomposeKey_=st(t,de.PRECOMPOSE,function(e){let n=e.frameState.layerStatesArray,o=this.getLayerState(!1);Q(!n.some(function(a){return a.layer===o.layer}),67),n.push(o)},this),this.mapRenderKey_=st(this,H.CHANGE,t.render,t),this.changed())}setSource(t){this.set(Et.SOURCE,t)}getRenderer(){return this.renderer_||(this.renderer_=this.createRenderer()),this.renderer_}hasRenderer(){return!!this.renderer_}createRenderer(){return null}disposeInternal(){this.renderer_&&(this.renderer_.dispose(),delete this.renderer_),this.setSource(null),super.disposeInternal()}};function Ks(s,t){if(!s.visible)return!1;let e=t.resolution;if(e=s.maxResolution)return!1;let i=t.zoom;return i>s.minZoom&&i<=s.maxZoom}var Sn=Ua;var Wa=class extends jn{constructor(t){super(),this.map_=t}dispatchRenderEvent(t,e){ft()}calculateMatrices2D(t){let e=t.viewState,i=t.coordinateToPixelTransform,n=t.pixelToCoordinateTransform;ue(i,t.size[0]/2,t.size[1]/2,1/e.resolution,-1/e.resolution,-e.rotation,-e.center[0],-e.center[1]),Hn(n,i)}forEachFeatureAtCoordinate(t,e,i,n,o,a,l,u){let d,m=e.viewState;function x(b,P,F,N){return o.call(a,P,b?F:null,N)}let E=m.projection,C=Vr(t.slice(),E),T=[[0,0]];if(E.canWrapX()&&n){let b=E.getExtent(),P=gt(b);T.push([-P,0],[P,0])}let w=e.layerStatesArray,M=w.length,v=[],I=[];for(let b=0;b=0;--P){let F=w[P],N=F.layer;if(N.hasRenderer()&&Ks(F,m)&&l.call(u,N)){let G=N.getRenderer(),W=N.getSource();if(G&&W){let Y=W.getWrapX()?C:t,Z=x.bind(null,F.managed);I[0]=Y[0]+T[b][0],I[1]=Y[1]+T[b][1],d=G.forEachFeatureAtCoordinate(I,e,i,Z,v)}if(d)return d}}if(v.length===0)return;let L=1/v.length;return v.forEach((b,P)=>b.distanceSq+=P*L),v.sort((b,P)=>b.distanceSq-P.distanceSq),v.some(b=>d=b.callback(b.feature,b.layer,b.geometry)),d}hasFeatureAtCoordinate(t,e,i,n,o,a){return this.forEachFeatureAtCoordinate(t,e,i,n,Ei,this,o,a)!==void 0}getMap(){return this.map_}renderFrame(t){ft()}flushDeclutterItems(t){}scheduleExpireIconCache(t){ts.canExpireCache()&&t.postRenderFunctions.push(eg)}};function eg(s,t){ts.expire()}var pu=Wa;var ja=class extends Jt{constructor(t,e,i,n){super(t),this.inversePixelTransform=e,this.frameState=i,this.context=n}},no=ja;var qs="ol-hidden",yu="ol-selectable",fe="ol-unselectable",Xa="ol-unsupported",ni="ol-control",Ya="ol-collapsed",ig=new RegExp(["^\\s*(?=(?:(?:[-a-z]+\\s*){0,2}(italic|oblique))?)","(?=(?:(?:[-a-z]+\\s*){0,2}(small-caps))?)","(?=(?:(?:[-a-z]+\\s*){0,2}(bold(?:er)?|lighter|[1-9]00 ))?)","(?:(?:normal|\\1|\\2|\\3)\\s*){0,3}((?:xx?-)?","(?:small|large)|medium|smaller|larger|[\\.\\d]+(?:\\%|in|[cem]m|ex|p[ctx]))","(?:\\s*\\/\\s*(normal|[\\.\\d]+(?:\\%|in|[cem]m|ex|p[ctx])?))",`?\\s*([-,\\"\\'\\sa-z]+?)\\s*$`].join(""),"i"),_u=["style","variant","weight","size","lineHeight","family"],Ka=function(s){let t=s.match(ig);if(!t)return null;let e={lineHeight:"normal",size:"1.2em",style:"normal",weight:"normal",variant:"normal"};for(let i=0,n=_u.length;i0&&(k=1e5/Math.pow(10,nt),B=r.substring(_,_+nt),yt=parseFloat(B)*k,D=r.substring(_+nt),ct=parseFloat(D)*k),j=yt+R,ot=ct+O,{easting:j,northing:ot,zoneLetter:p,zoneNumber:y,accuracy:k}}function me(r,h){for(var c=Jl.charCodeAt(h-1),g=1e5,f=!1;c!==r.charCodeAt(0);){if(++c===ge&&c++,c===be&&c++,c>Os){if(f)throw"Bad character: "+r;c=Un,f=!0}g+=1e5}return g}function ve(r,h){if(r>"V")throw"MGRSPoint given invalid Northing "+r;for(var c=$l.charCodeAt(h-1),g=0,f=!1;c!==r.charCodeAt(0);){if(++c===ge&&c++,c===be&&c++,c>Ps){if(f)throw"Bad character: "+r;c=Un,f=!0}g+=1e5}return g}function Ge(r){var h;switch(r){case"C":h=11e5;break;case"D":h=2e6;break;case"E":h=28e5;break;case"F":h=37e5;break;case"G":h=46e5;break;case"H":h=55e5;break;case"J":h=64e5;break;case"K":h=73e5;break;case"L":h=82e5;break;case"M":h=91e5;break;case"N":h=0;break;case"P":h=8e5;break;case"Q":h=17e5;break;case"R":h=26e5;break;case"S":h=35e5;break;case"T":h=44e5;break;case"U":h=53e5;break;case"V":h=62e5;break;case"W":h=7e6;break;case"X":h=79e5;break;default:h=-1}if(h>=0)return h;throw"Invalid zone letter: "+r}function Ce(r,h,c){if(!(this instanceof Ce))return new Ce(r,h,c);if(Array.isArray(r))this.x=r[0],this.y=r[1],this.z=r[2]||0;else if(typeof r=="object")this.x=r.x,this.y=r.y,this.z=r.z||0;else if(typeof r=="string"&&h===void 0){var g=r.split(",");this.x=parseFloat(g[0],10),this.y=parseFloat(g[1],10),this.z=parseFloat(g[2],10)||0}else this.x=r,this.y=h,this.z=c||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}function yi(r){var h=["Hotine_Oblique_Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin"],c=typeof r.PROJECTION=="object"?Object.keys(r.PROJECTION)[0]:r.PROJECTION;return"no_uoff"in r||"no_off"in r||h.indexOf(c)!==-1}function ei(r){var h,c=[];return c[0]=r*qf,h=r*r,c[0]+=h*Vf,c[1]=h*Zf,h*=r,c[0]+=h*Hf,c[1]+=h*Jf,c[2]=h*$f,c}function Ui(r,h){var c=r+r;return r+h[0]*Math.sin(c)+h[1]*Math.sin(c+c)+h[2]*Math.sin(c+c+c)}function xi(r,h,c,g){var f;return rmt&&f<=z+mt?(g.value=vt.AREA_1,f-=z):f>z+mt||f<=-(z+mt)?(g.value=vt.AREA_2,f=f>=0?f-xt:f+xt):(g.value=vt.AREA_3,f+=z)),f}function kt(r,h){var c=r+h;return c<-xt?c+=qt:c>+xt&&(c-=qt),c}function bs(r,h,c,g){for(var f=h;g;--g){var _=r(f);if(f-=_,Math.abs(_)=this.text.length)return;r=this.text[this.place++]}switch(this.state){case Ht:return this.neutral(r);case 2:return this.keyword(r);case 4:return this.quoted(r);case 5:return this.afterquote(r);case 3:return this.number(r);case-1:return}},t.prototype.afterquote=function(r){if(r==='"')return this.word+='"',void(this.state=4);if(wr.test(r))return this.word=this.word.trim(),void this.afterItem(r);throw new Error(`havn't handled "`+r+'" in afterquote yet, index '+this.place)},t.prototype.afterItem=function(r){return r===","?(this.word!==null&&this.currentObject.push(this.word),this.word=null,void(this.state=Ht)):r==="]"?(this.level--,this.word!==null&&(this.currentObject.push(this.word),this.word=null),this.state=Ht,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},t.prototype.number=function(r){if(!jl.test(r)){if(wr.test(r))return this.word=parseFloat(this.word),void this.afterItem(r);throw new Error(`havn't handled "`+r+'" in number yet, index '+this.place)}this.word+=r},t.prototype.quoted=function(r){r!=='"'?this.word+=r:this.state=5},t.prototype.keyword=function(r){if(Cf.test(r))this.word+=r;else{if(r==="["){var h=[];return h.push(this.word),this.level++,this.root===null?this.root=h:this.currentObject.push(h),this.stack.push(this.currentObject),this.currentObject=h,void(this.state=Ht)}if(!wr.test(r))throw new Error(`havn't handled "`+r+'" in keyword yet, index '+this.place);this.afterItem(r)}},t.prototype.neutral=function(r){if(Ho.test(r))return this.word=r,void(this.state=2);if(r==='"')return this.word="",void(this.state=4);if(jl.test(r))return this.word=r,void(this.state=3);{if(!wr.test(r))throw new Error(`havn't handled "`+r+'" in neutral yet, index '+this.place);this.afterItem(r)}},t.prototype.output=function(){for(;this.place90&&c*bt<-90&&h*bt>180&&h*bt<-180)return null;var g,f;if(Math.abs(Math.abs(c)-z)<=X)return null;if(this.sphere)g=this.x0+this.a*this.k0*J(h-this.long0),f=this.y0+this.a*this.k0*Math.log(Math.tan(mt+.5*c));else{var _=Math.sin(c),y=Ue(this.e,c,_);g=this.x0+this.a*this.k0*J(h-this.long0),f=this.y0-this.a*this.k0*Math.log(y)}return r.x=g,r.y=f,r},inverse:function(r){var h,c,g=r.x-this.x0,f=r.y-this.y0;if(this.sphere)c=z-2*Math.atan(Math.exp(-f/(this.a*this.k0)));else{var _=Math.exp(-f/(this.a*this.k0));if((c=As(this.e,_))===-9999)return null}return h=J(this.long0+g/(this.a*this.k0)),r.x=h,r.y=c,r},names:["Mercator","Popular Visualisation Pseudo Mercator","Mercator_1SP","Mercator_Auxiliary_Sphere","merc"]},{init:function(){},forward:M,inverse:M,names:["longlat","identity"]}],br={},Lr=[],wf={start:function(){If.forEach(v)},add:v,get:function(r){if(!r)return!1;var h=r.toLowerCase();return br[h]!==void 0&&Lr[br[h]]?Lr[br[h]]:void 0}},ht={};ht.MERIT={a:6378137,rf:298.257,ellipseName:"MERIT 1983"},ht.SGS85={a:6378136,rf:298.257,ellipseName:"Soviet Geodetic System 85"},ht.GRS80={a:6378137,rf:298.257222101,ellipseName:"GRS 1980(IUGG, 1980)"},ht.IAU76={a:6378140,rf:298.257,ellipseName:"IAU 1976"},ht.airy={a:6377563396e-3,b:635625691e-2,ellipseName:"Airy 1830"},ht.APL4={a:6378137,rf:298.25,ellipseName:"Appl. Physics. 1965"},ht.NWL9D={a:6378145,rf:298.25,ellipseName:"Naval Weapons Lab., 1965"},ht.mod_airy={a:6377340189e-3,b:6356034446e-3,ellipseName:"Modified Airy"},ht.andrae={a:637710443e-2,rf:300,ellipseName:"Andrae 1876 (Den., Iclnd.)"},ht.aust_SA={a:6378160,rf:298.25,ellipseName:"Australian Natl & S. Amer. 1969"},ht.GRS67={a:6378160,rf:298.247167427,ellipseName:"GRS 67(IUGG 1967)"},ht.bessel={a:6377397155e-3,rf:299.1528128,ellipseName:"Bessel 1841"},ht.bess_nam={a:6377483865e-3,rf:299.1528128,ellipseName:"Bessel 1841 (Namibia)"},ht.clrk66={a:63782064e-1,b:63565838e-1,ellipseName:"Clarke 1866"},ht.clrk80={a:6378249145e-3,rf:293.4663,ellipseName:"Clarke 1880 mod."},ht.clrk80ign={a:63782492e-1,b:6356515,rf:293.4660213,ellipseName:"Clarke 1880 (IGN)"},ht.clrk58={a:6378293645208759e-9,rf:294.2606763692654,ellipseName:"Clarke 1858"},ht.CPM={a:63757387e-1,rf:334.29,ellipseName:"Comm. des Poids et Mesures 1799"},ht.delmbr={a:6376428,rf:311.5,ellipseName:"Delambre 1810 (Belgium)"},ht.engelis={a:637813605e-2,rf:298.2566,ellipseName:"Engelis 1985"},ht.evrst30={a:6377276345e-3,rf:300.8017,ellipseName:"Everest 1830"},ht.evrst48={a:6377304063e-3,rf:300.8017,ellipseName:"Everest 1948"},ht.evrst56={a:6377301243e-3,rf:300.8017,ellipseName:"Everest 1956"},ht.evrst69={a:6377295664e-3,rf:300.8017,ellipseName:"Everest 1969"},ht.evrstSS={a:6377298556e-3,rf:300.8017,ellipseName:"Everest (Sabah & Sarawak)"},ht.fschr60={a:6378166,rf:298.3,ellipseName:"Fischer (Mercury Datum) 1960"},ht.fschr60m={a:6378155,rf:298.3,ellipseName:"Fischer 1960"},ht.fschr68={a:6378150,rf:298.3,ellipseName:"Fischer 1968"},ht.helmert={a:6378200,rf:298.3,ellipseName:"Helmert 1906"},ht.hough={a:6378270,rf:297,ellipseName:"Hough"},ht.intl={a:6378388,rf:297,ellipseName:"International 1909 (Hayford)"},ht.kaula={a:6378163,rf:298.24,ellipseName:"Kaula 1961"},ht.lerch={a:6378139,rf:298.257,ellipseName:"Lerch 1979"},ht.mprts={a:6397300,rf:191,ellipseName:"Maupertius 1738"},ht.new_intl={a:63781575e-1,b:63567722e-1,ellipseName:"New International 1967"},ht.plessis={a:6376523,rf:6355863,ellipseName:"Plessis 1817 (France)"},ht.krass={a:6378245,rf:298.3,ellipseName:"Krassovsky, 1942"},ht.SEasia={a:6378155,b:63567733205e-4,ellipseName:"Southeast Asia"},ht.walbeck={a:6376896,b:63558348467e-4,ellipseName:"Walbeck"},ht.WGS60={a:6378165,rf:298.3,ellipseName:"WGS 60"},ht.WGS66={a:6378145,rf:298.25,ellipseName:"WGS 66"},ht.WGS7={a:6378135,rf:298.26,ellipseName:"WGS 72"};var bf=ht.WGS84={a:6378137,rf:298.257223563,ellipseName:"WGS 84"};ht.sphere={a:6370997,b:6370997,ellipseName:"Normal Sphere (r=6370997)"};var Zt={};Zt.wgs84={towgs84:"0,0,0",ellipse:"WGS84",datumName:"WGS84"},Zt.ch1903={towgs84:"674.374,15.056,405.346",ellipse:"bessel",datumName:"swiss"},Zt.ggrs87={towgs84:"-199.87,74.79,246.62",ellipse:"GRS80",datumName:"Greek_Geodetic_Reference_System_1987"},Zt.nad83={towgs84:"0,0,0",ellipse:"GRS80",datumName:"North_American_Datum_1983"},Zt.nad27={nadgrids:"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat",ellipse:"clrk66",datumName:"North_American_Datum_1927"},Zt.potsdam={towgs84:"598.1,73.7,418.2,0.202,0.045,-2.455,6.7",ellipse:"bessel",datumName:"Potsdam Rauenberg 1950 DHDN"},Zt.carthage={towgs84:"-263.0,6.0,431.0",ellipse:"clark80",datumName:"Carthage 1934 Tunisia"},Zt.hermannskogel={towgs84:"577.326,90.129,463.919,5.137,1.474,5.297,2.4232",ellipse:"bessel",datumName:"Hermannskogel"},Zt.osni52={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"airy",datumName:"Irish National"},Zt.ire65={towgs84:"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15",ellipse:"mod_airy",datumName:"Ireland 1965"},Zt.rassadiran={towgs84:"-133.63,-157.5,-158.62",ellipse:"intl",datumName:"Rassadiran"},Zt.nzgd49={towgs84:"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993",ellipse:"intl",datumName:"New Zealand Geodetic Datum 1949"},Zt.osgb36={towgs84:"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894",ellipse:"airy",datumName:"Airy 1830"},Zt.s_jtsk={towgs84:"589,76,480",ellipse:"bessel",datumName:"S-JTSK (Ferro)"},Zt.beduaram={towgs84:"-106,-87,188",ellipse:"clrk80",datumName:"Beduaram"},Zt.gunung_segara={towgs84:"-403,684,41",ellipse:"bessel",datumName:"Gunung Segara Jakarta"},Zt.rnb72={towgs84:"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1",ellipse:"intl",datumName:"Reseau National Belge 1972"};var Kl={};tt.projections=wf,tt.projections.start();var Lf=function(r,h,c){if(V(r,h)||r.datum_type===un||h.datum_type===un)return c;var g=r.a,f=r.es;if(r.datum_type===vi){if(U(r,!1,c)!==0)return;g=6378137,f=.0066943799901413165}var _=h.a,y=h.b,p=h.es;return h.datum_type===vi&&(_=6378137,y=6356752314e-3,p=.0066943799901413165),f!==p||g!==_||At(r.datum_type)||At(h.datum_type)?(c=K(c,f,g),At(r.datum_type)&&(c=dt(c,r.datum_type,r.datum_params)),At(h.datum_type)&&(c=lt(c,h.datum_type,h.datum_params)),c=H(c,p,_,y),h.datum_type!==vi||U(h,!0,c)===0?c:void 0):c},ql=function(r,h,c){var g,f,_,y=c.x,p=c.y,S=c.z||0,R={};for(_=0;_<3;_++)if(!h||_!==2||c.z!==void 0)switch(_===0?(g=y,f="ew".indexOf(r.axis[_])!==-1?"x":"y"):_===1?(g=p,f="ns".indexOf(r.axis[_])!==-1?"y":"x"):(g=S,f="z"),r.axis[_]){case"e":R[f]=g;break;case"w":R[f]=-g;break;case"n":R[f]=g;break;case"s":R[f]=-g;break;case"u":c[f]!==void 0&&(R.z=g);break;case"d":c[f]!==void 0&&(R.z=-g);break;default:return null}return R},Vl=function(r){var h={x:r[0],y:r[1]};return r.length>2&&(h.z=r[2]),r.length>3&&(h.m=r[3]),h},Af=function(r){Mt(r.x),Mt(r.y)},Hl=tt("WGS84"),Zl=6,Jl="AJSAJS",$l="AFAFAF",Un=65,ge=73,be=79,Ps=86,Os=90,Pf={forward:ln,inverse:function(r){var h=we(Qt(r.toUpperCase()));return h.lat&&h.lon?[h.lon,h.lat,h.lon,h.lat]:[h.left,h.bottom,h.right,h.top]},toPoint:pi};Ce.fromMGRS=function(r){return new Ce(pi(r))},Ce.prototype.toMGRS=function(r){return ln([this.x,this.y],r)};var Ql=.01068115234375,tc=function(r){var h=[];h[0]=1-r*(.25+r*(.046875+r*(.01953125+r*Ql))),h[1]=r*(.75-r*(.046875+r*(.01953125+r*Ql)));var c=r*r;return h[2]=c*(.46875-r*(.013020833333333334+.007120768229166667*r)),c*=r,h[3]=c*(.3645833333333333-.005696614583333333*r),h[4]=c*r*.3076171875,h},Ar=function(r,h,c,g){return c*=h,h*=h,g[0]*r-c*(g[1]+h*(g[2]+h*(g[3]+h*g[4])))},ec=function(r,h,c){for(var g=1/(1-h),f=r,_=20;_;--_){var y=Math.sin(f),p=1-h*y*y;if(p=(Ar(f,y,Math.cos(f),c)-r)*(p*Math.sqrt(p))*g,f-=p,Math.abs(p)X?Math.tan(_):0,D=Math.pow(B,2),j=Math.pow(D,2);h=1-this.es*Math.pow(p,2),R/=Math.sqrt(h);var ot=Ar(_,p,S,this.en);c=this.a*(this.k0*R*(1+O/6*(1-D+A+O/20*(5-18*D+j+14*A-58*D*A+O/42*(61+179*j-j*D-479*D)))))+this.x0,g=this.a*(this.k0*(ot-this.ml0+p*y*R/2*(1+O/12*(5-D+9*A+4*k+O/30*(61+j-58*D+270*A-330*D*A+O/56*(1385+543*j-j*D-3111*D))))))+this.y0}else{var nt=S*Math.sin(y);if(Math.abs(Math.abs(nt)-1)=1){if(nt-1>X)return 93;g=0}else g=Math.acos(g);_<0&&(g=-g),g=this.a*this.k0*(g-this.lat0)+this.y0}return r.x=c,r.y=g,r},inverse:function(r){var h,c,g,f,_=(r.x-this.x0)*(1/this.a),y=(r.y-this.y0)*(1/this.a);if(this.es)if(h=this.ml0+y/this.k0,c=ec(h,this.es,this.en),Math.abs(c)X?Math.tan(c):0,O=this.ep2*Math.pow(S,2),A=Math.pow(O,2),k=Math.pow(R,2),B=Math.pow(k,2);h=1-this.es*Math.pow(p,2);var D=_*Math.sqrt(h)/this.k0,j=Math.pow(D,2);g=c-(h*=R)*j/(1-this.es)*.5*(1-j/12*(5+3*k-9*O*k+O-4*A-j/30*(61+90*k-252*O*k+45*B+46*O-j/56*(1385+3633*k+4095*B+1574*B*k)))),f=J(this.long0+D*(1-j/6*(1+2*k+O-j/20*(5+28*k+24*B+8*O*k+6*O-j/42*(61+662*k+1320*B+720*B*k))))/S)}else g=z*Ls(y),f=0;else{var ot=Math.exp(_/this.k0),nt=.5*(ot-1/ot),yt=this.lat0+y/this.k0,ct=Math.cos(yt);h=Math.sqrt((1-Math.pow(ct,2))/(1+Math.pow(nt,2))),g=Math.asin(h),y<0&&(g=-g),f=nt===0&&ct===0?0:J(Math.atan2(nt,ct)+this.long0)}return r.x=f,r.y=g,r},names:["Fast_Transverse_Mercator","Fast Transverse Mercator"]},ic=function(r){var h=Math.exp(r);return h=(h-1/h)/2},Be=function(r,h){r=Math.abs(r),h=Math.abs(h);var c=Math.max(r,h),g=Math.min(r,h)/(c||1);return c*Math.sqrt(1+Math.pow(g,2))},Of=function(r){var h=1+r,c=h-1;return c===0?r:r*Math.log(h)/c},Ff=function(r){var h=Math.abs(r);return h=Of(h*(1+h/(Be(1,h)+1))),r<0?-h:h},Zo=function(r,h){for(var c,g=2*Math.cos(2*h),f=r.length-1,_=r[f],y=0;--f>=0;)c=g*_-y+r[f],y=_,_=c;return h+c*Math.sin(2*h)},kf=function(r,h){for(var c,g=2*Math.cos(h),f=r.length-1,_=r[f],y=0;--f>=0;)c=g*_-y+r[f],y=_,_=c;return Math.sin(h)*c},Nf=function(r){var h=Math.exp(r);return h=(h+1/h)/2},nc=function(r,h,c){for(var g,f,_=Math.sin(h),y=Math.cos(h),p=ic(c),S=Nf(c),R=2*y*S,O=-2*_*p,A=r.length-1,k=r[A],B=0,D=0,j=0;--A>=0;)g=D,f=B,k=R*(D=k)-g-O*(B=j)+r[A],j=O*D-f+R*B;return R=_*S,O=y*p,[R*k-O*j,R*j+O*k]},Or={init:function(){if(!this.approx&&(isNaN(this.es)||this.es<=0))throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION["Fast_Transverse_Mercator"] in the WKT.');this.approx&&(Pr.init.apply(this),this.forward=Pr.forward,this.inverse=Pr.inverse),this.x0=this.x0!==void 0?this.x0:0,this.y0=this.y0!==void 0?this.y0:0,this.long0=this.long0!==void 0?this.long0:0,this.lat0=this.lat0!==void 0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var r=this.es/(1+Math.sqrt(1-this.es)),h=r/(2-r),c=h;this.cgb[0]=h*(2+h*(-2/3+h*(h*(116/45+h*(26/45+h*(-2854/675)))-2))),this.cbg[0]=h*(h*(2/3+h*(4/3+h*(-82/45+h*(32/45+h*(4642/4725)))))-2),c*=h,this.cgb[1]=c*(7/3+h*(h*(-227/45+h*(2704/315+h*(2323/945)))-1.6)),this.cbg[1]=c*(5/3+h*(-16/15+h*(-13/9+h*(904/315+h*(-1522/945))))),c*=h,this.cgb[2]=c*(56/15+h*(-136/35+h*(-1262/105+h*(73814/2835)))),this.cbg[2]=c*(-26/15+h*(34/21+h*(1.6+h*(-12686/2835)))),c*=h,this.cgb[3]=c*(4279/630+h*(-332/35+h*(-399572/14175))),this.cbg[3]=c*(1237/630+h*(h*(-24832/14175)-2.4)),c*=h,this.cgb[4]=c*(4174/315+h*(-144838/6237)),this.cbg[4]=c*(-734/315+h*(109598/31185)),c*=h,this.cgb[5]=c*(601676/22275),this.cbg[5]=c*(444337/155925),c=Math.pow(h,2),this.Qn=this.k0/(1+h)*(1+c*(.25+c*(1/64+c/256))),this.utg[0]=h*(h*(2/3+h*(-37/96+h*(1/360+h*(81/512+h*(-96199/604800)))))-.5),this.gtu[0]=h*(.5+h*(-2/3+h*(5/16+h*(41/180+h*(-127/288+h*(7891/37800)))))),this.utg[1]=c*(-1/48+h*(-1/15+h*(437/1440+h*(-46/105+h*(1118711/3870720))))),this.gtu[1]=c*(13/48+h*(h*(557/1440+h*(281/630+h*(-1983433/1935360)))-.6)),c*=h,this.utg[2]=c*(-17/480+h*(37/840+h*(209/4480+h*(-5569/90720)))),this.gtu[2]=c*(61/240+h*(-103/140+h*(15061/26880+h*(167603/181440)))),c*=h,this.utg[3]=c*(-4397/161280+h*(11/504+h*(830251/7257600))),this.gtu[3]=c*(49561/161280+h*(-179/168+h*(6601661/7257600))),c*=h,this.utg[4]=c*(-4583/161280+h*(108847/3991680)),this.gtu[4]=c*(34729/80640+h*(-3418889/1995840)),c*=h,this.utg[5]=-.03233083094085698*c,this.gtu[5]=.6650675310896665*c;var g=Zo(this.cbg,this.lat0);this.Zb=-this.Qn*(g+kf(this.gtu,2*g))},forward:function(r){var h=J(r.x-this.long0),c=r.y;c=Zo(this.cbg,c);var g=Math.sin(c),f=Math.cos(c),_=Math.sin(h),y=Math.cos(h);c=Math.atan2(g,y*f),h=Math.atan2(_*f,Be(g,f*y)),h=Ff(Math.tan(h));var p=nc(this.gtu,2*c,2*h);c+=p[0],h+=p[1];var S,R;return Math.abs(h)<=2.623395162778?(S=this.a*(this.Qn*h)+this.x0,R=this.a*(this.Qn*c+this.Zb)+this.y0):(S=1/0,R=1/0),r.x=S,r.y=R,r},inverse:function(r){var h=(r.x-this.x0)*(1/this.a),c=(r.y-this.y0)*(1/this.a);c=(c-this.Zb)/this.Qn,h/=this.Qn;var g,f;if(Math.abs(h)<=2.623395162778){var _=nc(this.utg,2*c,2*h);c+=_[0],h+=_[1],h=Math.atan(ic(h));var y=Math.sin(c),p=Math.cos(c),S=Math.sin(h),R=Math.cos(h);c=Math.atan2(y*R,Be(S,R*p)),h=Math.atan2(S,R*p),g=J(h+this.long0),f=Zo(this.cgb,c)}else g=1/0,f=1/0;return r.x=g,r.y=f,r},names:["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc","Transverse_Mercator","Transverse Mercator","tmerc"]},Df=function(r,h){if(r===void 0){if((r=Math.floor(30*(J(h)+Math.PI)/Math.PI)+1)<0)return 0;if(r>60)return 60}return r},Gf={init:function(){var r=Df(this.zone,this.long0);if(r===void 0)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(r)-183)*Bt,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,Or.init.apply(this),this.forward=Or.forward,this.inverse=Or.inverse},names:["Universal Transverse Mercator System","utm"],dependsOn:"etmerc"},Jo=function(r,h){return Math.pow((1-r)/(1+r),h)},zf=20,$o={init:function(){var r=Math.sin(this.lat0),h=Math.cos(this.lat0);h*=h,this.rc=Math.sqrt(1-this.es)/(1-this.es*r*r),this.C=Math.sqrt(1+this.es*h*h/(1-this.es)),this.phic0=Math.asin(r/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+mt)/(Math.pow(Math.tan(.5*this.lat0+mt),this.C)*Jo(this.e*r,this.ratexp))},forward:function(r){var h=r.x,c=r.y;return r.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*c+mt),this.C)*Jo(this.e*Math.sin(c),this.ratexp))-z,r.x=this.C*h,r},inverse:function(r){for(var h=r.x/this.C,c=r.y,g=Math.pow(Math.tan(.5*c+mt)/this.K,1/this.C),f=zf;f>0&&(c=2*Math.atan(g*Jo(this.e*Math.sin(r.y),-.5*this.e))-z,!(Math.abs(c-r.y)<1e-14));--f)r.y=c;return f?(r.x=h,r.y=c,r):null},names:["gauss"]},Uf={init:function(){$o.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title="Oblique Stereographic Alternative"))},forward:function(r){var h,c,g,f;return r.x=J(r.x-this.long0),$o.forward.apply(this,[r]),h=Math.sin(r.y),c=Math.cos(r.y),g=Math.cos(r.x),f=this.k0*this.R2/(1+this.sinc0*h+this.cosc0*c*g),r.x=f*c*Math.sin(r.x),r.y=f*(this.cosc0*h-this.sinc0*c*g),r.x=this.a*r.x+this.x0,r.y=this.a*r.y+this.y0,r},inverse:function(r){var h,c,g,f,_;if(r.x=(r.x-this.x0)/this.a,r.y=(r.y-this.y0)/this.a,r.x/=this.k0,r.y/=this.k0,_=Math.sqrt(r.x*r.x+r.y*r.y)){var y=2*Math.atan2(_,this.R2);h=Math.sin(y),c=Math.cos(y),f=Math.asin(c*this.sinc0+r.y*h*this.cosc0/_),g=Math.atan2(r.x*h,_*this.cosc0*c-r.y*this.sinc0*h)}else f=this.phic0,g=0;return r.x=g,r.y=f,$o.inverse.apply(this,[r]),r.x=J(r.x+this.long0),r},names:["Stereographic_North_Pole","Oblique_Stereographic","sterea","Oblique Stereographic Alternative","Double_Stereographic"]},Bf={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?this.k0===1&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=X&&(this.k0=.5*(1+Ls(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=X&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),this.k0===1&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=X&&Math.abs(Math.cos(this.lat_ts))>X&&(this.k0=.5*this.cons*ii(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/Ue(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=ii(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-z,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(r){var h,c,g,f,_,y,p=r.x,S=r.y,R=Math.sin(S),O=Math.cos(S),A=J(p-this.long0);return Math.abs(Math.abs(p-this.long0)-Math.PI)<=X&&Math.abs(S+this.lat0)<=X?(r.x=NaN,r.y=NaN,r):this.sphere?(h=2*this.k0/(1+this.sinlat0*R+this.coslat0*O*Math.cos(A)),r.x=this.a*h*O*Math.sin(A)+this.x0,r.y=this.a*h*(this.coslat0*R-this.sinlat0*O*Math.cos(A))+this.y0,r):(c=2*Math.atan(this.ssfn_(S,R,this.e))-z,f=Math.cos(c),g=Math.sin(c),Math.abs(this.coslat0)<=X?(_=Ue(this.e,S*this.con,this.con*R),y=2*this.a*this.k0*_/this.cons,r.x=this.x0+y*Math.sin(p-this.long0),r.y=this.y0-this.con*y*Math.cos(p-this.long0),r):(Math.abs(this.sinlat0)0?this.long0+Math.atan2(r.x,-1*r.y):this.long0+Math.atan2(r.x,r.y):this.long0+Math.atan2(r.x*Math.sin(p),y*this.coslat0*Math.cos(p)-r.y*this.sinlat0*Math.sin(p))),r.x=h,r.y=c,r)}if(Math.abs(this.coslat0)<=X){if(y<=X)return c=this.lat0,h=this.long0,r.x=h,r.y=c,r;r.x*=this.con,r.y*=this.con,g=y*this.cons/(2*this.a*this.k0),c=this.con*As(this.e,g),h=this.con*J(this.con*this.long0+Math.atan2(r.x,-1*r.y))}else f=2*Math.atan(y*this.cosX0/(2*this.a*this.k0*this.ms1)),h=this.long0,y<=X?_=this.X0:(_=Math.asin(Math.cos(f)*this.sinX0+r.y*Math.sin(f)*this.cosX0/y),h=J(this.long0+Math.atan2(r.x*Math.sin(f),y*this.cosX0*Math.cos(f)-r.y*this.sinX0*Math.sin(f)))),c=-1*As(this.e,Math.tan(.5*(z+_)));return r.x=h,r.y=c,r},names:["stere","Stereographic_South_Pole","Polar Stereographic (variant B)","Polar_Stereographic"],ssfn_:function(r,h,c){return h*=c,Math.tan(.5*(z+r))*Math.pow((1-h)/(1+h),.5*c)}},Wf={init:function(){var r=this.lat0;this.lambda0=this.long0;var h=Math.sin(r),c=this.a,g=1/this.rf,f=2*g-Math.pow(g,2),_=this.e=Math.sqrt(f);this.R=this.k0*c*Math.sqrt(1-f)/(1-f*Math.pow(h,2)),this.alpha=Math.sqrt(1+f/(1-f)*Math.pow(Math.cos(r),4)),this.b0=Math.asin(h/this.alpha);var y=Math.log(Math.tan(Math.PI/4+this.b0/2)),p=Math.log(Math.tan(Math.PI/4+r/2)),S=Math.log((1+_*h)/(1-_*h));this.K=y-this.alpha*p+this.alpha*_/2*S},forward:function(r){var h=Math.log(Math.tan(Math.PI/4-r.y/2)),c=this.e/2*Math.log((1+this.e*Math.sin(r.y))/(1-this.e*Math.sin(r.y))),g=-this.alpha*(h+c)+this.K,f=2*(Math.atan(Math.exp(g))-Math.PI/4),_=this.alpha*(r.x-this.lambda0),y=Math.atan(Math.sin(_)/(Math.sin(this.b0)*Math.tan(f)+Math.cos(this.b0)*Math.cos(_))),p=Math.asin(Math.cos(this.b0)*Math.sin(f)-Math.sin(this.b0)*Math.cos(f)*Math.cos(_));return r.y=this.R/2*Math.log((1+Math.sin(p))/(1-Math.sin(p)))+this.y0,r.x=this.R*y+this.x0,r},inverse:function(r){for(var h=r.x-this.x0,c=r.y-this.y0,g=h/this.R,f=2*(Math.atan(Math.exp(c/this.R))-Math.PI/4),_=Math.asin(Math.cos(this.b0)*Math.sin(f)+Math.sin(this.b0)*Math.cos(f)*Math.cos(g)),y=Math.atan(Math.sin(g)/(Math.cos(this.b0)*Math.cos(g)-Math.sin(this.b0)*Math.tan(f))),p=this.lambda0+y/this.alpha,S=0,R=_,O=-1e3,A=0;Math.abs(R-O)>1e-7;){if(++A>20)return;S=1/this.alpha*(Math.log(Math.tan(Math.PI/4+_/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(R))/2)),O=R,R=2*Math.atan(Math.exp(S))-Math.PI/2}return r.x=p,r.y=R,r},names:["somerc"]},Bn=1e-7,jf={init:function(){var r,h,c,g,f,_,y,p,S,R,O,A=0,k=0,B=0,D=0,j=0,ot=0,nt=0;this.no_off=yi(this),this.no_rot="no_rot"in this;var yt=!1;"alpha"in this&&(yt=!0);var ct=!1;if("rectified_grid_angle"in this&&(ct=!0),yt&&(nt=this.alpha),ct&&(A=this.rectified_grid_angle*Bt),yt||ct)k=this.longc;else if(B=this.long1,j=this.lat1,D=this.long2,ot=this.lat2,Math.abs(j-ot)<=Bn||(r=Math.abs(j))<=Bn||Math.abs(r-z)<=Bn||Math.abs(Math.abs(this.lat0)-z)<=Bn||Math.abs(Math.abs(ot)-z)<=Bn)throw new Error;var Gt=1-this.es;h=Math.sqrt(Gt),Math.abs(this.lat0)>X?(p=Math.sin(this.lat0),c=Math.cos(this.lat0),r=1-this.es*p*p,this.B=c*c,this.B=Math.sqrt(1+this.es*this.B*this.B/Gt),this.A=this.B*this.k0*h/r,(f=(g=this.B*h/(c*Math.sqrt(r)))*g-1)<=0?f=0:(f=Math.sqrt(f),this.lat0<0&&(f=-f)),this.E=f+=g,this.E*=Math.pow(Ue(this.e,this.lat0,p),this.B)):(this.B=1/h,this.A=this.k0,this.E=g=f=1),yt||ct?(yt?(O=Math.asin(Math.sin(nt)/g),ct||(A=nt)):(O=A,nt=Math.asin(g*Math.sin(O))),this.lam0=k-Math.asin(.5*(f-1/f)*Math.tan(O))/this.B):(_=Math.pow(Ue(this.e,j,Math.sin(j)),this.B),y=Math.pow(Ue(this.e,ot,Math.sin(ot)),this.B),f=this.E/_,S=(y-_)/(y+_),R=((R=this.E*this.E)-y*_)/(R+y*_),(r=B-D)<-Math.pi?D-=qt:r>Math.pi&&(D+=qt),this.lam0=J(.5*(B+D)-Math.atan(R*Math.tan(.5*this.B*(B-D))/S)/this.B),O=Math.atan(2*Math.sin(this.B*J(B-this.lam0))/(f-1/f)),A=nt=Math.asin(g*Math.sin(O))),this.singam=Math.sin(O),this.cosgam=Math.cos(O),this.sinrot=Math.sin(A),this.cosrot=Math.cos(A),this.rB=1/this.B,this.ArB=this.A*this.rB,this.BrA=1/this.ArB,this.no_off?this.u_0=0:(this.u_0=Math.abs(this.ArB*Math.atan(Math.sqrt(g*g-1)/Math.cos(nt))),this.lat0<0&&(this.u_0=-this.u_0)),f=.5*O,this.v_pole_n=this.ArB*Math.log(Math.tan(mt-f)),this.v_pole_s=this.ArB*Math.log(Math.tan(mt+f))},forward:function(r){var h,c,g,f,_,y,p,S,R={};if(r.x=r.x-this.lam0,Math.abs(Math.abs(r.y)-z)>X){if(_=this.E/Math.pow(Ue(this.e,r.y,Math.sin(r.y)),this.B),y=1/_,h=.5*(_-y),c=.5*(_+y),f=Math.sin(this.B*r.x),g=(h*this.singam-f*this.cosgam)/c,Math.abs(Math.abs(g)-1)0?this.v_pole_n:this.v_pole_s,p=this.ArB*r.y;return this.no_rot?(R.x=p,R.y=S):(p-=this.u_0,R.x=S*this.cosrot+p*this.sinrot,R.y=p*this.cosrot-S*this.sinrot),R.x=this.a*R.x+this.x0,R.y=this.a*R.y+this.y0,R},inverse:function(r){var h,c,g,f,_,y,p,S={};if(r.x=(r.x-this.x0)*(1/this.a),r.y=(r.y-this.y0)*(1/this.a),this.no_rot?(c=r.y,h=r.x):(c=r.x*this.cosrot-r.y*this.sinrot,h=r.y*this.cosrot+r.x*this.sinrot+this.u_0),g=Math.exp(-this.BrA*c),f=.5*(g-1/g),_=.5*(g+1/g),y=Math.sin(this.BrA*h),p=(y*this.cosgam+f*this.singam)/_,Math.abs(Math.abs(p)-1)X?this.ns=Math.log(g/p)/Math.log(f/S):this.ns=h,isNaN(this.ns)&&(this.ns=h),this.f0=g/(this.ns*Math.pow(f,this.ns)),this.rh=this.a*this.f0*Math.pow(R,this.ns),this.title||(this.title="Lambert Conformal Conic")}},forward:function(r){var h=r.x,c=r.y;Math.abs(2*Math.abs(c)-Math.PI)<=X&&(c=Ls(c)*(z-2*X));var g,f,_=Math.abs(Math.abs(c)-z);if(_>X)g=Ue(this.e,c,Math.sin(c)),f=this.a*this.f0*Math.pow(g,this.ns);else{if((_=c*this.ns)<=0)return null;f=0}var y=this.ns*J(h-this.long0);return r.x=this.k0*(f*Math.sin(y))+this.x0,r.y=this.k0*(this.rh-f*Math.cos(y))+this.y0,r},inverse:function(r){var h,c,g,f,_,y=(r.x-this.x0)/this.k0,p=this.rh-(r.y-this.y0)/this.k0;this.ns>0?(h=Math.sqrt(y*y+p*p),c=1):(h=-Math.sqrt(y*y+p*p),c=-1);var S=0;if(h!==0&&(S=Math.atan2(c*y,c*p)),h!==0||this.ns>0){if(c=1/this.ns,g=Math.pow(h/(this.a*this.f0),c),(f=As(this.e,g))===-9999)return null}else f=-z;return _=J(S/this.ns+this.long0),r.x=_,r.y=f,r},names:["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_1SP","Lambert_Conformal_Conic_2SP","lcc","Lambert Conic Conformal (1SP)","Lambert Conic Conformal (2SP)"]},Yf={init:function(){this.a=6377397155e-3,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(r){var h,c,g,f,_,y,p,S=r.x,R=r.y,O=J(S-this.long0);return h=Math.pow((1+this.e*Math.sin(R))/(1-this.e*Math.sin(R)),this.alfa*this.e/2),c=2*(Math.atan(this.k*Math.pow(Math.tan(R/2+this.s45),this.alfa)/h)-this.s45),g=-O*this.alfa,f=Math.asin(Math.cos(this.ad)*Math.sin(c)+Math.sin(this.ad)*Math.cos(c)*Math.cos(g)),_=Math.asin(Math.cos(c)*Math.sin(g)/Math.cos(f)),y=this.n*_,p=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(f/2+this.s45),this.n),r.y=p*Math.cos(y)/1,r.x=p*Math.sin(y)/1,this.czech||(r.y*=-1,r.x*=-1),r},inverse:function(r){var h,c,g,f,_,y,p,S=r.x;r.x=r.y,r.y=S,this.czech||(r.y*=-1,r.x*=-1),_=Math.sqrt(r.x*r.x+r.y*r.y),f=Math.atan2(r.y,r.x)/Math.sin(this.s0),g=2*(Math.atan(Math.pow(this.ro0/_,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),h=Math.asin(Math.cos(this.ad)*Math.sin(g)-Math.sin(this.ad)*Math.cos(g)*Math.cos(f)),c=Math.asin(Math.cos(g)*Math.sin(f)/Math.cos(h)),r.x=this.long0-c/this.alfa,y=h,p=0;var R=0;do r.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(h/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(y))/(1-this.e*Math.sin(y)),this.e/2))-this.s45),Math.abs(y-r.y)<1e-10&&(p=1),y=r.y,R+=1;while(p===0&&R<15);return R>=15?null:r},names:["Krovak","krovak"]},le=function(r,h,c,g,f){return r*f-h*Math.sin(2*f)+c*Math.sin(4*f)-g*Math.sin(6*f)},Fs=function(r){return 1-.25*r*(1+r/16*(3+1.25*r))},ks=function(r){return .375*r*(1+.25*r*(1+.46875*r))},Ns=function(r){return .05859375*r*r*(1+.75*r)},Ds=function(r){return r*r*r*(35/3072)},Wn=function(r,h,c){var g=h*c;return r/Math.sqrt(1-g*g)},jn=function(r){return Math.abs(r)1e-7?(c=r*h,(1-r*r)*(h/(1-c*c)-.5/r*Math.log((1-c)/(1+c)))):2*h},qf=.3333333333333333,Vf=.17222222222222222,Hf=.10257936507936508,Zf=.06388888888888888,Jf=.0664021164021164,$f=.016415012942191543,Qf={init:function(){var r=Math.abs(this.lat0);if(Math.abs(r-z)0){var h;switch(this.qp=Wi(this.e,1),this.mmf=.5/(1-this.es),this.apa=ei(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),h=Math.sin(this.lat0),this.sinb1=Wi(this.e,h)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*h*h)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(r){var h,c,g,f,_,y,p,S,R,O,A=r.x,k=r.y;if(A=J(A-this.long0),this.sphere){if(_=Math.sin(k),O=Math.cos(k),g=Math.cos(A),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((c=this.mode===this.EQUIT?1+O*g:1+this.sinph0*_+this.cosph0*O*g)<=X)return null;h=(c=Math.sqrt(2/c))*O*Math.sin(A),c*=this.mode===this.EQUIT?_:this.cosph0*_-this.sinph0*O*g}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(g=-g),Math.abs(k+this.lat0)=0?(h=(R=Math.sqrt(y))*f,c=g*(this.mode===this.S_POLE?R:-R)):h=c=0}}return r.x=this.a*h+this.x0,r.y=this.a*c+this.y0,r},inverse:function(r){r.x-=this.x0,r.y-=this.y0;var h,c,g,f,_,y,p,S=r.x/this.a,R=r.y/this.a;if(this.sphere){var O,A=0,k=0;if(O=Math.sqrt(S*S+R*R),(c=.5*O)>1)return null;switch(c=2*Math.asin(c),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(k=Math.sin(c),A=Math.cos(c)),this.mode){case this.EQUIT:c=Math.abs(O)<=X?0:Math.asin(R*k/O),S*=k,R=A*O;break;case this.OBLIQ:c=Math.abs(O)<=X?this.lat0:Math.asin(A*this.sinph0+R*k*this.cosph0/O),S*=k*this.cosph0,R=(A-Math.sin(c)*this.sinph0)*O;break;case this.N_POLE:R=-R,c=z-c;break;case this.S_POLE:c-=z}h=R!==0||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(S,R):0}else{if(p=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(S/=this.dd,R*=this.dd,(y=Math.sqrt(S*S+R*R))1&&(r=r>1?1:-1),Math.asin(r)},tm={init:function(){Math.abs(this.lat1+this.lat2)X?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(r){var h=r.x,c=r.y;this.sin_phi=Math.sin(c),this.cos_phi=Math.cos(c);var g=Wi(this.e3,this.sin_phi),f=this.a*Math.sqrt(this.c-this.ns0*g)/this.ns0,_=this.ns0*J(h-this.long0),y=f*Math.sin(_)+this.x0,p=this.rh-f*Math.cos(_)+this.y0;return r.x=y,r.y=p,r},inverse:function(r){var h,c,g,f,_,y;return r.x-=this.x0,r.y=this.rh-r.y+this.y0,this.ns0>=0?(h=Math.sqrt(r.x*r.x+r.y*r.y),g=1):(h=-Math.sqrt(r.x*r.x+r.y*r.y),g=-1),f=0,h!==0&&(f=Math.atan2(g*r.x,g*r.y)),g=h*this.ns0/this.a,this.sphere?y=Math.asin((this.c-g*g)/(2*this.ns0)):(c=(this.c-g*g)/this.ns0,y=this.phi1z(this.e3,c)),_=J(f/this.ns0+this.long0),r.x=_,r.y=y,r},names:["Albers_Conic_Equal_Area","Albers","aea"],phi1z:function(r,h){var c,g,f,_,y,p=ji(.5*h);if(r0||Math.abs(_)<=X?(y=this.x0+1*this.a*c*Math.sin(g)/_,p=this.y0+1*this.a*(this.cos_p14*h-this.sin_p14*c*f)/_):(y=this.x0+this.infinity_dist*c*Math.sin(g),p=this.y0+this.infinity_dist*(this.cos_p14*h-this.sin_p14*c*f)),r.x=y,r.y=p,r},inverse:function(r){var h,c,g,f,_,y;return r.x=(r.x-this.x0)/this.a,r.y=(r.y-this.y0)/this.a,r.x/=this.k0,r.y/=this.k0,(h=Math.sqrt(r.x*r.x+r.y*r.y))?(f=Math.atan2(h,this.rc),c=Math.sin(f),g=Math.cos(f),y=ji(g*this.sin_p14+r.y*c*this.cos_p14/h),_=Math.atan2(r.x*c,h*this.cos_p14*g-r.y*this.sin_p14*c),_=J(this.long0+_)):(y=this.phic0,_=0),r.x=_,r.y=y,r},names:["gnom"]},im=function(r,h){var c=1-(1-r*r)/(2*r)*Math.log((1-r)/(1+r));if(Math.abs(Math.abs(h)-c)<1e-6)return h<0?-1*z:z;for(var g,f,_,y,p=Math.asin(.5*h),S=0;S<30;S++)if(f=Math.sin(p),_=Math.cos(p),y=r*f,g=Math.pow(1-y*y,2)/(2*_)*(h/(1-r*r)-f/(1-y*y)+.5/r*Math.log((1-y)/(1+y))),p+=g,Math.abs(g)<=1e-10)return p;return NaN},nm={init:function(){this.sphere||(this.k0=ii(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(r){var h,c,g=r.x,f=r.y,_=J(g-this.long0);if(this.sphere)h=this.x0+this.a*_*Math.cos(this.lat_ts),c=this.y0+this.a*Math.sin(f)/Math.cos(this.lat_ts);else{var y=Wi(this.e,Math.sin(f));h=this.x0+this.a*this.k0*_,c=this.y0+this.a*y*.5/this.k0}return r.x=h,r.y=c,r},inverse:function(r){r.x-=this.x0,r.y-=this.y0;var h,c;return this.sphere?(h=J(this.long0+r.x/this.a/Math.cos(this.lat_ts)),c=Math.asin(r.y/this.a*Math.cos(this.lat_ts))):(c=im(this.e,2*r.y*this.k0/this.a),h=J(this.long0+r.x/(this.a*this.k0))),r.x=h,r.y=c,r},names:["cea"]},sm={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Equidistant Cylindrical (Plate Carre)",this.rc=Math.cos(this.lat_ts)},forward:function(r){var h=r.x,c=r.y,g=J(h-this.long0),f=jn(c-this.lat0);return r.x=this.x0+this.a*g*this.rc,r.y=this.y0+this.a*f,r},inverse:function(r){var h=r.x,c=r.y;return r.x=J(this.long0+(h-this.x0)/(this.a*this.rc)),r.y=jn(this.lat0+(c-this.y0)/this.a),r},names:["Equirectangular","Equidistant_Cylindrical","eqc"]},sc=20,rm={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=Fs(this.es),this.e1=ks(this.es),this.e2=Ns(this.es),this.e3=Ds(this.es),this.ml0=this.a*le(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(r){var h,c,g,f=r.x,_=r.y,y=J(f-this.long0);if(g=y*Math.sin(_),this.sphere)Math.abs(_)<=X?(h=this.a*y,c=-1*this.a*this.lat0):(h=this.a*Math.sin(g)/Math.tan(_),c=this.a*(jn(_-this.lat0)+(1-Math.cos(g))/Math.tan(_)));else if(Math.abs(_)<=X)h=this.a*y,c=-1*this.ml0;else{var p=Wn(this.a,this.e,Math.sin(_))/Math.tan(_);h=p*Math.sin(g),c=this.a*le(this.e0,this.e1,this.e2,this.e3,_)-this.ml0+p*(1-Math.cos(g))}return r.x=h+this.x0,r.y=c+this.y0,r},inverse:function(r){var h,c,g,f,_,y,p,S,R;if(g=r.x-this.x0,f=r.y-this.y0,this.sphere)if(Math.abs(f+this.a*this.lat0)<=X)h=J(g/this.a+this.long0),c=0;else{y=this.lat0+f/this.a,p=g*g/this.a/this.a+y*y,S=y;var O;for(_=sc;_;--_)if(O=Math.tan(S),R=-1*(y*(S*O+1)-S-.5*(S*S+p)*O)/((S-y)/O-1),S+=R,Math.abs(R)<=X){c=S;break}h=J(this.long0+Math.asin(g*Math.tan(S)/this.a)/Math.sin(c))}else if(Math.abs(f+this.ml0)<=X)c=0,h=J(this.long0+g/this.a);else{y=(this.ml0+f)/this.a,p=g*g/this.a/this.a+y*y,S=y;var A,k,B,D,j;for(_=sc;_;--_)if(j=this.e*Math.sin(S),A=Math.sqrt(1-j*j)*Math.tan(S),k=this.a*le(this.e0,this.e1,this.e2,this.e3,S),B=this.e0-2*this.e1*Math.cos(2*S)+4*this.e2*Math.cos(4*S)-6*this.e3*Math.cos(6*S),D=k/this.a,R=(y*(A*D+1)-D-.5*A*(D*D+p))/(this.es*Math.sin(2*S)*(D*D+p-2*y*D)/(4*A)+(y-D)*(A*B-2/Math.sin(2*S))-B),S-=R,Math.abs(R)<=X){c=S;break}A=Math.sqrt(1-this.es*Math.pow(Math.sin(c),2))*Math.tan(c),h=J(this.long0+Math.asin(g*A/this.a)/Math.sin(c))}return r.x=h,r.y=c,r},names:["Polyconic","poly"]},om={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(r){var h,c=r.x,g=r.y-this.lat0,f=c-this.long0,_=g/Bi*1e-5,y=f,p=1,S=0;for(h=1;h<=10;h++)p*=_,S+=this.A[h]*p;var R,O=S,A=y,k=1,B=0,D=0,j=0;for(h=1;h<=6;h++)R=B*O+k*A,k=k*O-B*A,B=R,D=D+this.B_re[h]*k-this.B_im[h]*B,j=j+this.B_im[h]*k+this.B_re[h]*B;return r.x=j*this.a+this.x0,r.y=D*this.a+this.y0,r},inverse:function(r){var h,c,g=r.x,f=r.y,_=g-this.x0,y=(f-this.y0)/this.a,p=_/this.a,S=1,R=0,O=0,A=0;for(h=1;h<=6;h++)c=R*y+S*p,S=S*y-R*p,R=c,O=O+this.C_re[h]*S-this.C_im[h]*R,A=A+this.C_im[h]*S+this.C_re[h]*R;for(var k=0;k.999999999999&&(c=.999999999999),h=Math.asin(c);var g=J(this.long0+r.x/(.900316316158*this.a*Math.cos(h)));g<-Math.PI&&(g=-Math.PI),g>Math.PI&&(g=Math.PI),c=(2*h+Math.sin(2*h))/Math.PI,Math.abs(c)>1&&(c=1);var f=Math.asin(c);return r.x=g,r.y=f,r},names:["Mollweide","moll"]},um={init:function(){Math.abs(this.lat1+this.lat2)=0?(c=Math.sqrt(r.x*r.x+r.y*r.y),h=1):(c=-Math.sqrt(r.x*r.x+r.y*r.y),h=-1);var _=0;if(c!==0&&(_=Math.atan2(h*r.x,h*r.y)),this.sphere)return f=J(this.long0+_/this.ns),g=jn(this.g-c/this.a),r.x=f,r.y=g,r;var y=this.g-c/this.a;return g=Fr(y,this.e0,this.e1,this.e2,this.e3),f=J(this.long0+_/this.ns),r.x=f,r.y=g,r},names:["Equidistant_Conic","eqdc"]},dm={init:function(){this.R=this.a},forward:function(r){var h,c,g=r.x,f=r.y,_=J(g-this.long0);Math.abs(f)<=X&&(h=this.x0+this.R*_,c=this.y0);var y=ji(2*Math.abs(f/Math.PI));(Math.abs(_)<=X||Math.abs(Math.abs(f)-z)<=X)&&(h=this.x0,c=f>=0?this.y0+Math.PI*this.R*Math.tan(.5*y):this.y0+Math.PI*this.R*-Math.tan(.5*y));var p=.5*Math.abs(Math.PI/_-_/Math.PI),S=p*p,R=Math.sin(y),O=Math.cos(y),A=O/(R+O-1),k=A*A,B=A*(2/R-1),D=B*B,j=Math.PI*this.R*(p*(A-D)+Math.sqrt(S*(A-D)*(A-D)-(D+S)*(k-D)))/(D+S);_<0&&(j=-j),h=this.x0+j;var ot=S+A;return j=Math.PI*this.R*(B*ot-p*Math.sqrt((D+S)*(S+1)-ot*ot))/(D+S),c=f>=0?this.y0+j:this.y0-j,r.x=h,r.y=c,r},inverse:function(r){var h,c,g,f,_,y,p,S,R,O,A,k,B;return r.x-=this.x0,r.y-=this.y0,A=Math.PI*this.R,g=r.x/A,f=r.y/A,_=g*g+f*f,y=-Math.abs(f)*(1+_),p=y-2*f*f+g*g,S=-2*y+1+2*f*f+_*_,B=f*f/S+(2*p*p*p/S/S/S-9*y*p/S/S)/27,R=(y-p*p/3/S)/S,O=2*Math.sqrt(-R/3),A=3*B/R/O,Math.abs(A)>1&&(A=A>=0?1:-1),k=Math.acos(A)/3,c=r.y>=0?(-O*Math.cos(k+Math.PI/3)-p/3/S)*Math.PI:-(-O*Math.cos(k+Math.PI/3)-p/3/S)*Math.PI,h=Math.abs(g)2*z*this.a?void 0:(c=h/this.a,g=Math.sin(c),f=Math.cos(c),_=this.long0,Math.abs(h)<=X?y=this.lat0:(y=ji(f*this.sin_p12+r.y*g*this.cos_p12/h),p=Math.abs(this.lat0)-z,_=J(Math.abs(p)<=X?this.lat0>=0?this.long0+Math.atan2(r.x,-r.y):this.long0-Math.atan2(-r.x,r.y):this.long0+Math.atan2(r.x*g,h*this.cos_p12*f-r.y*this.sin_p12*g))),r.x=_,r.y=y,r):(S=Fs(this.es),R=ks(this.es),O=Ns(this.es),A=Ds(this.es),Math.abs(this.sin_p12-1)<=X?(k=this.a*le(S,R,O,A,z),h=Math.sqrt(r.x*r.x+r.y*r.y),B=k-h,y=Fr(B/this.a,S,R,O,A),_=J(this.long0+Math.atan2(r.x,-1*r.y)),r.x=_,r.y=y,r):Math.abs(this.sin_p12+1)<=X?(k=this.a*le(S,R,O,A,z),h=Math.sqrt(r.x*r.x+r.y*r.y),B=h-k,y=Fr(B/this.a,S,R,O,A),_=J(this.long0+Math.atan2(r.x,r.y)),r.x=_,r.y=y,r):(h=Math.sqrt(r.x*r.x+r.y*r.y),ot=Math.atan2(r.x,r.y),D=Wn(this.a,this.e,this.sin_p12),nt=Math.cos(ot),yt=this.e*this.cos_p12*nt,ct=-yt*yt/(1-this.es),Gt=3*this.es*(1-ct)*this.sin_p12*this.cos_p12*nt/(1-this.es),te=h/D,Wt=te-ct*(1+ct)*Math.pow(te,3)/6-Gt*(1+3*ct)*Math.pow(te,4)/24,Xi=1-ct*Wt*Wt/2-te*Wt*Wt*Wt/6,j=Math.asin(this.sin_p12*Math.cos(Wt)+this.cos_p12*Math.sin(Wt)*nt),_=J(this.long0+Math.asin(Math.sin(ot)*Math.sin(Wt)/Math.cos(j))),Yi=Math.sin(j),y=Math.atan2((Yi-this.es*Xi*this.sin_p12)*Math.tan(j),Yi*(1-this.es)),r.x=_,r.y=y,r))},names:["Azimuthal_Equidistant","aeqd"]},mm={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(r){var h,c,g,f,_,y,p,S=r.x,R=r.y;return g=J(S-this.long0),h=Math.sin(R),c=Math.cos(R),f=Math.cos(g),((_=this.sin_p14*h+this.cos_p14*c*f)>0||Math.abs(_)<=X)&&(y=1*this.a*c*Math.sin(g),p=this.y0+1*this.a*(this.cos_p14*h-this.sin_p14*c*f)),r.x=y,r.y=p,r},inverse:function(r){var h,c,g,f,_,y,p;return r.x-=this.x0,r.y-=this.y0,h=Math.sqrt(r.x*r.x+r.y*r.y),c=ji(h/this.a),g=Math.sin(c),f=Math.cos(c),y=this.long0,Math.abs(h)<=X?(p=this.lat0,r.x=y,r.y=p,r):(p=ji(f*this.sin_p14+r.y*g*this.cos_p14/h),_=Math.abs(this.lat0)-z,Math.abs(_)<=X?(y=J(this.lat0>=0?this.long0+Math.atan2(r.x,-r.y):this.long0-Math.atan2(-r.x,r.y)),r.x=y,r.y=p,r):(y=J(this.long0+Math.atan2(r.x*g,h*this.cos_p14*f-r.y*this.sin_p14*g)),r.x=y,r.y=p,r))},names:["ortho"]},Pt={FRONT:1,RIGHT:2,BACK:3,LEFT:4,TOP:5,BOTTOM:6},vt={AREA_0:1,AREA_1:2,AREA_2:3,AREA_3:4},gm={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||"Quadrilateralized Spherical Cube",this.lat0>=z-mt/2?this.face=Pt.TOP:this.lat0<=-(z-mt/2)?this.face=Pt.BOTTOM:Math.abs(this.long0)<=mt?this.face=Pt.FRONT:Math.abs(this.long0)<=z+mt?this.face=this.long0>0?Pt.RIGHT:Pt.LEFT:this.face=Pt.BACK,this.es!==0&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(r){var h,c,g,f,_,y,p={x:0,y:0},S={value:0};if(r.x-=this.long0,h=this.es!==0?Math.atan(this.one_minus_f_squared*Math.tan(r.y)):r.y,c=r.x,this.face===Pt.TOP)f=z-h,c>=mt&&c<=z+mt?(S.value=vt.AREA_0,g=c-z):c>z+mt||c<=-(z+mt)?(S.value=vt.AREA_1,g=c>0?c-xt:c+xt):c>-(z+mt)&&c<=-mt?(S.value=vt.AREA_2,g=c+z):(S.value=vt.AREA_3,g=c);else if(this.face===Pt.BOTTOM)f=z+h,c>=mt&&c<=z+mt?(S.value=vt.AREA_0,g=-c+z):c=-mt?(S.value=vt.AREA_1,g=-c):c<-mt&&c>=-(z+mt)?(S.value=vt.AREA_2,g=-c-z):(S.value=vt.AREA_3,g=c>0?-c+xt:-c-xt);else{var R,O,A,k,B,D;this.face===Pt.RIGHT?c=kt(c,+z):this.face===Pt.BACK?c=kt(c,+xt):this.face===Pt.LEFT&&(c=kt(c,-z)),k=Math.sin(h),B=Math.cos(h),D=Math.sin(c),R=B*Math.cos(c),O=B*D,A=k,this.face===Pt.FRONT?g=xi(f=Math.acos(R),A,O,S):this.face===Pt.RIGHT?g=xi(f=Math.acos(O),A,-R,S):this.face===Pt.BACK?g=xi(f=Math.acos(-R),A,-O,S):this.face===Pt.LEFT?g=xi(f=Math.acos(-O),A,R,S):(f=g=0,S.value=vt.AREA_0)}return y=Math.atan(12/xt*(g+Math.acos(Math.sin(g)*Math.cos(mt))-z)),_=Math.sqrt((1-Math.cos(f))/(Math.cos(y)*Math.cos(y))/(1-Math.cos(Math.atan(1/Math.cos(g))))),S.value===vt.AREA_1?y+=z:S.value===vt.AREA_2?y+=xt:S.value===vt.AREA_3&&(y+=1.5*xt),p.x=_*Math.cos(y),p.y=_*Math.sin(y),p.x=p.x*this.a+this.x0,p.y=p.y*this.a+this.y0,r.x=p.x,r.y=p.y,r},inverse:function(r){var h,c,g,f,_,y,p,S,R,O={lam:0,phi:0},A={value:0};if(r.x=(r.x-this.x0)/this.a,r.y=(r.y-this.y0)/this.a,c=Math.atan(Math.sqrt(r.x*r.x+r.y*r.y)),h=Math.atan2(r.y,r.x),r.x>=0&&r.x>=Math.abs(r.y)?A.value=vt.AREA_0:r.y>=0&&r.y>=Math.abs(r.x)?(A.value=vt.AREA_1,h-=z):r.x<0&&-r.x>=Math.abs(r.y)?(A.value=vt.AREA_2,h=h<0?h+xt:h-xt):(A.value=vt.AREA_3,h+=z),R=xt/12*Math.tan(h),_=Math.sin(R)/(Math.cos(R)-1/Math.sqrt(2)),y=Math.atan(_),g=Math.cos(h),f=Math.tan(c),(p=1-g*g*f*f*(1-Math.cos(Math.atan(1/Math.cos(y)))))<-1?p=-1:p>1&&(p=1),this.face===Pt.TOP)S=Math.acos(p),O.phi=z-S,A.value===vt.AREA_0?O.lam=y+z:A.value===vt.AREA_1?O.lam=y<0?y+xt:y-xt:A.value===vt.AREA_2?O.lam=y-z:O.lam=y;else if(this.face===Pt.BOTTOM)S=Math.acos(p),O.phi=S-z,A.value===vt.AREA_0?O.lam=-y+z:A.value===vt.AREA_1?O.lam=-y:A.value===vt.AREA_2?O.lam=-y-z:O.lam=y<0?-y-xt:-y+xt;else{var k,B,D;R=(k=p)*k,B=(R+=(D=R>=1?0:Math.sqrt(1-R)*Math.sin(y))*D)>=1?0:Math.sqrt(1-R),A.value===vt.AREA_1?(R=B,B=-D,D=R):A.value===vt.AREA_2?(B=-B,D=-D):A.value===vt.AREA_3&&(R=B,B=D,D=-R),this.face===Pt.RIGHT?(R=k,k=-B,B=R):this.face===Pt.BACK?(k=-k,B=-B):this.face===Pt.LEFT&&(R=k,k=B,B=-R),O.phi=Math.acos(-D)-z,O.lam=Math.atan2(B,k),this.face===Pt.RIGHT?O.lam=kt(O.lam,-z):this.face===Pt.BACK?O.lam=kt(O.lam,-xt):this.face===Pt.LEFT&&(O.lam=kt(O.lam,+z))}if(this.es!==0){var j,ot,nt;j=O.phi<0?1:0,ot=Math.tan(O.phi),nt=this.b/Math.sqrt(ot*ot+this.one_minus_f_squared),O.phi=Math.atan(Math.sqrt(this.a*this.a-nt*nt)/(this.one_minus_f*nt)),j&&(O.phi=-O.phi)}return O.lam+=this.long0,r.x=O.lam,r.y=O.phi,r},names:["Quadrilateralized Spherical Cube","Quadrilateralized_Spherical_Cube","qsc"]},Qo=[[1,22199e-21,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-986701e-12],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,18736e-12],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,934959e-12],[.7986,-.00755338,-500009e-10,935324e-12],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],Gs=[[-520417e-23,.0124,121431e-23,-845284e-16],[.062,.0124,-126793e-14,422642e-15],[.124,.0124,507171e-14,-160604e-14],[.186,.0123999,-190189e-13,600152e-14],[.248,.0124002,710039e-13,-224e-10],[.31,.0123992,-264997e-12,835986e-13],[.372,.0124029,988983e-12,-311994e-12],[.434,.0123893,-369093e-11,-435621e-12],[.4958,.0123198,-102252e-10,-345523e-12],[.5571,.0121916,-154081e-10,-582288e-12],[.6176,.0119938,-241424e-10,-525327e-12],[.6769,.011713,-320223e-10,-516405e-12],[.7346,.0113541,-397684e-10,-609052e-12],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-140374e-14],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],rc=.8487,oc=1.3523,ac=bt/5,pm=1/ac,Xn=18,kr=function(r,h){return r[0]+h*(r[1]+h*(r[2]+h*r[3]))},_m=function(r,h){return r[1]+h*(2*r[2]+3*h*r[3])},ym={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||"Robinson"},forward:function(r){var h=J(r.x-this.long0),c=Math.abs(r.y),g=Math.floor(c*ac);g<0?g=0:g>=Xn&&(g=Xn-1),c=bt*(c-pm*g);var f={x:kr(Qo[g],c)*h,y:kr(Gs[g],c)};return r.y<0&&(f.y=-f.y),f.x=f.x*this.a*rc+this.x0,f.y=f.y*this.a*oc+this.y0,f},inverse:function(r){var h={x:(r.x-this.x0)/(this.a*rc),y:Math.abs(r.y-this.y0)/(this.a*oc)};if(h.y>=1)h.x/=Qo[Xn][0],h.y=r.y<0?-z:z;else{var c=Math.floor(h.y*Xn);for(c<0?c=0:c>=Xn&&(c=Xn-1);;)if(Gs[c][0]>h.y)--c;else{if(!(Gs[c+1][0]<=h.y))break;++c}var g=Gs[c],f=5*(h.y-g[0])/(Gs[c+1][0]-g[0]);f=bs(function(_){return(kr(g,_)-h.y)/_m(g,_)},f,X,100),h.x/=kr(Qo[c],f),h.y=(5*c+f)*Bt,r.y<0&&(h.y=-h.y)}return h.x=J(h.x+this.long0),h},names:["Robinson","robin"]},xm={init:function(){this.name="geocent"},forward:function(r){return K(r,this.es,this.a)},inverse:function(r){return H(r,this.es,this.a,this.b)},names:["Geocentric","geocentric","geocent","Geocent"]},ee={N_POLE:0,S_POLE:1,EQUIT:2,OBLIQ:3},zs={h:{def:1e5,num:!0},azi:{def:0,num:!0,degrees:!0},tilt:{def:0,num:!0,degrees:!0},long0:{def:0,num:!0},lat0:{def:0,num:!0}},Em={init:function(){if(Object.keys(zs).forEach(function(c){if(this[c]===void 0)this[c]=zs[c].def;else{if(zs[c].num&&isNaN(this[c]))throw new Error("Invalid parameter value, must be numeric "+c+" = "+this[c]);zs[c].num&&(this[c]=parseFloat(this[c]))}zs[c].degrees&&(this[c]=this[c]*Bt)}.bind(this)),Math.abs(Math.abs(this.lat0)-z)1e10)throw new Error("Invalid height");this.p=1+this.pn1,this.rp=1/this.p,this.h1=1/this.pn1,this.pfact=(this.p+1)*this.h1,this.es=0;var r=this.tilt,h=this.azi;this.cg=Math.cos(h),this.sg=Math.sin(h),this.cw=Math.cos(r),this.sw=Math.sin(r)},forward:function(r){r.x-=this.long0;var h,c,g=Math.sin(r.y),f=Math.cos(r.y),_=Math.cos(r.x);switch(this.mode){case ee.OBLIQ:c=this.sinph0*g+this.cosph0*f*_;break;case ee.EQUIT:c=f*_;break;case ee.S_POLE:c=-g;break;case ee.N_POLE:c=g}switch(c=this.pn1/(this.p-c),h=c*f*Math.sin(r.x),this.mode){case ee.OBLIQ:c*=this.cosph0*g-this.sinph0*f*_;break;case ee.EQUIT:c*=g;break;case ee.N_POLE:c*=-f*_;break;case ee.S_POLE:c*=f*_}var y,p;return y=c*this.cg+h*this.sg,p=1/(y*this.sw*this.h1+this.cw),h=(h*this.cg-c*this.sg)*this.cw*p,c=y*p,r.x=h*this.a,r.y=c*this.a,r},inverse:function(r){r.x/=this.a,r.y/=this.a;var h,c,g,f={x:r.x,y:r.y};g=1/(this.pn1-r.y*this.sw),h=this.pn1*r.x*g,c=this.pn1*r.y*this.cw*g,r.x=h*this.cg+c*this.sg,r.y=c*this.cg-h*this.sg;var _=Be(r.x,r.y);if(Math.abs(_)1e10)throw new Error;if(this.radius_g=1+this.radius_g_1,this.C=this.radius_g*this.radius_g-1,this.es!==0){var r=1-this.es,h=1/r;this.radius_p=Math.sqrt(r),this.radius_p2=r,this.radius_p_inv2=h,this.shape="ellipse"}else this.radius_p=1,this.radius_p2=1,this.radius_p_inv2=1,this.shape="sphere";this.title||(this.title="Geostationary Satellite View")},forward:function(r){var h,c,g,f,_=r.x,y=r.y;if(_-=this.long0,this.shape==="ellipse"){y=Math.atan(this.radius_p2*Math.tan(y));var p=this.radius_p/Be(this.radius_p*Math.cos(y),Math.sin(y));if(c=p*Math.cos(_)*Math.cos(y),g=p*Math.sin(_)*Math.cos(y),f=p*Math.sin(y),(this.radius_g-c)*c-g*g-f*f*this.radius_p_inv2<0)return r.x=Number.NaN,r.y=Number.NaN,r;h=this.radius_g-c,this.flip_axis?(r.x=this.radius_g_1*Math.atan(g/Be(f,h)),r.y=this.radius_g_1*Math.atan(f/h)):(r.x=this.radius_g_1*Math.atan(g/h),r.y=this.radius_g_1*Math.atan(f/Be(g,h)))}else this.shape==="sphere"&&(h=Math.cos(y),c=Math.cos(_)*h,g=Math.sin(_)*h,f=Math.sin(y),h=this.radius_g-c,this.flip_axis?(r.x=this.radius_g_1*Math.atan(g/Be(f,h)),r.y=this.radius_g_1*Math.atan(f/h)):(r.x=this.radius_g_1*Math.atan(g/h),r.y=this.radius_g_1*Math.atan(f/Be(g,h))));return r.x=r.x*this.a,r.y=r.y*this.a,r},inverse:function(r){var h,c,g,f,_=-1,y=0,p=0;if(r.x=r.x/this.a,r.y=r.y/this.a,this.shape==="ellipse"){this.flip_axis?(p=Math.tan(r.y/this.radius_g_1),y=Math.tan(r.x/this.radius_g_1)*Be(1,p)):(y=Math.tan(r.x/this.radius_g_1),p=Math.tan(r.y/this.radius_g_1)*Be(1,y));var S=p/this.radius_p;if(h=y*y+S*S+_*_,c=2*this.radius_g*_,(g=c*c-4*h*this.C)<0)return r.x=Number.NaN,r.y=Number.NaN,r;f=(-c-Math.sqrt(g))/(2*h),_=this.radius_g+f*_,y*=f,p*=f,r.x=Math.atan2(y,_),r.y=Math.atan(p*Math.cos(r.x)/_),r.y=Math.atan(this.radius_p_inv2*Math.tan(r.y))}else if(this.shape==="sphere"){if(this.flip_axis?(p=Math.tan(r.y/this.radius_g_1),y=Math.tan(r.x/this.radius_g_1)*Math.sqrt(1+p*p)):(y=Math.tan(r.x/this.radius_g_1),p=Math.tan(r.y/this.radius_g_1)*Math.sqrt(1+y*y)),h=y*y+p*p+_*_,c=2*this.radius_g*_,(g=c*c-4*h*this.C)<0)return r.x=Number.NaN,r.y=Number.NaN,r;f=(-c-Math.sqrt(g))/(2*h),_=this.radius_g+f*_,y*=f,p*=f,r.x=Math.atan2(y,_),r.y=Math.atan(p*Math.cos(r.x)/_)}return r.x=r.x+this.long0,r},names:["Geostationary Satellite View","Geostationary_Satellite","geos"]};return Ut.defaultDatum="WGS84",Ut.Proj=tt,Ut.WGS84=new Ut.Proj("WGS84"),Ut.Point=Ce,Ut.toPoint=Vl,Ut.defs=u,Ut.nadgrid=function(r,h){var c=new DataView(h),g=G(c),f=W(c,g),_={header:f,subgrids:Z(c,f,g)};return Kl[r]=_,_},Ut.transform=he,Ut.mgrs=Pf,Ut.version="2.9.2",function(r){r.Proj.projections.add(Pr),r.Proj.projections.add(Or),r.Proj.projections.add(Gf),r.Proj.projections.add(Uf),r.Proj.projections.add(Bf),r.Proj.projections.add(Wf),r.Proj.projections.add(jf),r.Proj.projections.add(Xf),r.Proj.projections.add(Yf),r.Proj.projections.add(Kf),r.Proj.projections.add(Qf),r.Proj.projections.add(tm),r.Proj.projections.add(em),r.Proj.projections.add(nm),r.Proj.projections.add(sm),r.Proj.projections.add(rm),r.Proj.projections.add(om),r.Proj.projections.add(am),r.Proj.projections.add(lm),r.Proj.projections.add(cm),r.Proj.projections.add(um),r.Proj.projections.add(dm),r.Proj.projections.add(fm),r.Proj.projections.add(mm),r.Proj.projections.add(gm),r.Proj.projections.add(ym),r.Proj.projections.add(xm),r.Proj.projections.add(Em),r.Proj.projections.add(Mm)}(Ut),Ut})});var Kh=lc((Xh,Yh)=>{(function(s,t){typeof Xh=="object"&&typeof Yh<"u"?Yh.exports=t():typeof define=="function"&&define.amd?define(t):(s=s||self).RBush=t()})(Xh,function(){"use strict";function s(M,v,I,L,b){(function P(F,N,G,W,Y){for(;W>G;){if(W-G>600){var Z=W-G+1,it=N-G+1,rt=Math.log(Z),Ct=.5*Math.exp(2*rt/3),tt=.5*Math.sqrt(rt*Ct*(Z-Ct)/Z)*(it-Z/2<0?-1:1),V=Math.max(G,Math.floor(N-it*Ct/Z+tt)),K=Math.min(W,Math.floor(N+(Z-it)*Ct/Z+tt));P(F,N,V,K,Y)}var H=F[N],dt=G,lt=W;for(t(F,G,N),Y(F[W],H)>0&&t(F,G,W);dt0;)lt--}Y(F[G],H)===0?t(F,G,lt):t(F,++lt,W),lt<=N&&(G=lt+1),N<=lt&&(W=lt-1)}})(M,v,I||0,L||M.length-1,b||e)}function t(M,v,I){var L=M[v];M[v]=M[I],M[I]=L}function e(M,v){return Mv?1:0}var i=function(M){M===void 0&&(M=9),this._maxEntries=Math.max(4,M),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()};function n(M,v,I){if(!I)return v.indexOf(M);for(var L=0;L=M.minX&&v.maxY>=M.minY}function T(M){return{children:M,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function w(M,v,I,L,b){for(var P=[v,I];P.length;)if(!((I=P.pop())-(v=P.pop())<=L)){var F=v+Math.ceil((I-v)/L/2)*L;s(M,F,v,I,b),P.push(v,F,F,I)}}return i.prototype.all=function(){return this._all(this.data,[])},i.prototype.search=function(M){var v=this.data,I=[];if(!C(M,v))return I;for(var L=this.toBBox,b=[];v;){for(var P=0;P=0&&b[v].children.length>this._maxEntries;)this._split(b,v),v--;this._adjustParentBBoxes(L,b,v)},i.prototype._split=function(M,v){var I=M[v],L=I.children.length,b=this._minEntries;this._chooseSplitAxis(I,b,L);var P=this._chooseSplitIndex(I,b,L),F=T(I.children.splice(P,I.children.length-P));F.height=I.height,F.leaf=I.leaf,o(I,this.toBBox),o(F,this.toBBox),v?M[v-1].children.push(F):this._splitRoot(I,F)},i.prototype._splitRoot=function(M,v){this.data=T([M,v]),this.data.height=M.height+1,this.data.leaf=!1,o(this.data,this.toBBox)},i.prototype._chooseSplitIndex=function(M,v,I){for(var L,b,P,F,N,G,W,Y=1/0,Z=1/0,it=v;it<=I-v;it++){var rt=a(M,0,it,this.toBBox),Ct=a(M,it,I,this.toBBox),tt=(b=rt,P=Ct,F=void 0,N=void 0,G=void 0,W=void 0,F=Math.max(b.minX,P.minX),N=Math.max(b.minY,P.minY),G=Math.min(b.maxX,P.maxX),W=Math.min(b.maxY,P.maxY),Math.max(0,G-F)*Math.max(0,W-N)),V=m(rt)+m(Ct);tt=v;Y--){var Z=M.children[Y];l(F,M.leaf?b(Z):Z),N+=x(F)}return N},i.prototype._adjustParentBBoxes=function(M,v,I){for(var L=I;L>=0;L--)l(v[L],M)},i.prototype._condense=function(M){for(var v=M.length-1,I=void 0;v>=0;v--)M[v].children.length===0?v>0?(I=M[v-1].children).splice(I.indexOf(M[v]),1):this.clear():o(M[v],this.toBBox)},i})});var ea=class{constructor(t){this.propagationStopped,this.defaultPrevented,this.type=t,this.target=null}preventDefault(){this.defaultPrevented=!0}stopPropagation(){this.propagationStopped=!0}};function cc(s){s.stopPropagation()}var Jt=ea;var We={PROPERTYCHANGE:"propertychange"};var ia=class{constructor(){this.disposed=!1}dispose(){this.disposed||(this.disposed=!0,this.disposeInternal())}disposeInternal(){}},Kn=ia;function ni(s,t){return s>t?1:s0?n-1:n}return i-1}if(e>0){for(let n=1;n0||e&&a===0)})}function Ci(){return!0}function Si(){return!1}function je(){}function fc(s){let t=!1,e,i,n;return function(){let o=Array.prototype.slice.call(arguments);return(!t||this!==n||!ie(o,i))&&(t=!0,n=this,i=o,e=s.apply(this,arguments)),e}}function si(s){for(let t in s)delete s[t]}function Ti(s){let t;for(t in s)return!1;return!t}var na=class extends Kn{constructor(t){super(),this.eventTarget_=t,this.pendingRemovals_=null,this.dispatching_=null,this.listeners_=null}addEventListener(t,e){if(!t||!e)return;let i=this.listeners_||(this.listeners_={}),n=i[t]||(i[t]=[]);n.includes(e)||n.push(e)}dispatchEvent(t){let e=typeof t=="string",i=e?t:t.type,n=this.listeners_&&this.listeners_[i];if(!n)return;let o=e?new Jt(t):t;o.target||(o.target=this.eventTarget_||this);let a=this.dispatching_||(this.dispatching_={}),l=this.pendingRemovals_||(this.pendingRemovals_={});i in a||(a[i]=0,l[i]=0),++a[i];let u;for(let d=0,m=n.length;d0:!1}removeEventListener(t,e){let i=this.listeners_&&this.listeners_[t];if(i){let n=i.indexOf(e);n!==-1&&(this.pendingRemovals_&&t in this.pendingRemovals_?(i[n]=je,++this.pendingRemovals_[t]):(i.splice(n,1),i.length===0&&delete this.listeners_[t]))}}},qi=na;var q={CHANGE:"change",ERROR:"error",BLUR:"blur",CLEAR:"clear",CONTEXTMENU:"contextmenu",CLICK:"click",DBLCLICK:"dblclick",DRAGENTER:"dragenter",DRAGOVER:"dragover",DROP:"drop",FOCUS:"focus",KEYDOWN:"keydown",KEYPRESS:"keypress",LOAD:"load",RESIZE:"resize",TOUCHMOVE:"touchmove",WHEEL:"wheel"};function st(s,t,e,i,n){if(i&&i!==s&&(e=e.bind(i)),n){let a=e;e=function(){s.removeEventListener(t,e),a.apply(this,arguments)}}let o={target:s,type:t,listener:e};return s.addEventListener(t,e),o}function Vn(s,t,e,i){return st(s,t,e,i,!0)}function ut(s){s&&s.target&&(s.target.removeEventListener(s.type,s.listener),si(s))}var Hn=class extends qi{constructor(){super(),this.on=this.onInternal,this.once=this.onceInternal,this.un=this.unInternal,this.revision_=0}changed(){++this.revision_,this.dispatchEvent(q.CHANGE)}getRevision(){return this.revision_}onInternal(t,e){if(Array.isArray(t)){let i=t.length,n=new Array(i);for(let o=0;o0;)this.pop()}extend(t){for(let e=0,i=t.length;ethis.getLength())throw new Error("Index out of bounds: "+t);this.unique_&&this.assertUnique_(e),this.array_.splice(t,0,e),this.updateLength_(),this.dispatchEvent(new Zn($t.ADD,e,t))}pop(){return this.removeAt(this.getLength()-1)}push(t){this.unique_&&this.assertUnique_(t);let e=this.getLength();return this.insertAt(e,t),this.getLength()}remove(t){let e=this.array_;for(let i=0,n=e.length;i=this.getLength())return;let e=this.array_[t];return this.array_.splice(t,1),this.updateLength_(),this.dispatchEvent(new Zn($t.REMOVE,e,t)),e}setAt(t,e){let i=this.getLength();if(t>=i){this.insertAt(t,e);return}if(t<0)throw new Error("Index out of bounds: "+t);this.unique_&&this.assertUnique_(e,t);let n=this.array_[t];this.array_[t]=e,this.dispatchEvent(new Zn($t.REMOVE,n,t)),this.dispatchEvent(new Zn($t.ADD,e,t))}updateLength_(){this.set(mc.LENGTH,this.array_.length)}assertUnique_(t,e){for(let i=0,n=this.array_.length;in&&(u=u|jt.RIGHT),lo&&(u=u|jt.ABOVE),u===jt.UNKNOWN&&(u=jt.INTERSECTING),u}function wt(){return[1/0,1/0,-1/0,-1/0]}function Se(s,t,e,i,n){return n?(n[0]=s,n[1]=t,n[2]=e,n[3]=i,n):[s,t,e,i]}function pn(s){return Se(1/0,1/0,-1/0,-1/0,s)}function Kr(s,t){let e=s[0],i=s[1];return Se(e,i,e,i,t)}function Mc(s,t,e,i,n){let o=pn(n);return la(o,s,t,e,i)}function Ri(s,t){return s[0]==t[0]&&s[2]==t[2]&&s[1]==t[1]&&s[3]==t[3]}function qr(s,t){return t[0]s[2]&&(s[2]=t[2]),t[1]s[3]&&(s[3]=t[3]),s}function _n(s,t){t[0]s[2]&&(s[2]=t[0]),t[1]s[3]&&(s[3]=t[1])}function la(s,t,e,i,n){for(;et[0]?i[0]=s[0]:i[0]=t[0],s[1]>t[1]?i[1]=s[1]:i[1]=t[1],s[2]=t[0]&&s[1]<=t[3]&&s[3]>=t[1]}function Ji(s){return s[2]=a&&w<=u),!i&&!!(o&jt.RIGHT)&&!(n&jt.RIGHT)&&(M=C-(E-u)*T,i=M>=l&&M<=d),!i&&!!(o&jt.BELOW)&&!(n&jt.BELOW)&&(w=E-(C-l)/T,i=w>=a&&w<=u),!i&&!!(o&jt.LEFT)&&!(n&jt.LEFT)&&(M=C-(E-a)*T,i=M>=l&&M<=d)}return i}function Tc(s,t,e,i){if(Ji(s))return pn(e);let n=[];if(i>1){let l=s[2]-s[0],u=s[3]-s[1];for(let d=0;d=e[2])){let n=gt(e),a=Math.floor((i[0]-e[0])/n)*n;s[0]-=a,s[2]-=a}return s}function Rc(s,t){if(t.canWrapX()){let e=t.getExtent();if(!isFinite(s[0])||!isFinite(s[2]))return[[e[0],s[1],e[2],s[3]]];ca(s,t);let i=gt(e);if(gt(s)>i)return[[e[0],s[1],e[2],s[3]]];if(s[0]e[2])return[[s[0],s[1],e[2],s[3]],[e[0],s[1],s[2]-i,s[3]]]}return[s]}function pt(s,t,e){return Math.min(Math.max(s,t),e)}function Ic(s,t,e,i,n,o){let a=n-e,l=o-i;if(a!==0||l!==0){let u=((s-e)*a+(t-i)*l)/(a*a+l*l);u>1?(e=n,i=o):u>0&&(e+=a*u,i+=l*u)}return Ii(s,t,e,i)}function Ii(s,t,e,i){let n=e-s,o=i-t;return n*n+o*o}function wc(s){let t=s.length;for(let i=0;io&&(o=u,n=l)}if(o===0)return null;let a=s[n];s[n]=s[i],s[i]=a;for(let l=i+1;l=0;i--){e[i]=s[i][t]/s[i][i];for(let n=i-1;n>=0;n--)s[n][t]-=s[n][i]*e[i]}return e}function is(s){return s*Math.PI/180}function Pe(s,t){let e=s%t;return e*t<0?e+t:e}function _e(s,t,e){return s+e*(t-s)}function Zr(s,t){let e=Math.pow(10,t);return Math.round(s*e)/e}function Xs(s,t){return Math.floor(Zr(s,t))}function Ys(s,t){return Math.ceil(Zr(s,t))}var Nm=/^#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})$/i,Dm=/^([a-z]*)$|^hsla?\(.*\)$/i;function Jr(s){return typeof s=="string"?s:ua(s)}function Gm(s){let t=document.createElement("div");if(t.style.color=s,t.style.color!==""){document.body.appendChild(t);let e=getComputedStyle(t).color;return document.body.removeChild(t),e}return""}var zm=function(){let t={},e=0;return function(i){let n;if(t.hasOwnProperty(i))n=t[i];else{if(e>=1024){let o=0;for(let a in t)(o++&3)===0&&(delete t[a],--e)}n=Um(i),t[i]=n,++e}return n}}();function yn(s){return Array.isArray(s)?s:zm(s)}function Um(s){let t,e,i,n,o;if(Dm.exec(s)&&(s=Gm(s)),Nm.exec(s)){let a=s.length-1,l;a<=4?l=1:l=2;let u=a===4||a===8;t=parseInt(s.substr(1+0*l,l),16),e=parseInt(s.substr(1+1*l,l),16),i=parseInt(s.substr(1+2*l,l),16),u?n=parseInt(s.substr(1+3*l,l),16):n=255,l==1&&(t=(t<<4)+t,e=(e<<4)+e,i=(i<<4)+i,u&&(n=(n<<4)+n)),o=[t,e,i,n/255]}else s.startsWith("rgba(")?(o=s.slice(5,-1).split(",").map(Number),bc(o)):s.startsWith("rgb(")?(o=s.slice(4,-1).split(",").map(Number),o.push(1),bc(o)):$(!1,14);return o}function bc(s){return s[0]=pt(s[0]+.5|0,0,255),s[1]=pt(s[1]+.5|0,0,255),s[2]=pt(s[2]+.5|0,0,255),s[3]=pt(s[3],0,1),s}function ua(s){let t=s[0];t!=(t|0)&&(t=t+.5|0);let e=s[1];e!=(e|0)&&(e=e+.5|0);let i=s[2];i!=(i|0)&&(i=i+.5|0);let n=s[3]===void 0?1:Math.round(s[3]*100)/100;return"rgba("+t+","+e+","+i+","+n+")"}var da=class{constructor(){this.cache_={},this.cacheSize_=0,this.maxCacheSize_=32}clear(){this.cache_={},this.cacheSize_=0}canExpireCache(){return this.cacheSize_>this.maxCacheSize_}expire(){if(this.canExpireCache()){let t=0;for(let e in this.cache_){let i=this.cache_[e];(t++&3)===0&&!i.hasListener()&&(delete this.cache_[e],--this.cacheSize_)}}}get(t,e,i){let n=Lc(t,e,i);return n in this.cache_?this.cache_[n]:null}set(t,e,i,n){let o=Lc(t,e,i);this.cache_[o]=n,++this.cacheSize_}setSize(t){this.maxCacheSize_=t,this.expire()}};function Lc(s,t,e){let i=e?Jr(e):"null";return t+":"+s+":"+i}var ns=new da;var Et={OPACITY:"opacity",VISIBLE:"visible",EXTENT:"extent",Z_INDEX:"zIndex",MAX_RESOLUTION:"maxResolution",MIN_RESOLUTION:"minResolution",MAX_ZOOM:"maxZoom",MIN_ZOOM:"minZoom",SOURCE:"source",MAP:"map"};var fa=class extends Nt{constructor(t){super(),this.on,this.once,this.un,this.background_=t.background;let e=Object.assign({},t);typeof t.properties=="object"&&(delete e.properties,Object.assign(e,t.properties)),e[Et.OPACITY]=t.opacity!==void 0?t.opacity:1,$(typeof e[Et.OPACITY]=="number",64),e[Et.VISIBLE]=t.visible!==void 0?t.visible:!0,e[Et.Z_INDEX]=t.zIndex,e[Et.MAX_RESOLUTION]=t.maxResolution!==void 0?t.maxResolution:1/0,e[Et.MIN_RESOLUTION]=t.minResolution!==void 0?t.minResolution:0,e[Et.MIN_ZOOM]=t.minZoom!==void 0?t.minZoom:-1/0,e[Et.MAX_ZOOM]=t.maxZoom!==void 0?t.maxZoom:1/0,this.className_=e.className!==void 0?e.className:"ol-layer",delete e.className,this.setProperties(e),this.state_=null}getBackground(){return this.background_}getClassName(){return this.className_}getLayerState(t){let e=this.state_||{layer:this,managed:t===void 0?!0:t},i=this.getZIndex();return e.opacity=pt(Math.round(this.getOpacity()*100)/100,0,1),e.visible=this.getVisible(),e.extent=this.getExtent(),e.zIndex=i===void 0&&!e.managed?1/0:i,e.maxResolution=this.getMaxResolution(),e.minResolution=Math.max(this.getMinResolution(),0),e.minZoom=this.getMinZoom(),e.maxZoom=this.getMaxZoom(),this.state_=e,e}getLayersArray(t){return ft()}getLayerStatesArray(t){return ft()}getExtent(){return this.get(Et.EXTENT)}getMaxResolution(){return this.get(Et.MAX_RESOLUTION)}getMinResolution(){return this.get(Et.MIN_RESOLUTION)}getMinZoom(){return this.get(Et.MIN_ZOOM)}getMaxZoom(){return this.get(Et.MAX_ZOOM)}getOpacity(){return this.get(Et.OPACITY)}getSourceState(){return ft()}getVisible(){return this.get(Et.VISIBLE)}getZIndex(){return this.get(Et.Z_INDEX)}setBackground(t){this.background_=t,this.changed()}setExtent(t){this.set(Et.EXTENT,t)}setMaxResolution(t){this.set(Et.MAX_RESOLUTION,t)}setMinResolution(t){this.set(Et.MIN_RESOLUTION,t)}setMaxZoom(t){this.set(Et.MAX_ZOOM,t)}setMinZoom(t){this.set(Et.MIN_ZOOM,t)}setOpacity(t){$(typeof t=="number",64),this.set(Et.OPACITY,t)}setVisible(t){this.set(Et.VISIBLE,t)}setZIndex(t){this.set(Et.Z_INDEX,t)}disposeInternal(){this.state_&&(this.state_.layer=null,this.state_=null),super.disposeInternal()}},$r=fa;var de={PRERENDER:"prerender",POSTRENDER:"postrender",PRECOMPOSE:"precompose",POSTCOMPOSE:"postcompose",RENDERCOMPLETE:"rendercomplete"};var Yt={ANIMATING:0,INTERACTING:1};var Oe={CENTER:"center",RESOLUTION:"resolution",ROTATION:"rotation"};var Te={radians:6370997/(2*Math.PI),degrees:2*Math.PI*6370997/360,ft:.3048,m:1,"us-ft":1200/3937};var ma=class{constructor(t){this.code_=t.code,this.units_=t.units,this.extent_=t.extent!==void 0?t.extent:null,this.worldExtent_=t.worldExtent!==void 0?t.worldExtent:null,this.axisOrientation_=t.axisOrientation!==void 0?t.axisOrientation:"enu",this.global_=t.global!==void 0?t.global:!1,this.canWrapX_=!!(this.global_&&this.extent_),this.getPointResolutionFunc_=t.getPointResolution,this.defaultTileGrid_=null,this.metersPerUnit_=t.metersPerUnit}canWrapX(){return this.canWrapX_}getCode(){return this.code_}getExtent(){return this.extent_}getUnits(){return this.units_}getMetersPerUnit(){return this.metersPerUnit_||Te[this.units_]}getWorldExtent(){return this.worldExtent_}getAxisOrientation(){return this.axisOrientation_}isGlobal(){return this.global_}setGlobal(t){this.global_=t,this.canWrapX_=!!(t&&this.extent_)}getDefaultTileGrid(){return this.defaultTileGrid_}setDefaultTileGrid(t){this.defaultTileGrid_=t}setExtent(t){this.extent_=t,this.canWrapX_=!!(this.global_&&t)}setWorldExtent(t){this.worldExtent_=t}setGetPointResolution(t){this.getPointResolutionFunc_=t}getPointResolutionFunc(){return this.getPointResolutionFunc_}},ss=ma;var Ks=6378137,rs=Math.PI*Ks,Bm=[-rs,-rs,rs,rs],Wm=[-180,-85,180,85],Qr=Ks*Math.log(Math.tan(Math.PI/2)),$i=class extends ss{constructor(t){super({code:t,units:"m",extent:Bm,global:!0,worldExtent:Wm,getPointResolution:function(e,i){return e/Math.cosh(i[1]/Ks)}})}},ga=[new $i("EPSG:3857"),new $i("EPSG:102100"),new $i("EPSG:102113"),new $i("EPSG:900913"),new $i("http://www.opengis.net/def/crs/EPSG/0/3857"),new $i("http://www.opengis.net/gml/srs/epsg.xml#3857")];function Ac(s,t,e){let i=s.length;e=e>1?e:2,t===void 0&&(e>2?t=s.slice():t=new Array(i));for(let n=0;nQr?o=Qr:o<-Qr&&(o=-Qr),t[n+1]=o}return t}function Pc(s,t,e){let i=s.length;e=e>1?e:2,t===void 0&&(e>2?t=s.slice():t=new Array(i));for(let n=0;na)return 1;if(a>o)return-1}return 0}function eo(s,t){return s[0]+=+t[0],s[1]+=+t[1],s}function En(s,t){let e=!0;for(let i=s.length-1;i>=0;--i)if(s[i]!=t[i]){e=!1;break}return e}function as(s,t){let e=Math.cos(t),i=Math.sin(t),n=s[0]*e-s[1]*i,o=s[1]*e+s[0]*i;return s[0]=n,s[1]=o,s}function io(s,t){return s[0]*=t,s[1]*=t,s}function no(s,t){if(t.canWrapX()){let e=gt(t.getExtent()),i=ya(s,t,e);i&&(s[0]-=i*e)}return s}function ya(s,t,e){let i=t.getExtent(),n=0;return t.canWrapX()&&(s[0]i[2])&&(e=e||gt(i),n=Math.floor((s[0]-i[0])/e)),n}var Ym=63710088e-1;function xa(s,t,e){e=e||Ym;let i=is(s[1]),n=is(t[1]),o=(n-i)/2,a=is(t[0]-s[0])/2,l=Math.sin(o)*Math.sin(o)+Math.sin(a)*Math.sin(a)*Math.cos(i)*Math.cos(n);return 2*e*Math.atan2(Math.sqrt(l),Math.sqrt(1-l))}var Dc={info:1,warn:2,error:3,none:4},Km=Dc.info;function so(...s){Km>Dc.warn||console.warn(...s)}var Ea=!0;function Ma(s){Ea=!(s===void 0?!0:s)}function va(s,t){if(t!==void 0){for(let e=0,i=s.length;e=l?t[o+u]:a[u]}return e}}function Uc(s,t,e,i){let n=Tt(s),o=Tt(t);xn(n,o,Gc(e)),xn(o,n,Gc(i))}function Mn(s,t){return Ma(),Cn(s,"EPSG:4326",t!==void 0?t:"EPSG:3857")}function bi(s,t){if(s===t)return!0;let e=s.getUnits()===t.getUnits();return(s.getCode()===t.getCode()||qs(s,t)===va)&&e}function qs(s,t){let e=s.getCode(),i=t.getCode(),n=to(e,i);return n||(n=zc),n}function vn(s,t){let e=Tt(s),i=Tt(t);return qs(e,i)}function Cn(s,t,e){return vn(t,e)(s,void 0,s.length)}function Vs(s,t,e,i){let n=vn(t,e);return Tc(s,n,void 0,i)}var Ke=null;function ao(){return Ke}function Hs(s,t){return Ke?Cn(s,t,Ke):s}function qe(s,t){return Ke?Cn(s,Ke,t):(Ea&&!En(s,[0,0])&&s[0]>=-180&&s[0]<=180&&s[1]>=-90&&s[1]<=90&&(Ea=!1,so("Call useGeographic() from ol/proj once to work with [longitude, latitude] coordinates.")),s)}function ls(s,t){return Ke?Vs(s,t,Ke):s}function Ve(s,t){return Ke?Vs(s,Ke,t):s}function Bc(s,t){if(!Ke)return s;let e=Tt(t).getUnits(),i=Ke.getUnits();return e&&i?s*Te[e]/Te[i]:s}function Sa(s,t,e){return function(i){let n,o;if(s.canWrapX()){let a=s.getExtent(),l=gt(a);i=i.slice(0),o=ya(i,s,l),o&&(i[0]=i[0]-o*l),i[0]=pt(i[0],a[0],a[2]),i[1]=pt(i[1],a[1],a[3]),n=e(i)}else n=e(i);return o&&t.canWrapX()&&(n[0]+=o*gt(t.getExtent())),n}}function Hm(){ro(ga),ro(pa),Vm(pa,ga,Ac,Pc)}Hm();function Ta(s,t,e){return function(i,n,o,a,l){if(!i)return;if(!n&&!t)return i;let u=t?0:o[0]*n,d=t?0:o[1]*n,m=l?l[0]:0,x=l?l[1]:0,E=s[0]+u/2+m,C=s[2]-u/2+m,T=s[1]+d/2+x,w=s[3]-d/2+x;E>C&&(E=(C+E)/2,C=E),T>w&&(T=(w+T)/2,w=T);let M=pt(i[0],E,C),v=pt(i[1],T,w);if(a&&e&&n){let I=30*n;M+=-I*Math.log(1+Math.max(0,E-i[0])/I)+I*Math.log(1+Math.max(0,i[0]-C)/I),v+=-I*Math.log(1+Math.max(0,T-i[1])/I)+I*Math.log(1+Math.max(0,i[1]-w)/I)}return[M,v]}}function ho(s){return s}function Ra(s,t,e,i){let n=gt(t)/e[0],o=se(t)/e[1];return i?Math.min(s,Math.max(n,o)):Math.min(s,Math.min(n,o))}function Ia(s,t,e){let i=Math.min(s,t),n=50;return i*=Math.log(1+n*Math.max(0,s/t-1))/n+1,e&&(i=Math.max(i,e),i/=Math.log(1+n*Math.max(0,e/s-1))/n+1),pt(i,e/2,t*2)}function Wc(s,t,e,i){return t=t!==void 0?t:!0,function(n,o,a,l){if(n!==void 0){let u=s[0],d=s[s.length-1],m=e?Ra(u,e,a,i):u;if(l)return t?Ia(n,m,d):pt(n,d,m);let x=Math.min(m,n),E=Math.floor(qn(s,x,o));return s[E]>m&&E1)x=e;else if(E>0){for(let C=0;Cn&&(n=d),o=l,a=u}return n}function eu(s,t,e,i,n){for(let o=0,a=e.length;o0;){let x=d.pop(),E=d.pop(),C=0,T=s[E],w=s[E+1],M=s[x],v=s[x+1];for(let I=E+i;IC&&(m=I,C=P)}C>n&&(u[(m-t)/i]=1,E+i0&&w>C)&&(T<0&&M0&&M>T)){d=x,m=E;continue}o[a++]=d,o[a++]=m,l=d,u=m,d=x,m=E}return o[a++]=d,o[a++]=m,a}function ou(s,t,e,i,n,o,a,l){for(let u=0,d=e.length;uo&&(d-l)*(o-u)-(n-l)*(m-u)>0&&a++:m<=o&&(d-l)*(o-u)-(n-l)*(m-u)<0&&a--,l=d,u=m}return a!==0}function co(s,t,e,i,n,o){if(e.length===0||!en(s,t,e[0],i,n,o))return!1;for(let a=1,l=e.length;av&&(d=(m+x)/2,co(s,t,e,i,d,T)&&(M=d,v=I)),m=x}return isNaN(M)&&(M=n[o]),a?(a.push(M,T,v),a):[M,T,v]}function cu(s,t,e,i,n){let o;for(t+=i;t=n[0]&&o[2]<=n[2]||o[1]>=n[1]&&o[3]<=n[3]?!0:cu(s,t,e,i,function(a,l){return Sc(n,a,l)}):!1}function za(s,t,e,i,n){return!!(uu(s,t,e,i,n)||en(s,t,e,i,n[0],n[1])||en(s,t,e,i,n[0],n[3])||en(s,t,e,i,n[2],n[1])||en(s,t,e,i,n[2],n[3]))}function du(s,t,e,i,n){if(!za(s,t,e[0],i,n))return!1;if(e.length===1)return!0;for(let o=1,a=e.length;o0}function gu(s,t,e,i,n){n=n!==void 0?n:!1;for(let o=0,a=e.length;o1&&typeof arguments[e-1]=="function"&&(i=arguments[e-1],--e);let n=0;for(;n0}getInteracting(){return this.hints_[Yt.INTERACTING]>0}cancelAnimations(){this.setHint(Yt.ANIMATING,-this.hints_[Yt.ANIMATING]);let t;for(let e=0,i=this.animations_.length;e=0;--i){let n=this.animations_[i],o=!0;for(let a=0,l=n.length;a0?d/u.duration:1;m>=1?(u.complete=!0,m=1):o=!1;let x=u.easing(m);if(u.sourceCenter){let E=u.sourceCenter[0],C=u.sourceCenter[1],T=u.targetCenter[0],w=u.targetCenter[1];this.nextCenter_=u.targetCenter;let M=E+x*(T-E),v=C+x*(w-C);this.targetCenter_=[M,v]}if(u.sourceResolution&&u.targetResolution){let E=x===1?u.targetResolution:u.sourceResolution+x*(u.targetResolution-u.sourceResolution);if(u.anchor){let C=this.getViewportSize_(this.getRotation()),T=this.constraints_.resolution(E,0,C,!0);this.targetCenter_=this.calculateCenterZoom(T,u.anchor)}this.nextResolution_=u.targetResolution,this.targetResolution_=E,this.applyTargetState_(!0)}if(u.sourceRotation!==void 0&&u.targetRotation!==void 0){let E=x===1?Pe(u.targetRotation+Math.PI,2*Math.PI)-Math.PI:u.sourceRotation+x*(u.targetRotation-u.sourceRotation);if(u.anchor){let C=this.constraints_.rotation(E,!0);this.targetCenter_=this.calculateCenterRotate(C,u.anchor)}this.nextRotation_=u.targetRotation,this.targetRotation_=E}if(this.applyTargetState_(!0),e=!0,!u.complete)break}if(o){this.animations_[i]=null,this.setHint(Yt.ANIMATING,-1),this.nextCenter_=null,this.nextResolution_=NaN,this.nextRotation_=NaN;let a=n[0].callback;a&&uo(a,!0)}}this.animations_=this.animations_.filter(Boolean),e&&this.updateAnimationKey_===void 0&&(this.updateAnimationKey_=requestAnimationFrame(this.updateAnimations_.bind(this)))}calculateCenterRotate(t,e){let i,n=this.getCenterInternal();return n!==void 0&&(i=[n[0]-e[0],n[1]-e[1]],as(i,t-this.getRotation()),eo(i,e)),i}calculateCenterZoom(t,e){let i,n=this.getCenterInternal(),o=this.getResolution();if(n!==void 0&&o!==void 0){let a=e[0]-t*(e[0]-n[0])/o,l=e[1]-t*(e[1]-n[1])/o;i=[a,l]}return i}getViewportSize_(t){let e=this.viewportSize_;if(t){let i=e[0],n=e[1];return[Math.abs(i*Math.cos(t))+Math.abs(n*Math.sin(t)),Math.abs(i*Math.sin(t))+Math.abs(n*Math.cos(t))]}return e}setViewportSize(t){this.viewportSize_=Array.isArray(t)?t.slice():[100,100],this.getAnimating()||this.resolveConstraints(0)}getCenter(){let t=this.getCenterInternal();return t&&Hs(t,this.getProjection())}getCenterInternal(){return this.get(Oe.CENTER)}getConstraints(){return this.constraints_}getConstrainResolution(){return this.get("constrainResolution")}getHints(t){return t!==void 0?(t[0]=this.hints_[0],t[1]=this.hints_[1],t):this.hints_.slice()}calculateExtent(t){let e=this.calculateExtentInternal(t);return ls(e,this.getProjection())}calculateExtentInternal(t){t=t||this.getViewportSizeMinusPadding_();let e=this.getCenterInternal();$(e,1);let i=this.getResolution();$(i!==void 0,2);let n=this.getRotation();return $(n!==void 0,3),js(e,i,n,t)}getMaxResolution(){return this.maxResolution_}getMinResolution(){return this.minResolution_}getMaxZoom(){return this.getZoomForResolution(this.minResolution_)}setMaxZoom(t){this.applyOptions_(this.getUpdatedOptions_({maxZoom:t}))}getMinZoom(){return this.getZoomForResolution(this.maxResolution_)}setMinZoom(t){this.applyOptions_(this.getUpdatedOptions_({minZoom:t}))}setConstrainResolution(t){this.applyOptions_(this.getUpdatedOptions_({constrainResolution:t}))}getProjection(){return this.projection_}getResolution(){return this.get(Oe.RESOLUTION)}getResolutions(){return this.resolutions_}getResolutionForExtent(t,e){return this.getResolutionForExtentInternal(Ve(t,this.getProjection()),e)}getResolutionForExtentInternal(t,e){e=e||this.getViewportSizeMinusPadding_();let i=gt(t)/e[0],n=se(t)/e[1];return Math.max(i,n)}getResolutionForValueFunction(t){t=t||2;let e=this.getConstrainedResolution(this.maxResolution_),i=this.minResolution_,n=Math.log(e/i)/Math.log(t);return function(o){return e/Math.pow(t,o*n)}}getRotation(){return this.get(Oe.ROTATION)}getValueForResolutionFunction(t){let e=Math.log(t||2),i=this.getConstrainedResolution(this.maxResolution_),n=this.minResolution_,o=Math.log(i/n)/e;return function(a){return Math.log(i/a)/e/o}}getViewportSizeMinusPadding_(t){let e=this.getViewportSize_(t),i=this.padding_;return i&&(e=[e[0]-i[1]-i[3],e[1]-i[0]-i[2]]),e}getState(){let t=this.getProjection(),e=this.getResolution(),i=this.getRotation(),n=this.getCenterInternal(),o=this.padding_;if(o){let a=this.getViewportSizeMinusPadding_();n=ja(n,this.getViewportSize_(),[a[0]/2+o[3],a[1]/2+o[0]],e,i)}return{center:n.slice(0),projection:t!==void 0?t:null,resolution:e,nextCenter:this.nextCenter_,nextResolution:this.nextResolution_,nextRotation:this.nextRotation_,rotation:i,zoom:this.getZoom()}}getViewStateAndExtent(){return{viewState:this.getState(),extent:this.calculateExtent()}}getZoom(){let t,e=this.getResolution();return e!==void 0&&(t=this.getZoomForResolution(e)),t}getZoomForResolution(t){let e=this.minZoom_||0,i,n;if(this.resolutions_){let o=qn(this.resolutions_,t,1);e=o,i=this.resolutions_[o],o==this.resolutions_.length-1?n=2:n=i/this.resolutions_[o+1]}else i=this.maxResolution_,n=this.zoomFactor_;return e+Math.log(i/t)/Math.log(n)}getResolutionForZoom(t){if(this.resolutions_){if(this.resolutions_.length<=1)return 0;let e=pt(Math.floor(t),0,this.resolutions_.length-2),i=this.resolutions_[e]/this.resolutions_[e+1];return this.resolutions_[e]/Math.pow(i,pt(t-e,0,1))}return this.maxResolution_/Math.pow(this.zoomFactor_,t-this.minZoom_)}fit(t,e){let i;if($(Array.isArray(t)||typeof t.getSimplifiedGeometry=="function",24),Array.isArray(t)){$(!Ji(t),25);let n=Ve(t,this.getProjection());i=Ba(n)}else if(t.getType()==="Circle"){let n=Ve(t.getExtent(),this.getProjection());i=Ba(n),i.rotate(this.getRotation(),Le(n))}else{let n=ao();n?i=t.clone().transform(n,this.getProjection()):i=t}this.fitInternal(i,e)}rotatedExtentForGeometry(t){let e=this.getRotation(),i=Math.cos(e),n=Math.sin(-e),o=t.getFlatCoordinates(),a=t.getStride(),l=1/0,u=1/0,d=-1/0,m=-1/0;for(let x=0,E=o.length;x{this.dispatchEvent("sourceready")},0))),this.changed()}getFeatures(t){return this.renderer_?this.renderer_.getFeatures(t):Promise.resolve([])}getData(t){return!this.renderer_||!this.rendered?null:this.renderer_.getData(t)}isVisible(t){let e,i=this.getMapInternal();!t&&i&&(t=i.getView()),t instanceof Re?e={viewState:t.getState(),extent:t.calculateExtent()}:e=t,!e.layerStatesArray&&i&&(e.layerStatesArray=i.getLayerGroup().getLayerStatesArray());let n;e.layerStatesArray?n=e.layerStatesArray.find(a=>a.layer===this):n=this.getLayerState();let o=this.getExtent();return Js(n,e.viewState)&&(!o||Ft(o,e.extent))}getAttributions(t){if(!this.isVisible(t))return[];let e,i=this.getSource();if(i&&(e=i.getAttributions()),!e)return[];let n=t instanceof Re?t.getViewStateAndExtent():t,o=e(n);return Array.isArray(o)||(o=[o]),o}render(t,e){let i=this.getRenderer();return i.prepareFrame(t)?(this.rendered=!0,i.renderFrame(t,e)):null}unrender(){this.rendered=!1}setMapInternal(t){t||this.unrender(),this.set(Et.MAP,t)}getMapInternal(){return this.get(Et.MAP)}setMap(t){this.mapPrecomposeKey_&&(ut(this.mapPrecomposeKey_),this.mapPrecomposeKey_=null),t||this.changed(),this.mapRenderKey_&&(ut(this.mapRenderKey_),this.mapRenderKey_=null),t&&(this.mapPrecomposeKey_=st(t,de.PRECOMPOSE,function(e){let n=e.frameState.layerStatesArray,o=this.getLayerState(!1);$(!n.some(function(a){return a.layer===o.layer}),67),n.push(o)},this),this.mapRenderKey_=st(this,q.CHANGE,t.render,t),this.changed())}setSource(t){this.set(Et.SOURCE,t)}getRenderer(){return this.renderer_||(this.renderer_=this.createRenderer()),this.renderer_}hasRenderer(){return!!this.renderer_}createRenderer(){return null}disposeInternal(){this.renderer_&&(this.renderer_.dispose(),delete this.renderer_),this.setSource(null),super.disposeInternal()}};function Js(s,t){if(!s.visible)return!1;let e=t.resolution;if(e=s.maxResolution)return!1;let i=t.zoom;return i>s.minZoom&&i<=s.maxZoom}var Tn=Ya;var Ka=class extends Kn{constructor(t){super(),this.map_=t}dispatchRenderEvent(t,e){ft()}calculateMatrices2D(t){let e=t.viewState,i=t.coordinateToPixelTransform,n=t.pixelToCoordinateTransform;ue(i,t.size[0]/2,t.size[1]/2,1/e.resolution,-1/e.resolution,-e.rotation,-e.center[0],-e.center[1]),$n(n,i)}forEachFeatureAtCoordinate(t,e,i,n,o,a,l,u){let d,m=e.viewState;function x(b,P,F,N){return o.call(a,P,b?F:null,N)}let E=m.projection,C=no(t.slice(),E),T=[[0,0]];if(E.canWrapX()&&n){let b=E.getExtent(),P=gt(b);T.push([-P,0],[P,0])}let w=e.layerStatesArray,M=w.length,v=[],I=[];for(let b=0;b=0;--P){let F=w[P],N=F.layer;if(N.hasRenderer()&&Js(F,m)&&l.call(u,N)){let G=N.getRenderer(),W=N.getSource();if(G&&W){let Y=W.getWrapX()?C:t,Z=x.bind(null,F.managed);I[0]=Y[0]+T[b][0],I[1]=Y[1]+T[b][1],d=G.forEachFeatureAtCoordinate(I,e,i,Z,v)}if(d)return d}}if(v.length===0)return;let L=1/v.length;return v.forEach((b,P)=>b.distanceSq+=P*L),v.sort((b,P)=>b.distanceSq-P.distanceSq),v.some(b=>d=b.callback(b.feature,b.layer,b.geometry)),d}hasFeatureAtCoordinate(t,e,i,n,o,a){return this.forEachFeatureAtCoordinate(t,e,i,n,Ci,this,o,a)!==void 0}getMap(){return this.map_}renderFrame(t){ft()}flushDeclutterItems(t){}scheduleExpireIconCache(t){ns.canExpireCache()&&t.postRenderFunctions.push(ig)}};function ig(s,t){ns.expire()}var yu=Ka;var qa=class extends Jt{constructor(t,e,i,n){super(t),this.inversePixelTransform=e,this.frameState=i,this.context=n}},fo=qa;var $s="ol-hidden",Eu="ol-selectable",fe="ol-unselectable",Va="ol-unsupported",ri="ol-control",Ha="ol-collapsed",ng=new RegExp(["^\\s*(?=(?:(?:[-a-z]+\\s*){0,2}(italic|oblique))?)","(?=(?:(?:[-a-z]+\\s*){0,2}(small-caps))?)","(?=(?:(?:[-a-z]+\\s*){0,2}(bold(?:er)?|lighter|[1-9]00 ))?)","(?:(?:normal|\\1|\\2|\\3)\\s*){0,3}((?:xx?-)?","(?:small|large)|medium|smaller|larger|[\\.\\d]+(?:\\%|in|[cem]m|ex|p[ctx]))","(?:\\s*\\/\\s*(normal|[\\.\\d]+(?:\\%|in|[cem]m|ex|p[ctx])?))",`?\\s*([-,\\"\\'\\sa-z]+?)\\s*$`].join(""),"i"),xu=["style","variant","weight","size","lineHeight","family"],Za=function(s){let t=s.match(ng);if(!t)return null;let e={lineHeight:"normal",size:"1.2em",style:"normal",weight:"normal",variant:"normal"};for(let i=0,n=xu.length;iMath.max(n,ro(s,o)),0);return e[t]=i,i}function Su(s,t){let e=[],i=[],n=[],o=0,a=0,l=0,u=0;for(let d=0,m=t.length;d<=m;d+=2){let x=t[d];if(x===` -`||d===m){o=Math.max(o,a),n.push(a),a=0,l+=u;continue}let E=t[d+1]||s.font,C=ro(E,x);e.push(C),a+=C;let T=ng(E);i.push(T),u=Math.max(u,T)}return{width:o,height:l,widths:e,heights:i,lineWidths:n}}function Tu(s,t,e,i,n,o,a,l,u,d,m){s.save(),e!==1&&(s.globalAlpha*=e),t&&s.setTransform.apply(s,t),i.contextInstructions?(s.translate(u,d),s.scale(m[0],m[1]),sg(i,s)):m[0]<0||m[1]<0?(s.translate(u,d),s.scale(m[0],m[1]),s.drawImage(i,n,o,a,l,0,0,a,l)):s.drawImage(i,n,o,a,l,u,d,a*m[0],l*m[1]),s.restore()}function sg(s,t){let e=s.contextInstructions;for(let i=0,n=e.length;i=0;--i)e[i].renderDeclutter(t);e.length=0}},Ru=Za;var qe=class extends Jt{constructor(t,e){super(t),this.layer=e}},Ja={LAYERS:"layers"},Vs=class extends Yr{constructor(t){t=t||{};let e=Object.assign({},t);delete e.layers;let i=t.layers;super(e),this.on,this.once,this.un,this.layersListenerKeys_=[],this.listenerKeys_={},this.addChangeListener(Ja.LAYERS,this.handleLayersChanged_),i?Array.isArray(i)?i=new ce(i.slice(),{unique:!0}):Q(typeof i.getArray=="function",43):i=new ce(void 0,{unique:!0}),this.setLayers(i)}handleLayerChange_(){this.changed()}handleLayersChanged_(){this.layersListenerKeys_.forEach(ut),this.layersListenerKeys_.length=0;let t=this.getLayers();this.layersListenerKeys_.push(st(t,$t.ADD,this.handleLayersAdd_,this),st(t,$t.REMOVE,this.handleLayersRemove_,this));for(let i in this.listenerKeys_)this.listenerKeys_[i].forEach(ut);ei(this.listenerKeys_);let e=t.getArray();for(let i=0,n=e.length;i{this.clickTimeoutId_=void 0;let i=new ai(It.SINGLECLICK,this.map_,t);this.dispatchEvent(i)},250)}updateActivePointers_(t){let e=t,i=e.pointerId;if(e.type==It.POINTERUP||e.type==It.POINTERCANCEL){delete this.trackedTouches_[i];for(let n in this.trackedTouches_)if(this.trackedTouches_[n].target!==e.target){delete this.trackedTouches_[n];break}}else(e.type==It.POINTERDOWN||e.type==It.POINTERMOVE)&&(this.trackedTouches_[i]=e);this.activePointers_=Object.values(this.trackedTouches_)}handlePointerUp_(t){this.updateActivePointers_(t);let e=new ai(It.POINTERUP,this.map_,t,void 0,void 0,this.activePointers_);this.dispatchEvent(e),this.emulateClicks_&&!e.defaultPrevented&&!this.dragging_&&this.isMouseActionButton_(t)&&this.emulateClick_(this.down_),this.activePointers_.length===0&&(this.dragListenerKeys_.forEach(ut),this.dragListenerKeys_.length=0,this.dragging_=!1,this.down_=null)}isMouseActionButton_(t){return t.button===0}handlePointerDown_(t){this.emulateClicks_=this.activePointers_.length===0,this.updateActivePointers_(t);let e=new ai(It.POINTERDOWN,this.map_,t,void 0,void 0,this.activePointers_);if(this.dispatchEvent(e),this.down_=new PointerEvent(t.type,t),Object.defineProperty(this.down_,"target",{writable:!1,value:t.target}),this.dragListenerKeys_.length===0){let i=this.map_.getOwnerDocument();this.dragListenerKeys_.push(st(i,It.POINTERMOVE,this.handlePointerMove_,this),st(i,It.POINTERUP,this.handlePointerUp_,this),st(this.element_,It.POINTERCANCEL,this.handlePointerUp_,this)),this.element_.getRootNode&&this.element_.getRootNode()!==i&&this.dragListenerKeys_.push(st(this.element_.getRootNode(),It.POINTERUP,this.handlePointerUp_,this))}}handlePointerMove_(t){if(this.isMoving_(t)){this.updateActivePointers_(t),this.dragging_=!0;let e=new ai(It.POINTERDRAG,this.map_,t,this.dragging_,void 0,this.activePointers_);this.dispatchEvent(e)}}relayMoveEvent_(t){this.originalPointerMoveEvent_=t;let e=!!(this.down_&&this.isMoving_(t));this.dispatchEvent(new ai(It.POINTERMOVE,this.map_,t,e))}handleTouchMove_(t){let e=this.originalPointerMoveEvent_;(!e||e.defaultPrevented)&&(typeof t.cancelable!="boolean"||t.cancelable===!0)&&t.preventDefault()}isMoving_(t){return this.dragging_||Math.abs(t.clientX-this.down_.clientX)>this.moveTolerance_||Math.abs(t.clientY-this.down_.clientY)>this.moveTolerance_}disposeInternal(){this.relayedListenerKey_&&(ut(this.relayedListenerKey_),this.relayedListenerKey_=null),this.element_.removeEventListener(H.TOUCHMOVE,this.boundHandleTouchMove_),this.pointerdownListenerKey_&&(ut(this.pointerdownListenerKey_),this.pointerdownListenerKey_=null),this.dragListenerKeys_.forEach(ut),this.dragListenerKeys_.length=0,this.element_=null,super.disposeInternal()}},Iu=th;var Fe={POSTRENDER:"postrender",MOVESTART:"movestart",MOVEEND:"moveend",LOADSTART:"loadstart",LOADEND:"loadend"};var Xt={LAYERGROUP:"layergroup",SIZE:"size",TARGET:"target",VIEW:"view"};var Hs=1/0,eh=class{constructor(t,e){this.priorityFunction_=t,this.keyFunction_=e,this.elements_=[],this.priorities_=[],this.queuedElements_={}}clear(){this.elements_.length=0,this.priorities_.length=0,ei(this.queuedElements_)}dequeue(){let t=this.elements_,e=this.priorities_,i=t[0];t.length==1?(t.length=0,e.length=0):(t[0]=t.pop(),e[0]=e.pop(),this.siftUp_(0));let n=this.keyFunction_(i);return delete this.queuedElements_[n],i}enqueue(t){Q(!(this.keyFunction_(t)in this.queuedElements_),31);let e=this.priorityFunction_(t);return e!=Hs?(this.elements_.push(t),this.priorities_.push(e),this.queuedElements_[this.keyFunction_(t)]=!0,this.siftDown_(0,this.elements_.length-1),!0):!1}getCount(){return this.elements_.length}getLeftChildIndex_(t){return t*2+1}getRightChildIndex_(t){return t*2+2}getParentIndex_(t){return t-1>>1}heapify_(){let t;for(t=(this.elements_.length>>1)-1;t>=0;t--)this.siftUp_(t)}isEmpty(){return this.elements_.length===0}isKeyQueued(t){return t in this.queuedElements_}isQueued(t){return this.isKeyQueued(this.keyFunction_(t))}siftUp_(t){let e=this.elements_,i=this.priorities_,n=e.length,o=e[t],a=i[t],l=t;for(;t>1;){let u=this.getLeftChildIndex_(t),d=this.getRightChildIndex_(t),m=dt;){let l=this.getParentIndex_(e);if(n[l]>a)i[e]=i[l],n[e]=n[l],e=l;else break}i[e]=o,n[e]=a}reprioritize(){let t=this.priorityFunction_,e=this.elements_,i=this.priorities_,n=0,o=e.length,a,l,u;for(l=0;l0;)o=this.dequeue()[0],a=o.getKey(),n=o.getState(),n===$.IDLE&&!(a in this.tilesLoadingKeys_)&&(this.tilesLoadingKeys_[a]=!0,++this.tilesLoading_,++i,o.load())}},bu=ih;function Lu(s,t,e,i,n){if(!s||!(e in s.wantedTiles))return Hs;if(!s.wantedTiles[e][t.getKey()])return Hs;let o=s.viewState.center,a=i[0]-o[0],l=i[1]-o[1];return 65536*Math.log(n)+Math.sqrt(a*a+l*l)/n}var nh=class extends Nt{constructor(t){super();let e=t.element;e&&!t.target&&!e.style.pointerEvents&&(e.style.pointerEvents="auto"),this.element=e||null,this.target_=null,this.map_=null,this.listenerKeys=[],t.render&&(this.render=t.render),t.target&&this.setTarget(t.target)}disposeInternal(){Rn(this.element),super.disposeInternal()}getMap(){return this.map_}setMap(t){this.map_&&Rn(this.element);for(let e=0,i=this.listenerKeys.length;en.getAttributions(t)))),i=!this.getMap().getAllLayers().some(n=>n.getSource()&&n.getSource().getAttributionsCollapsible()===!1);return this.overrideCollapsible_||this.setCollapsible(i),e}updateElement_(t){if(!t){this.renderedVisible_&&(this.element.style.display="none",this.renderedVisible_=!1);return}let e=this.collectSourceAttributions_(t),i=e.length>0;if(this.renderedVisible_!=i&&(this.element.style.display=i?"":"none",this.renderedVisible_=i),!ie(e,this.renderedAttributions_)){so(this.ulElement_);for(let n=0,o=e.length;n0&&i%(2*Math.PI)!==0?e.animate({rotation:0,duration:this.duration_,easing:ye}):e.setRotation(0))}render(t){let e=t.frameState;if(!e)return;let i=e.viewState.rotation;if(i!=this.rotation_){let n="rotate("+i+"rad)";if(this.autoHide_){let o=this.element.classList.contains(qs);!o&&i===0?this.element.classList.add(qs):o&&i!==0&&this.element.classList.remove(qs)}this.label_.style.transform=n}this.rotation_=i}},Au=rh;var oh=class extends re{constructor(t){t=t||{},super({element:document.createElement("div"),target:t.target});let e=t.className!==void 0?t.className:"ol-zoom",i=t.delta!==void 0?t.delta:1,n=t.zoomInClassName!==void 0?t.zoomInClassName:e+"-in",o=t.zoomOutClassName!==void 0?t.zoomOutClassName:e+"-out",a=t.zoomInLabel!==void 0?t.zoomInLabel:"+",l=t.zoomOutLabel!==void 0?t.zoomOutLabel:"\u2013",u=t.zoomInTipLabel!==void 0?t.zoomInTipLabel:"Zoom in",d=t.zoomOutTipLabel!==void 0?t.zoomOutTipLabel:"Zoom out",m=document.createElement("button");m.className=n,m.setAttribute("type","button"),m.title=u,m.appendChild(typeof a=="string"?document.createTextNode(a):a),m.addEventListener(H.CLICK,this.handleClick_.bind(this,i),!1);let x=document.createElement("button");x.className=o,x.setAttribute("type","button"),x.title=d,x.appendChild(typeof l=="string"?document.createTextNode(l):l),x.addEventListener(H.CLICK,this.handleClick_.bind(this,-i),!1);let E=e+" "+fe+" "+ni,C=this.element;C.className=E,C.appendChild(m),C.appendChild(x),this.duration_=t.duration!==void 0?t.duration:250}handleClick_(t,e){e.preventDefault(),this.zoomByDelta_(t)}zoomByDelta_(t){let i=this.getMap().getView();if(!i)return;let n=i.getZoom();if(n!==void 0){let o=i.getConstrainedZoom(n+t);this.duration_>0?(i.getAnimating()&&i.cancelAnimations(),i.animate({zoom:o,duration:this.duration_,easing:ye})):i.setZoom(o)}}},Pu=oh;function Js(s){s=s||{};let t=new ce;return(s.zoom!==void 0?s.zoom:!0)&&t.push(new Pu(s.zoomOptions)),(s.rotate!==void 0?s.rotate:!0)&&t.push(new Au(s.rotateOptions)),(s.attribution!==void 0?s.attribution:!0)&&t.push(new Zs(s.attributionOptions)),t}var ah={ACTIVE:"active"};var hh=class extends Nt{constructor(t){super(),this.on,this.once,this.un,t&&t.handleEvent&&(this.handleEvent=t.handleEvent),this.map_=null,this.setActive(!0)}getActive(){return this.get(ah.ACTIVE)}getMap(){return this.map_}handleEvent(t){return!0}setActive(t){this.set(ah.ACTIVE,t)}setMap(t){this.map_=t}};function Ou(s,t,e){let i=s.getCenterInternal();if(i){let n=[i[0]+t[0],i[1]+t[1]];s.animateInternal({duration:e!==void 0?e:250,easing:Yc,center:s.getConstrainedCenter(n)})}}function fs(s,t,e,i){let n=s.getZoom();if(n===void 0)return;let o=s.getConstrainedZoom(n+t),a=s.getResolutionForZoom(o);s.getAnimating()&&s.cancelAnimations(),s.animate({resolution:a,anchor:e,duration:i!==void 0?i:250,easing:ye})}var hi=hh;var lh=class extends hi{constructor(t){super(),t=t||{},this.delta_=t.delta?t.delta:1,this.duration_=t.duration!==void 0?t.duration:250}handleEvent(t){let e=!1;if(t.type==It.DBLCLICK){let i=t.originalEvent,n=t.map,o=t.coordinate,a=i.shiftKey?-this.delta_:this.delta_,l=n.getView();fs(l,a,o,this.duration_),i.preventDefault(),e=!0}return!e}},Fu=lh;var ch=class extends hi{constructor(t){t=t||{},super(t),t.handleDownEvent&&(this.handleDownEvent=t.handleDownEvent),t.handleDragEvent&&(this.handleDragEvent=t.handleDragEvent),t.handleMoveEvent&&(this.handleMoveEvent=t.handleMoveEvent),t.handleUpEvent&&(this.handleUpEvent=t.handleUpEvent),t.stopDown&&(this.stopDown=t.stopDown),this.handlingDownUpSequence=!1,this.targetPointers=[]}getPointerCount(){return this.targetPointers.length}handleDownEvent(t){return!1}handleDragEvent(t){}handleEvent(t){if(!t.originalEvent)return!0;let e=!1;if(this.updateTrackedPointers_(t),this.handlingDownUpSequence){if(t.type==It.POINTERDRAG)this.handleDragEvent(t),t.originalEvent.preventDefault();else if(t.type==It.POINTERUP){let i=this.handleUpEvent(t);this.handlingDownUpSequence=i&&this.targetPointers.length>0}}else if(t.type==It.POINTERDOWN){let i=this.handleDownEvent(t);this.handlingDownUpSequence=i,e=this.stopDown(i)}else t.type==It.POINTERMOVE&&this.handleMoveEvent(t);return!e}handleMoveEvent(t){}handleUpEvent(t){return!1}stopDown(t){return t}updateTrackedPointers_(t){t.activePointers&&(this.targetPointers=t.activePointers)}};function ms(s){let t=s.length,e=0,i=0;for(let n=0;n0&&this.condition_(t)){let i=t.map.getView();return this.lastCentroid=null,i.getAnimating()&&i.cancelAnimations(),this.kinetic_&&this.kinetic_.begin(),this.noKinetic_=this.targetPointers.length>1,!0}return!1}},Bu=uh;var dh=class extends li{constructor(t){t=t||{},super({stopDown:Mi}),this.condition_=t.condition?t.condition:ku,this.lastAngle_=void 0,this.duration_=t.duration!==void 0?t.duration:250}handleDragEvent(t){if(!uo(t))return;let e=t.map,i=e.getView();if(i.getConstraints().rotation===as)return;let n=e.getSize(),o=t.pixel,a=Math.atan2(n[1]/2-o[1],o[0]-n[0]/2);if(this.lastAngle_!==void 0){let l=a-this.lastAngle_;i.adjustRotationInternal(-l)}this.lastAngle_=a}handleUpEvent(t){return uo(t)?(t.map.getView().endInteraction(this.duration_),!1):!0}handleDownEvent(t){return uo(t)&&ho(t)&&this.condition_(t)?(t.map.getView().beginInteraction(),this.lastAngle_=void 0,!0):!1}},Uu=dh;var fh=class extends jn{constructor(t){super(),this.geometry_=null,this.element_=document.createElement("div"),this.element_.style.position="absolute",this.element_.style.pointerEvents="auto",this.element_.className="ol-box "+t,this.map_=null,this.startPixel_=null,this.endPixel_=null}disposeInternal(){this.setMap(null)}render_(){let t=this.startPixel_,e=this.endPixel_,i="px",n=this.element_.style;n.left=Math.min(t[0],e[0])+i,n.top=Math.min(t[1],e[1])+i,n.width=Math.abs(e[0]-t[0])+i,n.height=Math.abs(e[1]-t[1])+i}setMap(t){if(this.map_){this.map_.getOverlayContainer().removeChild(this.element_);let e=this.element_.style;e.left="inherit",e.top="inherit",e.width="inherit",e.height="inherit"}this.map_=t,this.map_&&this.map_.getOverlayContainer().appendChild(this.element_)}setPixels(t,e){this.startPixel_=t,this.endPixel_=e,this.createOrUpdateGeometry(),this.render_()}createOrUpdateGeometry(){let t=this.startPixel_,e=this.endPixel_,n=[t,[t[0],e[1]],e,[e[0],t[1]]].map(this.map_.getCoordinateFromPixelInternal,this.map_);n[4]=n[0].slice(),this.geometry_?this.geometry_.setCoordinates([n]):this.geometry_=new mu([n])}getGeometry(){return this.geometry_}},Wu=fh;var fo={BOXSTART:"boxstart",BOXDRAG:"boxdrag",BOXEND:"boxend",BOXCANCEL:"boxcancel"},Qs=class extends Jt{constructor(t,e,i){super(t),this.coordinate=e,this.mapBrowserEvent=i}},mh=class extends li{constructor(t){super(),this.on,this.once,this.un,t=t||{},this.box_=new Wu(t.className||"ol-dragbox"),this.minArea_=t.minArea!==void 0?t.minArea:64,t.onBoxEnd&&(this.onBoxEnd=t.onBoxEnd),this.startPixel_=null,this.condition_=t.condition?t.condition:ho,this.boxEndCondition_=t.boxEndCondition?t.boxEndCondition:this.defaultBoxEndCondition}defaultBoxEndCondition(t,e,i){let n=i[0]-e[0],o=i[1]-e[1];return n*n+o*o>=this.minArea_}getGeometry(){return this.box_.getGeometry()}handleDragEvent(t){this.box_.setPixels(this.startPixel_,t.pixel),this.dispatchEvent(new Qs(fo.BOXDRAG,t.coordinate,t))}handleUpEvent(t){this.box_.setMap(null);let e=this.boxEndCondition_(t,this.startPixel_,t.pixel);return e&&this.onBoxEnd(t),this.dispatchEvent(new Qs(e?fo.BOXEND:fo.BOXCANCEL,t.coordinate,t)),!1}handleDownEvent(t){return this.condition_(t)?(this.startPixel_=t.pixel,this.box_.setMap(t.map),this.box_.setPixels(this.startPixel_,this.startPixel_),this.dispatchEvent(new Qs(fo.BOXSTART,t.coordinate,t)),!0):!1}onBoxEnd(t){}},ju=mh;var gh=class extends ju{constructor(t){t=t||{};let e=t.condition?t.condition:Gu;super({condition:e,className:t.className||"ol-dragzoom",minArea:t.minArea}),this.duration_=t.duration!==void 0?t.duration:200,this.out_=t.out!==void 0?t.out:!1}onBoxEnd(t){let i=this.getMap().getView(),n=this.getGeometry();if(this.out_){let o=i.rotatedExtentForGeometry(n),a=i.getResolutionForExtentInternal(o),l=i.getResolution()/a;n=n.clone(),n.scale(l*l)}i.fitInternal(n,{duration:this.duration_,easing:ye})}},Xu=gh;var nn={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",DOWN:"ArrowDown"};var ph=class extends hi{constructor(t){super(),t=t||{},this.defaultCondition_=function(e){return lo(e)&&co(e)},this.condition_=t.condition!==void 0?t.condition:this.defaultCondition_,this.duration_=t.duration!==void 0?t.duration:100,this.pixelDelta_=t.pixelDelta!==void 0?t.pixelDelta:128}handleEvent(t){let e=!1;if(t.type==H.KEYDOWN){let i=t.originalEvent,n=i.key;if(this.condition_(t)&&(n==nn.DOWN||n==nn.LEFT||n==nn.RIGHT||n==nn.UP)){let a=t.map.getView(),l=a.getResolution()*this.pixelDelta_,u=0,d=0;n==nn.DOWN?d=-l:n==nn.LEFT?u=-l:n==nn.RIGHT?u=l:d=l;let m=[u,d];ss(m,a.getRotation()),Ou(a,m,this.duration_),i.preventDefault(),e=!0}}return!e}},Yu=ph;var _h=class extends hi{constructor(t){super(),t=t||{},this.condition_=t.condition?t.condition:function(e){return!Du(e)&&co(e)},this.delta_=t.delta?t.delta:1,this.duration_=t.duration!==void 0?t.duration:100}handleEvent(t){let e=!1;if(t.type==H.KEYDOWN||t.type==H.KEYPRESS){let i=t.originalEvent,n=i.key;if(this.condition_(t)&&(n==="+"||n==="-")){let o=t.map,a=n==="+"?this.delta_:-this.delta_,l=o.getView();fs(l,a,void 0,this.duration_),i.preventDefault(),e=!0}}return!e}},Ku=_h;var yh=class{constructor(t,e,i){this.decay_=t,this.minVelocity_=e,this.delay_=i,this.points_=[],this.angle_=0,this.initialVelocity_=0}begin(){this.points_.length=0,this.angle_=0,this.initialVelocity_=0}update(t,e){this.points_.push(t,e,Date.now())}end(){if(this.points_.length<6)return!1;let t=Date.now()-this.delay_,e=this.points_.length-3;if(this.points_[e+2]0&&this.points_[i+2]>t;)i-=3;let n=this.points_[e+2]-this.points_[i+2];if(n<1e3/60)return!1;let o=this.points_[e]-this.points_[i],a=this.points_[e+1]-this.points_[i+1];return this.angle_=Math.atan2(a,o),this.initialVelocity_=Math.sqrt(o*o+a*a)/n,this.initialVelocity_>this.minVelocity_}getDistance(){return(this.minVelocity_-this.initialVelocity_)/this.decay_}getAngle(){return this.angle_}},qu=yh;var xh=class extends hi{constructor(t){t=t||{},super(t),this.totalDelta_=0,this.lastDelta_=0,this.maxDelta_=t.maxDelta!==void 0?t.maxDelta:1,this.duration_=t.duration!==void 0?t.duration:250,this.timeout_=t.timeout!==void 0?t.timeout:80,this.useAnchor_=t.useAnchor!==void 0?t.useAnchor:!0,this.constrainResolution_=t.constrainResolution!==void 0?t.constrainResolution:!1;let e=t.condition?t.condition:Nu;this.condition_=t.onFocusOnly?$s(ao,e):e,this.lastAnchor_=null,this.startTime_=void 0,this.timeoutId_,this.mode_=void 0,this.trackpadEventGap_=400,this.trackpadTimeoutId_,this.deltaPerZoom_=300}endInteraction_(){this.trackpadTimeoutId_=void 0;let t=this.getMap();if(!t)return;t.getView().endInteraction(void 0,this.lastDelta_?this.lastDelta_>0?1:-1:0,this.lastAnchor_)}handleEvent(t){if(!this.condition_(t)||t.type!==H.WHEEL)return!0;let i=t.map,n=t.originalEvent;n.preventDefault(),this.useAnchor_&&(this.lastAnchor_=t.coordinate);let o;if(t.type==H.WHEEL&&(o=n.deltaY,cc&&n.deltaMode===WheelEvent.DOM_DELTA_PIXEL&&(o/=Fr),n.deltaMode===WheelEvent.DOM_DELTA_LINE&&(o*=40)),o===0)return!1;this.lastDelta_=o;let a=Date.now();this.startTime_===void 0&&(this.startTime_=a),(!this.mode_||a-this.startTime_>this.trackpadEventGap_)&&(this.mode_=Math.abs(o)<4?"trackpad":"wheel");let l=i.getView();if(this.mode_==="trackpad"&&!(l.getConstrainResolution()||this.constrainResolution_))return this.trackpadTimeoutId_?clearTimeout(this.trackpadTimeoutId_):(l.getAnimating()&&l.cancelAnimations(),l.beginInteraction()),this.trackpadTimeoutId_=setTimeout(this.endInteraction_.bind(this),this.timeout_),l.adjustZoom(-o/this.deltaPerZoom_,this.lastAnchor_),this.startTime_=a,!1;this.totalDelta_+=o;let u=Math.max(this.timeout_-(a-this.startTime_),0);return clearTimeout(this.timeoutId_),this.timeoutId_=setTimeout(this.handleWheelZoom_.bind(this,i),u),!1}handleWheelZoom_(t){let e=t.getView();e.getAnimating()&&e.cancelAnimations();let i=-pt(this.totalDelta_,-this.maxDelta_*this.deltaPerZoom_,this.maxDelta_*this.deltaPerZoom_)/this.deltaPerZoom_;(e.getConstrainResolution()||this.constrainResolution_)&&(i=i?i>0?1:-1:0),fs(e,i,this.lastAnchor_,this.duration_),this.mode_=void 0,this.totalDelta_=0,this.lastAnchor_=null,this.startTime_=void 0,this.timeoutId_=void 0}setMouseAnchor(t){this.useAnchor_=t,t||(this.lastAnchor_=null)}},Vu=xh;var Eh=class extends li{constructor(t){t=t||{};let e=t;e.stopDown||(e.stopDown=Mi),super(e),this.anchor_=null,this.lastAngle_=void 0,this.rotating_=!1,this.rotationDelta_=0,this.threshold_=t.threshold!==void 0?t.threshold:.3,this.duration_=t.duration!==void 0?t.duration:250}handleDragEvent(t){let e=0,i=this.targetPointers[0],n=this.targetPointers[1],o=Math.atan2(n.clientY-i.clientY,n.clientX-i.clientX);if(this.lastAngle_!==void 0){let u=o-this.lastAngle_;this.rotationDelta_+=u,!this.rotating_&&Math.abs(this.rotationDelta_)>this.threshold_&&(this.rotating_=!0),e=u}this.lastAngle_=o;let a=t.map,l=a.getView();l.getConstraints().rotation!==as&&(this.anchor_=a.getCoordinateFromPixelInternal(a.getEventPixel(ms(this.targetPointers))),this.rotating_&&(a.render(),l.adjustRotationInternal(e,this.anchor_)))}handleUpEvent(t){return this.targetPointers.length<2?(t.map.getView().endInteraction(this.duration_),!1):!0}handleDownEvent(t){if(this.targetPointers.length>=2){let e=t.map;return this.anchor_=null,this.lastAngle_=void 0,this.rotating_=!1,this.rotationDelta_=0,this.handlingDownUpSequence||e.getView().beginInteraction(),!0}return!1}},Hu=Eh;var Mh=class extends li{constructor(t){t=t||{};let e=t;e.stopDown||(e.stopDown=Mi),super(e),this.anchor_=null,this.duration_=t.duration!==void 0?t.duration:400,this.lastDistance_=void 0,this.lastScaleDelta_=1}handleDragEvent(t){let e=1,i=this.targetPointers[0],n=this.targetPointers[1],o=i.clientX-n.clientX,a=i.clientY-n.clientY,l=Math.sqrt(o*o+a*a);this.lastDistance_!==void 0&&(e=this.lastDistance_/l),this.lastDistance_=l;let u=t.map,d=u.getView();e!=1&&(this.lastScaleDelta_=e),this.anchor_=u.getCoordinateFromPixelInternal(u.getEventPixel(ms(this.targetPointers))),u.render(),d.adjustResolutionInternal(e,this.anchor_)}handleUpEvent(t){if(this.targetPointers.length<2){let i=t.map.getView(),n=this.lastScaleDelta_>1?1:-1;return i.endInteraction(this.duration_,n),!1}return!0}handleDownEvent(t){if(this.targetPointers.length>=2){let e=t.map;return this.anchor_=null,this.lastDistance_=void 0,this.lastScaleDelta_=1,this.handlingDownUpSequence||e.getView().beginInteraction(),!0}return!1}},Zu=Mh;function mo(s){s=s||{};let t=new ce,e=new qu(-.005,.05,100);return(s.altShiftDragRotate!==void 0?s.altShiftDragRotate:!0)&&t.push(new Uu),(s.doubleClickZoom!==void 0?s.doubleClickZoom:!0)&&t.push(new Fu({delta:s.zoomDelta,duration:s.zoomDuration})),(s.dragPan!==void 0?s.dragPan:!0)&&t.push(new Bu({onFocusOnly:s.onFocusOnly,kinetic:e})),(s.pinchRotate!==void 0?s.pinchRotate:!0)&&t.push(new Hu),(s.pinchZoom!==void 0?s.pinchZoom:!0)&&t.push(new Zu({duration:s.zoomDuration})),(s.keyboard!==void 0?s.keyboard:!0)&&(t.push(new Yu),t.push(new Ku({delta:s.zoomDelta,duration:s.zoomDuration}))),(s.mouseWheelZoom!==void 0?s.mouseWheelZoom:!0)&&t.push(new Vu({onFocusOnly:s.onFocusOnly,duration:s.zoomDuration})),(s.shiftDragZoom!==void 0?s.shiftDragZoom:!0)&&t.push(new Xu({duration:s.zoomDuration})),t}function vh(s,t,e){return e===void 0&&(e=[0,0]),e[0]=s[0]+2*t,e[1]=s[1]+2*t,e}function Ch(s){return s[0]>0&&s[1]>0}function go(s,t,e){return e===void 0&&(e=[0,0]),e[0]=s[0]*t+.5|0,e[1]=s[1]*t+.5|0,e}function zt(s,t){return Array.isArray(s)?s:(t===void 0?t=[s,s]:(t[0]=s,t[1]=s),t)}function Ju(s){if(s instanceof Sn){s.setMapInternal(null);return}s instanceof oi&&s.getLayers().forEach(Ju)}function $u(s,t){if(s instanceof Sn){s.setMapInternal(t);return}if(s instanceof oi){let e=s.getLayers().getArray();for(let i=0,n=e.length;ithis.updateSize()),this.controls=e.controls||Js(),this.interactions=e.interactions||mo({onFocusOnly:!0}),this.overlays_=e.overlays,this.overlayIdIndex_={},this.renderer_=null,this.postRenderFunctions_=[],this.tileQueue_=new bu(this.getTilePriority.bind(this),this.handleTileChange_.bind(this)),this.addChangeListener(Xt.LAYERGROUP,this.handleLayerGroupChanged_),this.addChangeListener(Xt.VIEW,this.handleViewChanged_),this.addChangeListener(Xt.SIZE,this.handleSizeChanged_),this.addChangeListener(Xt.TARGET,this.handleTargetChanged_),this.setProperties(e.values);let i=this;t.view&&!(t.view instanceof Re)&&t.view.then(function(n){i.setView(new Re(n))}),this.controls.addEventListener($t.ADD,n=>{n.element.setMap(this)}),this.controls.addEventListener($t.REMOVE,n=>{n.element.setMap(null)}),this.interactions.addEventListener($t.ADD,n=>{n.element.setMap(this)}),this.interactions.addEventListener($t.REMOVE,n=>{n.element.setMap(null)}),this.overlays_.addEventListener($t.ADD,n=>{this.addOverlayInternal_(n.element)}),this.overlays_.addEventListener($t.REMOVE,n=>{let o=n.element.getId();o!==void 0&&delete this.overlayIdIndex_[o.toString()],n.element.setMap(null)}),this.controls.forEach(n=>{n.setMap(this)}),this.interactions.forEach(n=>{n.setMap(this)}),this.overlays_.forEach(this.addOverlayInternal_.bind(this))}addControl(t){this.getControls().push(t)}addInteraction(t){this.getInteractions().push(t)}addLayer(t){this.getLayerGroup().getLayers().push(t)}handleLayerAdd_(t){$u(t.layer,this)}addOverlay(t){this.getOverlays().push(t)}addOverlayInternal_(t){let e=t.getId();e!==void 0&&(this.overlayIdIndex_[e.toString()]=t),t.setMap(this)}disposeInternal(){this.controls.clear(),this.interactions.clear(),this.overlays_.clear(),this.resizeObserver_.disconnect(),this.setTarget(null),super.disposeInternal()}forEachFeatureAtPixel(t,e,i){if(!this.frameState_||!this.renderer_)return;let n=this.getCoordinateFromPixelInternal(t);i=i!==void 0?i:{};let o=i.hitTolerance!==void 0?i.hitTolerance:0,a=i.layerFilter!==void 0?i.layerFilter:Ei,l=i.checkWrapped!==!1;return this.renderer_.forEachFeatureAtCoordinate(n,this.frameState_,o,l,e,null,a,null)}getFeaturesAtPixel(t,e){let i=[];return this.forEachFeatureAtPixel(t,function(n){i.push(n)},e),i}getAllLayers(){let t=[];function e(i){i.forEach(function(n){n instanceof oi?e(n.getLayers()):t.push(n)})}return e(this.getLayers()),t}hasFeatureAtPixel(t,e){if(!this.frameState_||!this.renderer_)return!1;let i=this.getCoordinateFromPixelInternal(t);e=e!==void 0?e:{};let n=e.layerFilter!==void 0?e.layerFilter:Ei,o=e.hitTolerance!==void 0?e.hitTolerance:0,a=e.checkWrapped!==!1;return this.renderer_.hasFeatureAtCoordinate(i,this.frameState_,o,a,n,null)}getEventCoordinate(t){return this.getCoordinateFromPixel(this.getEventPixel(t))}getEventCoordinateInternal(t){return this.getCoordinateFromPixelInternal(this.getEventPixel(t))}getEventPixel(t){let i=this.viewport_.getBoundingClientRect(),n=this.getSize(),o=i.width/n[0],a=i.height/n[1],l="changedTouches"in t?t.changedTouches[0]:t;return[(l.clientX-i.left)/o,(l.clientY-i.top)/a]}getTarget(){return this.get(Xt.TARGET)}getTargetElement(){return this.targetElement_}getCoordinateFromPixel(t){return Xs(this.getCoordinateFromPixelInternal(t),this.getView().getProjection())}getCoordinateFromPixelInternal(t){let e=this.frameState_;return e?Pt(e.pixelToCoordinateTransform,t.slice()):null}getControls(){return this.controls}getOverlays(){return this.overlays_}getOverlayById(t){let e=this.overlayIdIndex_[t.toString()];return e!==void 0?e:null}getInteractions(){return this.interactions}getLayerGroup(){return this.get(Xt.LAYERGROUP)}setLayers(t){let e=this.getLayerGroup();if(t instanceof ce){e.setLayers(t);return}let i=e.getLayers();i.clear(),i.extend(t)}getLayers(){return this.getLayerGroup().getLayers()}getLoadingOrNotReady(){let t=this.getLayerGroup().getLayerStatesArray();for(let e=0,i=t.length;e=0;o--){let a=n[o];if(a.getMap()!==this||!a.getActive()||!this.getTargetElement())continue;if(!a.handleEvent(t)||t.propagationStopped)break}}}handlePostRender(){let t=this.frameState_,e=this.tileQueue_;if(!e.isEmpty()){let n=this.maxTilesLoading_,o=n;if(t){let a=t.viewHints;if(a[Yt.ANIMATING]||a[Yt.INTERACTING]){let l=Date.now()-t.time>8;n=l?0:8,o=l?0:2}}e.getTilesLoading(){this.postRenderTimeoutHandle_=void 0,this.handlePostRender()},0))}setLayerGroup(t){let e=this.getLayerGroup();e&&this.handleLayerRemove_(new qe("removelayer",e)),this.set(Xt.LAYERGROUP,t)}setSize(t){this.set(Xt.SIZE,t)}setTarget(t){this.set(Xt.TARGET,t)}setView(t){if(!t||t instanceof Re){this.set(Xt.VIEW,t);return}this.set(Xt.VIEW,new Re);let e=this;t.then(function(i){e.setView(new Re(i))})}updateSize(){let t=this.getTargetElement(),e;if(t){let n=getComputedStyle(t),o=t.offsetWidth-parseFloat(n.borderLeftWidth)-parseFloat(n.paddingLeft)-parseFloat(n.paddingRight)-parseFloat(n.borderRightWidth),a=t.offsetHeight-parseFloat(n.borderTopWidth)-parseFloat(n.paddingTop)-parseFloat(n.paddingBottom)-parseFloat(n.borderBottomWidth);!isNaN(o)&&!isNaN(a)&&(e=[o,a],!Ch(e)&&!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)&&Hr("No map visible because the map container's width or height are 0."))}let i=this.getSize();e&&(!i||!ie(e,i))&&(this.setSize(e),this.updateViewportSize_())}updateViewportSize_(){let t=this.getView();if(t){let e,i=getComputedStyle(this.viewport_);i.width&&i.height&&(e=[parseInt(i.width,10),parseInt(i.height,10)]),t.setViewportSize(e)}}};function og(s){let t=null;s.keyboardEventTarget!==void 0&&(t=typeof s.keyboardEventTarget=="string"?document.getElementById(s.keyboardEventTarget):s.keyboardEventTarget);let e={},i=s.layers&&typeof s.layers.getLayers=="function"?s.layers:new oi({layers:s.layers});e[Xt.LAYERGROUP]=i,e[Xt.TARGET]=s.target,e[Xt.VIEW]=s.view instanceof Re?s.view:new Re;let n;s.controls!==void 0&&(Array.isArray(s.controls)?n=new ce(s.controls.slice()):(Q(typeof s.controls.getArray=="function",47),n=s.controls));let o;s.interactions!==void 0&&(Array.isArray(s.interactions)?o=new ce(s.interactions.slice()):(Q(typeof s.interactions.getArray=="function",48),o=s.interactions));let a;return s.overlays!==void 0?Array.isArray(s.overlays)?a=new ce(s.overlays.slice()):(Q(typeof s.overlays.getArray=="function",49),a=s.overlays):a=new ce,{controls:n,interactions:o,keyboardEventTarget:t,overlays:a,values:e}}var Qu=Sh;var po=class{constructor(t,e,i,n){this.minX=t,this.maxX=e,this.minY=i,this.maxY=n}contains(t){return this.containsXY(t[1],t[2])}containsTileRange(t){return this.minX<=t.minX&&t.maxX<=this.maxX&&this.minY<=t.minY&&t.maxY<=this.maxY}containsXY(t,e){return this.minX<=t&&t<=this.maxX&&this.minY<=e&&e<=this.maxY}equals(t){return this.minX==t.minX&&this.minY==t.minY&&this.maxX==t.maxX&&this.maxY==t.maxY}extend(t){t.minXthis.maxX&&(this.maxX=t.maxX),t.minYthis.maxY&&(this.maxY=t.maxY)}getHeight(){return this.maxY-this.minY+1}getSize(){return[this.getWidth(),this.getHeight()]}getWidth(){return this.maxX-this.minX+1}intersects(t){return this.minX<=t.maxX&&this.maxX>=t.minX&&this.minY<=t.maxY&&this.maxY>=t.minY}};function bn(s,t,e,i,n){return n!==void 0?(n.minX=s,n.maxX=t,n.minY=e,n.maxY=i,n):new po(s,t,e,i)}var _o=po;function Th(s,t,e,i){return i!==void 0?(i[0]=s,i[1]=t,i[2]=e,i):[s,t,e]}function Ln(s,t,e){return s+"/"+t+"/"+e}function yo(s){return Ln(s[0],s[1],s[2])}function td(s){return s.split("/").map(Number)}function xo(s){return(s[1]<e||e>t.getMaxZoom())return!1;let o=t.getFullTileRange(e);return o?o.containsXY(i,n):!0}var gs=[0,0,0],sn=5,Rh=class{constructor(t){this.minZoom=t.minZoom!==void 0?t.minZoom:0,this.resolutions_=t.resolutions,Q(ac(this.resolutions_,function(n,o){return o-n},!0),17);let e;if(!t.origins){for(let n=0,o=this.resolutions_.length-1;n=this.minZoom;){if(this.zoomFactor_===2?(a=Math.floor(a/2),l=Math.floor(l/2),o=bn(a,a,l,l,i)):o=this.getTileRangeForExtentAndZ(u,d,i),e(d,o))return!0;--d}return!1}getExtent(){return this.extent_}getMaxZoom(){return this.maxZoom}getMinZoom(){return this.minZoom}getOrigin(t){return this.origin_?this.origin_:this.origins_[t]}getResolution(t){return this.resolutions_[t]}getResolutions(){return this.resolutions_}getTileCoordChildTileRange(t,e,i){if(t[0]this.maxZoom||e=u){E=w,C=M,T=v;break}else if(C>=l)break;w=E,M=C,v=T,++x}let I=this.scaleBar_?this.createScaleBar(C,E,m):E.toFixed(T<0?-T:0)+" "+m;this.renderedHTML_!=I&&(this.innerElement_.innerHTML=I,this.renderedHTML_=I),this.renderedWidth_!=C&&(this.innerElement_.style.width=C+"px",this.renderedWidth_=C),this.renderedVisible_||(this.element.style.display="",this.renderedVisible_=!0)}createScaleBar(t,e,i){let n=this.getScaleForResolution(),o=n<1?Math.round(1/n).toLocaleString()+" : 1":"1 : "+Math.round(n).toLocaleString(),a=this.scaleBarSteps_,l=t/a,u=[this.createMarker("absolute")];for(let m=0;m
`+this.createMarker("relative")+(m%2===0||a===2?this.createStepText(m,t,!1,e,i):"")+"
")}return u.push(this.createStepText(a,t,!0,e,i)),(this.scaleBarText_?`
`+o+"
":"")+u.join("")}createMarker(t){return`
`}createStepText(t,e,i,n,o){let l=(t===0?0:Math.round(n/this.scaleBarSteps_*t*100)/100)+(t===0?"":" "+o),u=t===0?-3:e/this.scaleBarSteps_*-1,d=t===0?0:e/this.scaleBarSteps_*2;return`
`+l+"
"}getScaleForResolution(){let t=rs(this.viewState_.projection,this.viewState_.resolution,this.viewState_.center,"m"),e=this.dpi_||tr,i=1e3/25.4;return t*i*e}render(t){let e=t.frameState;e?this.viewState_=e.viewState:this.viewState_=null,this.updateElement_()}},kh=Fh;var er={VERTICAL:0,HORIZONTAL:1},Nh=class extends re{constructor(t){t=t||{},super({target:t.target,element:document.createElement("div"),render:t.render}),this.dragListenerKeys_=[],this.currentResolution_=void 0,this.direction_=er.VERTICAL,this.dragging_,this.heightLimit_=0,this.widthLimit_=0,this.startX_,this.startY_,this.thumbSize_=null,this.sliderInitialized_=!1,this.duration_=t.duration!==void 0?t.duration:200;let e=t.className!==void 0?t.className:"ol-zoomslider",i=document.createElement("button");i.setAttribute("type","button"),i.className=e+"-thumb "+fe;let n=this.element;n.className=e+" "+fe+" "+ni,n.appendChild(i),n.addEventListener(Ve.POINTERDOWN,this.handleDraggerStart_.bind(this),!1),n.addEventListener(Ve.POINTERMOVE,this.handleDraggerDrag_.bind(this),!1),n.addEventListener(Ve.POINTERUP,this.handleDraggerEnd_.bind(this),!1),n.addEventListener(H.CLICK,this.handleContainerClick_.bind(this),!1),i.addEventListener(H.CLICK,rc,!1)}setMap(t){super.setMap(t),t&&t.render()}initSlider_(){let t=this.element,e=t.offsetWidth,i=t.offsetHeight;if(e===0&&i===0)return this.sliderInitialized_=!1;let n=getComputedStyle(t);e-=parseFloat(n.paddingRight)+parseFloat(n.paddingLeft),i-=parseFloat(n.paddingTop)+parseFloat(n.paddingBottom);let o=t.firstElementChild,a=getComputedStyle(o),l=o.offsetWidth+parseFloat(a.marginRight)+parseFloat(a.marginLeft),u=o.offsetHeight+parseFloat(a.marginTop)+parseFloat(a.marginBottom);return this.thumbSize_=[l,u],e>i?(this.direction_=er.HORIZONTAL,this.widthLimit_=e-l):(this.direction_=er.VERTICAL,this.heightLimit_=i-u),this.sliderInitialized_=!0}handleContainerClick_(t){let e=this.getMap().getView(),i=this.getRelativePosition_(t.offsetX-this.thumbSize_[0]/2,t.offsetY-this.thumbSize_[1]/2),n=this.getResolutionForPosition_(i),o=e.getConstrainedZoom(e.getZoomForResolution(n));e.animateInternal({zoom:o,duration:this.duration_,easing:ye})}handleDraggerStart_(t){if(!this.dragging_&&t.target===this.element.firstElementChild){let e=this.element.firstElementChild;if(this.getMap().getView().beginInteraction(),this.startX_=t.clientX-parseFloat(e.style.left),this.startY_=t.clientY-parseFloat(e.style.top),this.dragging_=!0,this.dragListenerKeys_.length===0){let i=this.handleDraggerDrag_,n=this.handleDraggerEnd_,o=this.getMap().getOwnerDocument();this.dragListenerKeys_.push(st(o,Ve.POINTERMOVE,i,this),st(o,Ve.POINTERUP,n,this))}}}handleDraggerDrag_(t){if(this.dragging_){let e=t.clientX-this.startX_,i=t.clientY-this.startY_,n=this.getRelativePosition_(e,i);this.currentResolution_=this.getResolutionForPosition_(n),this.getMap().getView().setResolution(this.currentResolution_)}}handleDraggerEnd_(t){this.dragging_&&(this.getMap().getView().endInteraction(),this.dragging_=!1,this.startX_=void 0,this.startY_=void 0,this.dragListenerKeys_.forEach(ut),this.dragListenerKeys_.length=0)}setThumbPosition_(t){let e=this.getPositionForResolution_(t),i=this.element.firstElementChild;this.direction_==er.HORIZONTAL?i.style.left=this.widthLimit_*e+"px":i.style.top=this.heightLimit_*e+"px"}getRelativePosition_(t,e){let i;return this.direction_===er.HORIZONTAL?i=t/this.widthLimit_:i=e/this.heightLimit_,pt(i,0,1)}getResolutionForPosition_(t){return this.getMap().getView().getResolutionForValueFunction()(1-t)}getPositionForResolution_(t){let e=this.getMap().getView().getValueForResolutionFunction();return pt(1-e(t),0,1)}render(t){if(!t.frameState||!this.sliderInitialized_&&!this.initSlider_())return;let e=t.frameState.viewState.resolution;this.currentResolution_=e,this.setThumbPosition_(e)}},Dh=Nh;var Rt={IDLE:0,LOADING:1,LOADED:2,ERROR:3,EMPTY:4};var ir=class{constructor(t){this.opacity_=t.opacity,this.rotateWithView_=t.rotateWithView,this.rotation_=t.rotation,this.scale_=t.scale,this.scaleArray_=zt(t.scale),this.displacement_=t.displacement,this.declutterMode_=t.declutterMode}clone(){let t=this.getScale();return new ir({opacity:this.getOpacity(),scale:Array.isArray(t)?t.slice():t,rotation:this.getRotation(),rotateWithView:this.getRotateWithView(),displacement:this.getDisplacement().slice(),declutterMode:this.getDeclutterMode()})}getOpacity(){return this.opacity_}getRotateWithView(){return this.rotateWithView_}getRotation(){return this.rotation_}getScale(){return this.scale_}getScaleArray(){return this.scaleArray_}getDisplacement(){return this.displacement_}getDeclutterMode(){return this.declutterMode_}getAnchor(){return ft()}getImage(t){return ft()}getHitDetectionImage(){return ft()}getPixelRatio(t){return 1}getImageState(){return ft()}getImageSize(){return ft()}getOrigin(){return ft()}getSize(){return ft()}setDisplacement(t){this.displacement_=t}setOpacity(t){this.opacity_=t}setRotateWithView(t){this.rotateWithView_=t}setRotation(t){this.rotation_=t}setScale(t){this.scale_=t,this.scaleArray_=zt(t)}listenImageChange(t){ft()}load(){ft()}unlistenImageChange(t){ft()}},vo=ir;function Me(s){return Array.isArray(s)?aa(s):s}var nr=class extends vo{constructor(t){let e=t.rotateWithView!==void 0?t.rotateWithView:!1;super({opacity:1,rotateWithView:e,rotation:t.rotation!==void 0?t.rotation:0,scale:t.scale!==void 0?t.scale:1,displacement:t.displacement!==void 0?t.displacement:[0,0],declutterMode:t.declutterMode}),this.canvas_=void 0,this.hitDetectionCanvas_=null,this.fill_=t.fill!==void 0?t.fill:null,this.origin_=[0,0],this.points_=t.points,this.radius_=t.radius!==void 0?t.radius:t.radius1,this.radius2_=t.radius2,this.angle_=t.angle!==void 0?t.angle:0,this.stroke_=t.stroke!==void 0?t.stroke:null,this.size_=null,this.renderOptions_=null,this.render()}clone(){let t=this.getScale(),e=new nr({fill:this.getFill()?this.getFill().clone():void 0,points:this.getPoints(),radius:this.getRadius(),radius2:this.getRadius2(),angle:this.getAngle(),stroke:this.getStroke()?this.getStroke().clone():void 0,rotation:this.getRotation(),rotateWithView:this.getRotateWithView(),scale:Array.isArray(t)?t.slice():t,displacement:this.getDisplacement().slice(),declutterMode:this.getDeclutterMode()});return e.setOpacity(this.getOpacity()),e}getAnchor(){let t=this.size_;if(!t)return null;let e=this.getDisplacement(),i=this.getScaleArray();return[t[0]/2-e[0]/i[0],t[1]/2+e[1]/i[1]]}getAngle(){return this.angle_}getFill(){return this.fill_}setFill(t){this.fill_=t,this.render()}getHitDetectionImage(){return this.hitDetectionCanvas_||this.createHitDetectionCanvas_(this.renderOptions_),this.hitDetectionCanvas_}getImage(t){let e=this.canvas_[t];if(!e){let i=this.renderOptions_,n=bt(i.size*t,i.size*t);this.draw_(i,n,t),e=n.canvas,this.canvas_[t]=e}return e}getPixelRatio(t){return t}getImageSize(){return this.size_}getImageState(){return Rt.LOADED}getOrigin(){return this.origin_}getPoints(){return this.points_}getRadius(){return this.radius_}getRadius2(){return this.radius2_}getSize(){return this.size_}getStroke(){return this.stroke_}setStroke(t){this.stroke_=t,this.render()}listenImageChange(t){}load(){}unlistenImageChange(t){}calculateLineJoinSize_(t,e,i){if(e===0||this.points_===1/0||t!=="bevel"&&t!=="miter")return e;let n=this.radius_,o=this.radius2_===void 0?n:this.radius2_;if(n0,6),Q(!((t.width!==void 0||t.height!==void 0)&&t.scale!==void 0),69);let u=t.src!==void 0?Rt.IDLE:Rt.LOADED;if(this.color_=t.color!==void 0?pn(t.color):null,this.iconImage_=fd(a,l,this.imgSize_!==void 0?this.imgSize_:null,this.crossOrigin_,u,this.color_),this.offset_=t.offset!==void 0?t.offset:[0,0],this.offsetOrigin_=t.offsetOrigin!==void 0?t.offsetOrigin:"top-left",this.origin_=null,this.size_=t.size!==void 0?t.size:null,t.width!==void 0||t.height!==void 0){let d,m;if(t.size)[d,m]=t.size;else{let x=this.getImage(1);if(x instanceof HTMLCanvasElement||x.src&&x.complete)d=x.width,m=x.height;else{this.initialOptions_=t;let E=()=>{if(this.unlistenImageChange(E),!this.initialOptions_)return;let C=this.iconImage_.getSize();this.setScale(md(C[0],C[1],t.width,t.height))};this.listenImageChange(E);return}}d!==void 0&&this.setScale(md(d,m,t.width,t.height))}}clone(){let t,e,i;return this.initialOptions_?(e=this.initialOptions_.width,i=this.initialOptions_.height):(t=this.getScale(),t=Array.isArray(t)?t.slice():t),new hr({anchor:this.anchor_.slice(),anchorOrigin:this.anchorOrigin_,anchorXUnits:this.anchorXUnits_,anchorYUnits:this.anchorYUnits_,color:this.color_&&this.color_.slice?this.color_.slice():this.color_||void 0,crossOrigin:this.crossOrigin_,imgSize:this.imgSize_,offset:this.offset_.slice(),offsetOrigin:this.offsetOrigin_,opacity:this.getOpacity(),rotateWithView:this.getRotateWithView(),rotation:this.getRotation(),scale:t,width:e,height:i,size:this.size_!==null?this.size_.slice():void 0,src:this.getSrc(),displacement:this.getDisplacement().slice(),declutterMode:this.getDeclutterMode()})}getAnchor(){let t=this.normalizedAnchor_;if(!t){t=this.anchor_;let n=this.getSize();if(this.anchorXUnits_=="fraction"||this.anchorYUnits_=="fraction"){if(!n)return null;t=this.anchor_.slice(),this.anchorXUnits_=="fraction"&&(t[0]*=n[0]),this.anchorYUnits_=="fraction"&&(t[1]*=n[1])}if(this.anchorOrigin_!="top-left"){if(!n)return null;t===this.anchor_&&(t=this.anchor_.slice()),(this.anchorOrigin_=="top-right"||this.anchorOrigin_=="bottom-right")&&(t[0]=-t[0]+n[0]),(this.anchorOrigin_=="bottom-left"||this.anchorOrigin_=="bottom-right")&&(t[1]=-t[1]+n[1])}this.normalizedAnchor_=t}let e=this.getDisplacement(),i=this.getScaleArray();return[t[0]-e[0]/i[0],t[1]+e[1]/i[1]]}setAnchor(t){this.anchor_=t,this.normalizedAnchor_=null}getColor(){return this.color_}getImage(t){return this.iconImage_.getImage(t)}getPixelRatio(t){return this.iconImage_.getPixelRatio(t)}getImageSize(){return this.iconImage_.getSize()}getImageState(){return this.iconImage_.getImageState()}getHitDetectionImage(){return this.iconImage_.getHitDetectionImage()}getOrigin(){if(this.origin_)return this.origin_;let t=this.offset_;if(this.offsetOrigin_!="top-left"){let e=this.getSize(),i=this.iconImage_.getSize();if(!e||!i)return null;t=t.slice(),(this.offsetOrigin_=="top-right"||this.offsetOrigin_=="bottom-right")&&(t[0]=i[0]-e[0]-t[0]),(this.offsetOrigin_=="bottom-left"||this.offsetOrigin_=="bottom-right")&&(t[1]=i[1]-e[1]-t[1])}return this.origin_=t,this.origin_}getSrc(){return this.iconImage_.getSrc()}getSize(){return this.size_?this.size_:this.iconImage_.getSize()}getWidth(){let t=this.getScaleArray();if(this.size_)return this.size_[0]*t[0];if(this.iconImage_.getImageState()==Rt.LOADED)return this.iconImage_.getSize()[0]*t[0]}getHeight(){let t=this.getScaleArray();if(this.size_)return this.size_[1]*t[1];if(this.iconImage_.getImageState()==Rt.LOADED)return this.iconImage_.getSize()[1]*t[1]}setScale(t){delete this.initialOptions_,super.setScale(t)}listenImageChange(t){this.iconImage_.addEventListener(H.CHANGE,t)}load(){this.iconImage_.load()}unlistenImageChange(t){this.iconImage_.removeEventListener(H.CHANGE,t)}},Oi=hr;var gd=Ho(Wh(),1);var jh=class{constructor(t){this.rbush_=new gd.default(t),this.items_={}}insert(t,e){let i={minX:t[0],minY:t[1],maxX:t[2],maxY:t[3],value:e};this.rbush_.insert(i),this.items_[lt(e)]=i}load(t,e){let i=new Array(e.length);for(let n=0,o=e.length;n=200&&l.status<300){let d=t.getType(),m;d=="json"||d=="text"?m=l.responseText:d=="xml"?(m=l.responseXML,m||(m=new DOMParser().parseFromString(l.responseText,"application/xml"))):d=="arraybuffer"&&(m=l.response),m?o(t.readFeatures(m,{extent:e,featureProjection:n}),t.readProjection(m)):a()}else a()},l.onerror=a,l.send()}function Kh(s,t){return function(e,i,n,o,a){let l=this;dg(s,t,e,i,n,function(u,d){l.addFeatures(u),o!==void 0&&o(u)},a||We)}}var ci=class extends Jt{constructor(t,e,i){super(t),this.feature=e,this.features=i}},qh=class extends Io{constructor(t){t=t||{},super({attributions:t.attributions,interpolate:!0,projection:void 0,state:"ready",wrapX:t.wrapX!==void 0?t.wrapX:!0}),this.on,this.once,this.un,this.loader_=We,this.format_=t.format,this.overlaps_=t.overlaps===void 0?!0:t.overlaps,this.url_=t.url,t.loader!==void 0?this.loader_=t.loader:this.url_!==void 0&&(Q(this.format_,7),this.loader_=Kh(this.url_,this.format_)),this.strategy_=t.strategy!==void 0?t.strategy:_d;let e=t.useSpatialIndex!==void 0?t.useSpatialIndex:!0;this.featuresRtree_=e?new Xh:null,this.loadedExtentsRtree_=new Xh,this.loadingExtentsCount_=0,this.nullGeometryFeatures_={},this.idIndex_={},this.uidIndex_={},this.featureChangeKeys_={},this.featuresCollection_=null;let i,n;Array.isArray(t.features)?n=t.features:t.features&&(i=t.features,n=i.getArray()),!e&&i===void 0&&(i=new ce(n)),n!==void 0&&this.addFeaturesInternal(n),i!==void 0&&this.bindFeaturesCollection_(i)}addFeature(t){this.addFeatureInternal(t),this.changed()}addFeatureInternal(t){let e=lt(t);if(!this.addToIndex_(e,t)){this.featuresCollection_&&this.featuresCollection_.remove(t);return}this.setupChangeEvents_(e,t);let i=t.getGeometry();if(i){let n=i.getExtent();this.featuresRtree_&&this.featuresRtree_.insert(n,t)}else this.nullGeometryFeatures_[e]=t;this.dispatchEvent(new ci(ke.ADDFEATURE,t))}setupChangeEvents_(t,e){this.featureChangeKeys_[t]=[st(e,H.CHANGE,this.handleFeatureChange_,this),st(e,Ue.PROPERTYCHANGE,this.handleFeatureChange_,this)]}addToIndex_(t,e){let i=!0,n=e.getId();return n!==void 0&&(n.toString()in this.idIndex_?i=!1:this.idIndex_[n.toString()]=e),i&&(Q(!(t in this.uidIndex_),30),this.uidIndex_[t]=e),i}addFeatures(t){this.addFeaturesInternal(t),this.changed()}addFeaturesInternal(t){let e=[],i=[],n=[];for(let o=0,a=t.length;o{e||(e=!0,this.addFeature(i.element),e=!1)}),t.addEventListener($t.REMOVE,i=>{e||(e=!0,this.removeFeature(i.element),e=!1)}),this.featuresCollection_=t}clear(t){if(t){for(let i in this.featureChangeKeys_)this.featureChangeKeys_[i].forEach(ut);this.featuresCollection_||(this.featureChangeKeys_={},this.idIndex_={},this.uidIndex_={})}else if(this.featuresRtree_){let i=n=>{this.removeFeatureInternal(n)};this.featuresRtree_.forEach(i);for(let n in this.nullGeometryFeatures_)this.removeFeatureInternal(this.nullGeometryFeatures_[n])}this.featuresCollection_&&this.featuresCollection_.clear(),this.featuresRtree_&&this.featuresRtree_.clear(),this.nullGeometryFeatures_={};let e=new ci(ke.CLEAR);this.dispatchEvent(e),this.changed()}forEachFeature(t){if(this.featuresRtree_)return this.featuresRtree_.forEach(t);this.featuresCollection_&&this.featuresCollection_.forEach(t)}forEachFeatureAtCoordinateDirect(t,e){let i=[t[0],t[1],t[0],t[1]];return this.forEachFeatureInExtent(i,function(n){if(n.getGeometry().intersectsCoordinate(t))return e(n)})}forEachFeatureInExtent(t,e){if(this.featuresRtree_)return this.featuresRtree_.forEachInExtent(t,e);this.featuresCollection_&&this.featuresCollection_.forEach(e)}forEachFeatureIntersectingExtent(t,e){return this.forEachFeatureInExtent(t,function(i){if(i.getGeometry().intersectsExtent(t)){let o=e(i);if(o)return o}})}getFeaturesCollection(){return this.featuresCollection_}getFeatures(){let t;return this.featuresCollection_?t=this.featuresCollection_.getArray().slice(0):this.featuresRtree_&&(t=this.featuresRtree_.getAll(),vi(this.nullGeometryFeatures_)||Lr(t,Object.values(this.nullGeometryFeatures_))),t}getFeaturesAtCoordinate(t){let e=[];return this.forEachFeatureAtCoordinateDirect(t,function(i){e.push(i)}),e}getFeaturesInExtent(t,e){if(this.featuresRtree_){if(!(e&&e.canWrapX()&&this.getWrapX()))return this.featuresRtree_.getInExtent(t);let n=vc(t,e);return[].concat(...n.map(o=>this.featuresRtree_.getInExtent(o)))}return this.featuresCollection_?this.featuresCollection_.getArray().slice(0):[]}getClosestFeatureToCoordinate(t,e){let i=t[0],n=t[1],o=null,a=[NaN,NaN],l=1/0,u=[-1/0,-1/0,1/0,1/0];return e=e||Ei,this.featuresRtree_.forEachInExtent(u,function(d){if(e(d)){let m=d.getGeometry(),x=l;if(l=m.closestPointXY(i,n,a,l),l{--this.loadingExtentsCount_,this.dispatchEvent(new ci(ke.FEATURESLOADEND,void 0,m))},()=>{--this.loadingExtentsCount_,this.dispatchEvent(new ci(ke.FEATURESLOADERROR))}),n.insert(u,{extent:u.slice()}))}this.loading=this.loader_.length<4?!1:this.loadingExtentsCount_>0}refresh(){this.clear(!0),this.loadedExtentsRtree_.clear(),super.refresh()}removeLoadedExtent(t){let e=this.loadedExtentsRtree_,i;e.forEachInExtent(t,function(n){if(Si(n.extent,t))return i=n,!0}),i&&e.remove(i)}removeFeature(t){if(!t)return;let e=lt(t);e in this.nullGeometryFeatures_?delete this.nullGeometryFeatures_[e]:this.featuresRtree_&&this.featuresRtree_.remove(t),this.removeFeatureInternal(t)&&this.changed()}removeFeatureInternal(t){let e=lt(t),i=this.featureChangeKeys_[e];if(!i)return;i.forEach(ut),delete this.featureChangeKeys_[e];let n=t.getId();return n!==void 0&&delete this.idIndex_[n.toString()],delete this.uidIndex_[e],this.dispatchEvent(new ci(ke.REMOVEFEATURE,t)),t}removeFromIdIndex_(t){let e=!1;for(let i in this.idIndex_)if(this.idIndex_[i]===t){delete this.idIndex_[i],e=!0;break}return e}setLoader(t){this.loader_=t}setUrl(t){Q(this.format_,7),this.url_=t,this.setLoader(Kh(t,this.format_))}},wo=qh;var Ed=Ho(Wh(),1);var fg="#333",lr=class{constructor(t){t=t||{},this.font_=t.font,this.rotation_=t.rotation,this.rotateWithView_=t.rotateWithView,this.scale_=t.scale,this.scaleArray_=zt(t.scale!==void 0?t.scale:1),this.text_=t.text,this.textAlign_=t.textAlign,this.justify_=t.justify,this.repeat_=t.repeat,this.textBaseline_=t.textBaseline,this.fill_=t.fill!==void 0?t.fill:new ps({color:fg}),this.maxAngle_=t.maxAngle!==void 0?t.maxAngle:Math.PI/4,this.placement_=t.placement!==void 0?t.placement:"point",this.overflow_=!!t.overflow,this.stroke_=t.stroke!==void 0?t.stroke:null,this.offsetX_=t.offsetX!==void 0?t.offsetX:0,this.offsetY_=t.offsetY!==void 0?t.offsetY:0,this.backgroundFill_=t.backgroundFill?t.backgroundFill:null,this.backgroundStroke_=t.backgroundStroke?t.backgroundStroke:null,this.padding_=t.padding===void 0?null:t.padding}clone(){let t=this.getScale();return new lr({font:this.getFont(),placement:this.getPlacement(),repeat:this.getRepeat(),maxAngle:this.getMaxAngle(),overflow:this.getOverflow(),rotation:this.getRotation(),rotateWithView:this.getRotateWithView(),scale:Array.isArray(t)?t.slice():t,text:this.getText(),textAlign:this.getTextAlign(),justify:this.getJustify(),textBaseline:this.getTextBaseline(),fill:this.getFill()?this.getFill().clone():void 0,stroke:this.getStroke()?this.getStroke().clone():void 0,offsetX:this.getOffsetX(),offsetY:this.getOffsetY(),backgroundFill:this.getBackgroundFill()?this.getBackgroundFill().clone():void 0,backgroundStroke:this.getBackgroundStroke()?this.getBackgroundStroke().clone():void 0,padding:this.getPadding()||void 0})}getOverflow(){return this.overflow_}getFont(){return this.font_}getMaxAngle(){return this.maxAngle_}getPlacement(){return this.placement_}getRepeat(){return this.repeat_}getOffsetX(){return this.offsetX_}getOffsetY(){return this.offsetY_}getFill(){return this.fill_}getRotateWithView(){return this.rotateWithView_}getRotation(){return this.rotation_}getScale(){return this.scale_}getScaleArray(){return this.scaleArray_}getStroke(){return this.stroke_}getText(){return this.text_}getTextAlign(){return this.textAlign_}getJustify(){return this.justify_}getTextBaseline(){return this.textBaseline_}getBackgroundFill(){return this.backgroundFill_}getBackgroundStroke(){return this.backgroundStroke_}getPadding(){return this.padding_}setOverflow(t){this.overflow_=t}setFont(t){this.font_=t}setMaxAngle(t){this.maxAngle_=t}setOffsetX(t){this.offsetX_=t}setOffsetY(t){this.offsetY_=t}setPlacement(t){this.placement_=t}setRepeat(t){this.repeat_=t}setRotateWithView(t){this.rotateWithView_=t}setFill(t){this.fill_=t}setRotation(t){this.rotation_=t}setScale(t){this.scale_=t,this.scaleArray_=zt(t!==void 0?t:1)}setStroke(t){this.stroke_=t}setText(t){this.text_=t}setTextAlign(t){this.textAlign_=t}setJustify(t){this.justify_=t}setTextBaseline(t){this.textBaseline_=t}setBackgroundFill(t){this.backgroundFill_=t}setBackgroundStroke(t){this.backgroundStroke_=t}setPadding(t){this.padding_=t}},yd=lr;function Vh(s){return new Pi({fill:cr(s,""),stroke:ur(s,""),text:mg(s),image:gg(s)})}function cr(s,t){let e=s[t+"fill-color"];if(!!e)return e==="none"?null:new ps({color:e})}function ur(s,t){let e=s[t+"stroke-width"],i=s[t+"stroke-color"];if(!(!e&&!i))return new To({width:e,color:i,lineCap:s[t+"stroke-line-cap"],lineJoin:s[t+"stroke-line-join"],lineDash:s[t+"stroke-line-dash"],lineDashOffset:s[t+"stroke-line-dash-offset"],miterLimit:s[t+"stroke-miter-limit"]})}function mg(s){let t=s["text-value"];return t?new yd({text:t,font:s["text-font"],maxAngle:s["text-max-angle"],offsetX:s["text-offset-x"],offsetY:s["text-offset-y"],overflow:s["text-overflow"],placement:s["text-placement"],repeat:s["text-repeat"],scale:s["text-scale"],rotateWithView:s["text-rotate-with-view"],rotation:s["text-rotation"],textAlign:s["text-align"],justify:s["text-justify"],textBaseline:s["text-baseline"],padding:s["text-padding"],fill:cr(s,"text-"),backgroundFill:cr(s,"text-background-"),stroke:ur(s,"text-"),backgroundStroke:ur(s,"text-background-")}):void 0}function gg(s){let t=s["icon-src"],e=s["icon-img"];if(t||e)return new Oi({src:t,img:e,imgSize:s["icon-img-size"],anchor:s["icon-anchor"],anchorOrigin:s["icon-anchor-origin"],anchorXUnits:s["icon-anchor-x-units"],anchorYUnits:s["icon-anchor-y-units"],color:s["icon-color"],crossOrigin:s["icon-cross-origin"],offset:s["icon-offset"],displacement:s["icon-displacement"],opacity:s["icon-opacity"],scale:s["icon-scale"],width:s["icon-width"],height:s["icon-height"],rotation:s["icon-rotation"],rotateWithView:s["icon-rotate-with-view"],size:s["icon-size"],declutterMode:s["icon-declutter-mode"]});let i=s["shape-points"];if(i){let o="shape-";return new Co({points:i,fill:cr(s,o),stroke:ur(s,o),radius:s["shape-radius"],radius1:s["shape-radius1"],radius2:s["shape-radius2"],angle:s["shape-angle"],displacement:s["shape-displacement"],rotation:s["shape-rotation"],rotateWithView:s["shape-rotate-with-view"],scale:s["shape-scale"],declutterMode:s["shape-declutter-mode"]})}let n=s["circle-radius"];if(n){let o="circle-";return new So({radius:n,fill:cr(s,o),stroke:ur(s,o),displacement:s["circle-displacement"],scale:s["circle-scale"],rotation:s["circle-rotation"],rotateWithView:s["circle-rotate-with-view"],declutterMode:s["circle-declutter-mode"]})}}var xd={RENDER_ORDER:"renderOrder"},Hh=class extends Sn{constructor(t){t=t||{};let e=Object.assign({},t);delete e.style,delete e.renderBuffer,delete e.updateWhileAnimating,delete e.updateWhileInteracting,super(e),this.declutter_=t.declutter!==void 0?t.declutter:!1,this.renderBuffer_=t.renderBuffer!==void 0?t.renderBuffer:100,this.style_=null,this.styleFunction_=void 0,this.setStyle(t.style),this.updateWhileAnimating_=t.updateWhileAnimating!==void 0?t.updateWhileAnimating:!1,this.updateWhileInteracting_=t.updateWhileInteracting!==void 0?t.updateWhileInteracting:!1}getDeclutter(){return this.declutter_}getFeatures(t){return super.getFeatures(t)}getRenderBuffer(){return this.renderBuffer_}getRenderOrder(){return this.get(xd.RENDER_ORDER)}getStyle(){return this.style_}getStyleFunction(){return this.styleFunction_}getUpdateWhileAnimating(){return this.updateWhileAnimating_}getUpdateWhileInteracting(){return this.updateWhileInteracting_}renderDeclutter(t){t.declutterTree||(t.declutterTree=new Ed.default(9)),this.getRenderer().renderDeclutter(t)}setRenderOrder(t){this.set(xd.RENDER_ORDER,t)}setStyle(t){let e;if(t===void 0)e=dd;else if(t===null)e=null;else if(typeof t=="function")e=t;else if(t instanceof Pi)e=t;else if(Array.isArray(t)){let i=t.length,n=new Array(i);for(let o=0;ol&&(this.instructions.push([et.CUSTOM,l,d,t,i,$i]),this.hitDetectionInstructions.push([et.CUSTOM,l,d,t,n||i,$i]));break;case"Point":u=t.getFlatCoordinates(),this.coordinates.push(u[0],u[1]),d=this.coordinates.length,this.instructions.push([et.CUSTOM,l,d,t,i]),this.hitDetectionInstructions.push([et.CUSTOM,l,d,t,n||i]);break;default:}this.endGeometry(e)}beginGeometry(t,e){this.beginGeometryInstruction1_=[et.BEGIN_GEOMETRY,e,0,t],this.instructions.push(this.beginGeometryInstruction1_),this.beginGeometryInstruction2_=[et.BEGIN_GEOMETRY,e,0,t],this.hitDetectionInstructions.push(this.beginGeometryInstruction2_)}finish(){return{instructions:this.instructions,hitDetectionInstructions:this.hitDetectionInstructions,coordinates:this.coordinates}}reverseHitDetectionInstructions(){let t=this.hitDetectionInstructions;t.reverse();let e,i=t.length,n,o,a=-1;for(e=0;ethis.maxLineWidth&&(this.maxLineWidth=i.lineWidth,this.bufferedMaxExtent_=null)}else i.strokeStyle=void 0,i.lineCap=void 0,i.lineDash=null,i.lineDashOffset=void 0,i.lineJoin=void 0,i.lineWidth=void 0,i.miterLimit=void 0}createFill(t){let e=t.fillStyle,i=[et.SET_FILL_STYLE,e];return typeof e!="string"&&i.push(!0),i}applyStroke(t){this.instructions.push(this.createStroke(t))}createStroke(t){return[et.SET_STROKE_STYLE,t.strokeStyle,t.lineWidth*this.pixelRatio,t.lineCap,t.lineJoin,t.miterLimit,this.applyPixelRatio(t.lineDash),t.lineDashOffset*this.pixelRatio]}updateFillStyle(t,e){let i=t.fillStyle;(typeof i!="string"||t.currentFillStyle!=i)&&(i!==void 0&&this.instructions.push(e.call(this,t)),t.currentFillStyle=i)}updateStrokeStyle(t,e){let i=t.strokeStyle,n=t.lineCap,o=t.lineDash,a=t.lineDashOffset,l=t.lineJoin,u=t.lineWidth,d=t.miterLimit;(t.currentStrokeStyle!=i||t.currentLineCap!=n||o!=t.currentLineDash&&!ie(t.currentLineDash,o)||t.currentLineDashOffset!=a||t.currentLineJoin!=l||t.currentLineWidth!=u||t.currentMiterLimit!=d)&&(i!==void 0&&e.call(this,t),t.currentStrokeStyle=i,t.currentLineCap=n,t.currentLineDash=o,t.currentLineDashOffset=a,t.currentLineJoin=l,t.currentLineWidth=u,t.currentMiterLimit=d)}endGeometry(t){this.beginGeometryInstruction1_[2]=this.instructions.length,this.beginGeometryInstruction1_=null,this.beginGeometryInstruction2_[2]=this.hitDetectionInstructions.length,this.beginGeometryInstruction2_=null;let e=[et.END_GEOMETRY,t];this.instructions.push(e),this.hitDetectionInstructions.push(e)}getBufferedMaxExtent(){if(!this.bufferedMaxExtent_&&(this.bufferedMaxExtent_=Gr(this.maxExtent),this.maxLineWidth>0)){let t=this.resolution*(this.maxLineWidth+1)/2;Ci(this.bufferedMaxExtent_,t,this.bufferedMaxExtent_)}return this.bufferedMaxExtent_}},di=$h;var Qh=class extends di{constructor(t,e,i,n){super(t,e,i,n),this.hitDetectionImage_=null,this.image_=null,this.imagePixelRatio_=void 0,this.anchorX_=void 0,this.anchorY_=void 0,this.height_=void 0,this.opacity_=void 0,this.originX_=void 0,this.originY_=void 0,this.rotateWithView_=void 0,this.rotation_=void 0,this.scale_=void 0,this.width_=void 0,this.declutterMode_=void 0,this.declutterImageWithText_=void 0}drawPoint(t,e){if(!this.image_)return;this.beginGeometry(t,e);let i=t.getFlatCoordinates(),n=t.getStride(),o=this.coordinates.length,a=this.appendFlatPointCoordinates(i,n);this.instructions.push([et.DRAW_IMAGE,o,a,this.image_,this.anchorX_*this.imagePixelRatio_,this.anchorY_*this.imagePixelRatio_,Math.ceil(this.height_*this.imagePixelRatio_),this.opacity_,this.originX_*this.imagePixelRatio_,this.originY_*this.imagePixelRatio_,this.rotateWithView_,this.rotation_,[this.scale_[0]*this.pixelRatio/this.imagePixelRatio_,this.scale_[1]*this.pixelRatio/this.imagePixelRatio_],Math.ceil(this.width_*this.imagePixelRatio_),this.declutterMode_,this.declutterImageWithText_]),this.hitDetectionInstructions.push([et.DRAW_IMAGE,o,a,this.hitDetectionImage_,this.anchorX_,this.anchorY_,this.height_,1,this.originX_,this.originY_,this.rotateWithView_,this.rotation_,this.scale_,this.width_,this.declutterMode_,this.declutterImageWithText_]),this.endGeometry(e)}drawMultiPoint(t,e){if(!this.image_)return;this.beginGeometry(t,e);let i=t.getFlatCoordinates(),n=t.getStride(),o=this.coordinates.length,a=this.appendFlatPointCoordinates(i,n);this.instructions.push([et.DRAW_IMAGE,o,a,this.image_,this.anchorX_*this.imagePixelRatio_,this.anchorY_*this.imagePixelRatio_,Math.ceil(this.height_*this.imagePixelRatio_),this.opacity_,this.originX_*this.imagePixelRatio_,this.originY_*this.imagePixelRatio_,this.rotateWithView_,this.rotation_,[this.scale_[0]*this.pixelRatio/this.imagePixelRatio_,this.scale_[1]*this.pixelRatio/this.imagePixelRatio_],Math.ceil(this.width_*this.imagePixelRatio_),this.declutterMode_,this.declutterImageWithText_]),this.hitDetectionInstructions.push([et.DRAW_IMAGE,o,a,this.hitDetectionImage_,this.anchorX_,this.anchorY_,this.height_,1,this.originX_,this.originY_,this.rotateWithView_,this.rotation_,this.scale_,this.width_,this.declutterMode_,this.declutterImageWithText_]),this.endGeometry(e)}finish(){return this.reverseHitDetectionInstructions(),this.anchorX_=void 0,this.anchorY_=void 0,this.hitDetectionImage_=null,this.image_=null,this.imagePixelRatio_=void 0,this.height_=void 0,this.scale_=void 0,this.opacity_=void 0,this.originX_=void 0,this.originY_=void 0,this.rotateWithView_=void 0,this.rotation_=void 0,this.width_=void 0,super.finish()}setImageStyle(t,e){let i=t.getAnchor(),n=t.getSize(),o=t.getOrigin();this.imagePixelRatio_=t.getPixelRatio(this.pixelRatio),this.anchorX_=i[0],this.anchorY_=i[1],this.hitDetectionImage_=t.getHitDetectionImage(),this.image_=t.getImage(this.pixelRatio),this.height_=n[1],this.opacity_=t.getOpacity(),this.originX_=o[0],this.originY_=o[1],this.rotateWithView_=t.getRotateWithView(),this.rotation_=t.getRotation(),this.scale_=t.getScaleArray(),this.width_=n[0],this.declutterMode_=t.getDeclutterMode(),this.declutterImageWithText_=e}},vd=Qh;var tl=class extends di{constructor(t,e,i,n){super(t,e,i,n)}drawFlatCoordinates_(t,e,i,n){let o=this.coordinates.length,a=this.appendFlatLineCoordinates(t,e,i,n,!1,!1),l=[et.MOVE_TO_LINE_TO,o,a];return this.instructions.push(l),this.hitDetectionInstructions.push(l),i}drawLineString(t,e){let i=this.state,n=i.strokeStyle,o=i.lineWidth;if(n===void 0||o===void 0)return;this.updateStrokeStyle(i,this.applyStroke),this.beginGeometry(t,e),this.hitDetectionInstructions.push([et.SET_STROKE_STYLE,i.strokeStyle,i.lineWidth,i.lineCap,i.lineJoin,i.miterLimit,xe,Ee],Fi);let a=t.getFlatCoordinates(),l=t.getStride();this.drawFlatCoordinates_(a,0,a.length,l),this.hitDetectionInstructions.push(ui),this.endGeometry(e)}drawMultiLineString(t,e){let i=this.state,n=i.strokeStyle,o=i.lineWidth;if(n===void 0||o===void 0)return;this.updateStrokeStyle(i,this.applyStroke),this.beginGeometry(t,e),this.hitDetectionInstructions.push([et.SET_STROKE_STYLE,i.strokeStyle,i.lineWidth,i.lineCap,i.lineJoin,i.miterLimit,xe,Ee],Fi);let a=t.getEnds(),l=t.getFlatCoordinates(),u=t.getStride(),d=0;for(let m=0,x=a.length;m=s){let T=(s-l+C)/C,w=_e(d,x,T),M=_e(m,E,T);u.push(w,M),o.push(u),u=[w,M],l==s&&(a+=n),l=0}else if(l0&&o.push(u),o}function Td(s,t,e,i,n){let o=e,a=e,l=0,u=0,d=e,m,x,E,C,T,w,M,v,I,L;for(x=e;xs&&(u>l&&(l=u,o=d,a=x),u=0,d=x-n)),E=C,M=I,v=L),T=b,w=P}return u+=C,u>l?[d,x]:[o,a]}var mr={left:0,center:.5,right:1,top:0,middle:.5,hanging:.2,alphabetic:.8,ideographic:.8,bottom:1},nl=class extends di{constructor(t,e,i,n){super(t,e,i,n),this.labels_=null,this.text_="",this.textOffsetX_=0,this.textOffsetY_=0,this.textRotateWithView_=void 0,this.textRotation_=0,this.textFillState_=null,this.fillStates={},this.fillStates[Kt]={fillStyle:Kt},this.textStrokeState_=null,this.strokeStates={},this.textState_={},this.textStates={},this.textKey_="",this.fillKey_="",this.strokeKey_="",this.declutterImageWithText_=void 0}finish(){let t=super.finish();return t.textStates=this.textStates,t.fillStates=this.fillStates,t.strokeStates=this.strokeStates,t}drawText(t,e){let i=this.textFillState_,n=this.textStrokeState_,o=this.textState_;if(this.text_===""||!o||!i&&!n)return;let a=this.coordinates,l=a.length,u=t.getType(),d=null,m=t.getStride();if(o.placement==="line"&&(u=="LineString"||u=="MultiLineString"||u=="Polygon"||u=="MultiPolygon")){if(!Ft(this.getBufferedMaxExtent(),t.getExtent()))return;let x;if(d=t.getFlatCoordinates(),u=="LineString")x=[d.length];else if(u=="MultiLineString")x=t.getEnds();else if(u=="Polygon")x=t.getEnds().slice(0,1);else if(u=="MultiPolygon"){let w=t.getEndss();x=[];for(let M=0,v=w.length;M{let b=a[(v+L)*2]===d[L*m]&&a[(v+L)*2+1]===d[L*m+1];return b||--v,b})}this.saveTextStates_(),(o.backgroundFill||o.backgroundStroke)&&(this.setFillStrokeStyle(o.backgroundFill,o.backgroundStroke),o.backgroundFill&&this.updateFillStyle(this.state,this.createFill),o.backgroundStroke&&(this.updateStrokeStyle(this.state,this.applyStroke),this.hitDetectionInstructions.push(this.createStroke(this.state)))),this.beginGeometry(t,e);let C=o.padding;if(C!=Li&&(o.scale[0]<0||o.scale[1]<0)){let v=o.padding[0],I=o.padding[1],L=o.padding[2],b=o.padding[3];o.scale[0]<0&&(I=-I,b=-b),o.scale[1]<0&&(v=-v,L=-L),C=[v,I,L,b]}let T=this.pixelRatio;this.instructions.push([et.DRAW_IMAGE,l,E,null,NaN,NaN,NaN,1,0,0,this.textRotateWithView_,this.textRotation_,[1,1],NaN,void 0,this.declutterImageWithText_,C==Li?Li:C.map(function(v){return v*T}),!!o.backgroundFill,!!o.backgroundStroke,this.text_,this.textKey_,this.strokeKey_,this.fillKey_,this.textOffsetX_,this.textOffsetY_,x]);let w=1/T,M=this.state.fillStyle;o.backgroundFill&&(this.state.fillStyle=Kt,this.hitDetectionInstructions.push(this.createFill(this.state))),this.hitDetectionInstructions.push([et.DRAW_IMAGE,l,E,null,NaN,NaN,NaN,1,0,0,this.textRotateWithView_,this.textRotation_,[w,w],NaN,void 0,this.declutterImageWithText_,C,!!o.backgroundFill,!!o.backgroundStroke,this.text_,this.textKey_,this.strokeKey_,this.fillKey_?Kt:this.fillKey_,this.textOffsetX_,this.textOffsetY_,x]),o.backgroundFill&&(this.state.fillStyle=M,this.hitDetectionInstructions.push(this.createFill(this.state))),this.endGeometry(e)}}saveTextStates_(){let t=this.textStrokeState_,e=this.textState_,i=this.textFillState_,n=this.strokeKey_;t&&(n in this.strokeStates||(this.strokeStates[n]={strokeStyle:t.strokeStyle,lineCap:t.lineCap,lineDashOffset:t.lineDashOffset,lineWidth:t.lineWidth,lineJoin:t.lineJoin,miterLimit:t.miterLimit,lineDash:t.lineDash}));let o=this.textKey_;o in this.textStates||(this.textStates[o]={font:e.font,textAlign:e.textAlign||tn,justify:e.justify,textBaseline:e.textBaseline||wn,scale:e.scale});let a=this.fillKey_;i&&(a in this.fillStates||(this.fillStates[a]={fillStyle:i.fillStyle}))}drawChars_(t,e){let i=this.textStrokeState_,n=this.textState_,o=this.strokeKey_,a=this.textKey_,l=this.fillKey_;this.saveTextStates_();let u=this.pixelRatio,d=mr[n.textBaseline],m=this.textOffsetY_*u,x=this.text_,E=i?i.lineWidth*Math.abs(n.scale[0])/2:0;this.instructions.push([et.DRAW_CHARS,t,e,d,n.overflow,l,n.maxAngle,u,m,o,E*u,x,a,1]),this.hitDetectionInstructions.push([et.DRAW_CHARS,t,e,d,n.overflow,l&&Kt,n.maxAngle,1,m,o,E,x,a,1/u])}setTextStyle(t,e){let i,n,o;if(!t)this.text_="";else{let a=t.getFill();a?(n=this.textFillState_,n||(n={},this.textFillState_=n),n.fillStyle=Me(a.getColor()||Kt)):(n=null,this.textFillState_=n);let l=t.getStroke();if(!l)o=null,this.textStrokeState_=o;else{o=this.textStrokeState_,o||(o={},this.textStrokeState_=o);let T=l.getLineDash(),w=l.getLineDashOffset(),M=l.getWidth(),v=l.getMiterLimit();o.lineCap=l.getLineCap()||In,o.lineDash=T?T.slice():xe,o.lineDashOffset=w===void 0?Ee:w,o.lineJoin=l.getLineJoin()||ri,o.lineWidth=M===void 0?Ai:M,o.miterLimit=v===void 0?wi:v,o.strokeStyle=Me(l.getColor()||bi)}i=this.textState_;let u=t.getFont()||oo;vu(u);let d=t.getScaleArray();i.overflow=t.getOverflow(),i.font=u,i.maxAngle=t.getMaxAngle(),i.placement=t.getPlacement(),i.textAlign=t.getTextAlign(),i.repeat=t.getRepeat(),i.justify=t.getJustify(),i.textBaseline=t.getTextBaseline()||wn,i.backgroundFill=t.getBackgroundFill(),i.backgroundStroke=t.getBackgroundStroke(),i.padding=t.getPadding()||Li,i.scale=d===void 0?[1,1]:d;let m=t.getOffsetX(),x=t.getOffsetY(),E=t.getRotateWithView(),C=t.getRotation();this.text_=t.getText()||"",this.textOffsetX_=m===void 0?0:m,this.textOffsetY_=x===void 0?0:x,this.textRotateWithView_=E===void 0?!1:E,this.textRotation_=C===void 0?0:C,this.strokeKey_=o?(typeof o.strokeStyle=="string"?o.strokeStyle:lt(o.strokeStyle))+o.lineCap+o.lineDashOffset+"|"+o.lineWidth+o.lineJoin+o.miterLimit+"["+o.lineDash.join()+"]":"",this.textKey_=i.font+i.scale+(i.textAlign||"?")+(i.repeat||"?")+(i.justify||"?")+(i.textBaseline||"?"),this.fillKey_=n?typeof n.fillStyle=="string"?n.fillStyle:"|"+lt(n.fillStyle):""}this.declutterImageWithText_=e}},Rd=nl;var pg={Circle:il,Default:di,Image:vd,LineString:Cd,Polygon:il,Text:Rd},sl=class{constructor(t,e,i,n){this.tolerance_=t,this.maxExtent_=e,this.pixelRatio_=n,this.resolution_=i,this.buildersByZIndex_={}}finish(){let t={};for(let e in this.buildersByZIndex_){t[e]=t[e]||{};let i=this.buildersByZIndex_[e];for(let n in i){let o=i[n].finish();t[e][n]=o}}return t}getBuilder(t,e){let i=t!==void 0?t.toString():"0",n=this.buildersByZIndex_[i];n===void 0&&(n={},this.buildersByZIndex_[i]=n);let o=n[e];if(o===void 0){let a=pg[e];o=new a(this.tolerance_,this.maxExtent_,this.resolution_,this.pixelRatio_),n[e]=o}return o}},rl=sl;var ol=class extends Ar{constructor(t){super(),this.ready=!0,this.boundHandleImageChange_=this.handleImageChange_.bind(this),this.layer_=t,this.declutterExecutorGroup=null}getFeatures(t){return ft()}getData(t){return null}prepareFrame(t){return ft()}renderFrame(t,e){return ft()}loadedTileCallback(t,e,i){t[e]||(t[e]={}),t[e][i.tileCoord.toString()]=i}createLoadedTileFinder(t,e,i){return(n,o)=>{let a=this.loadedTileCallback.bind(this,i,n);return t.forEachLoadedTile(e,n,o,a)}}forEachFeatureAtCoordinate(t,e,i,n,o){}getLayer(){return this.layer_}handleFontsChanged(){}handleImageChange_(t){let e=t.target;(e.getState()===Rt.LOADED||e.getState()===Rt.ERROR)&&this.renderIfReadyAndVisible()}loadImage(t){let e=t.getState();return e!=Rt.LOADED&&e!=Rt.ERROR&&t.addEventListener(H.CHANGE,this.boundHandleImageChange_),e==Rt.IDLE&&(t.load(),e=t.getState()),e==Rt.LOADED}renderIfReadyAndVisible(){let t=this.getLayer();t&&t.getVisible()&&t.getSourceState()==="ready"&&t.changed()}disposeInternal(){delete this.layer_,super.disposeInternal()}},Id=ol;var hl=[],ys=null;function _g(){ys=bt(1,1,void 0,{willReadFrequently:!0})}var al=class extends Id{constructor(t){super(t),this.container=null,this.renderedResolution,this.tempTransform=ne(),this.pixelTransform=ne(),this.inversePixelTransform=ne(),this.context=null,this.containerReused=!1,this.pixelContext_=null,this.frameState=null}getImageData(t,e,i){ys||_g(),ys.clearRect(0,0,1,1);let n;try{ys.drawImage(t,e,i,1,1,0,0,1,1),n=ys.getImageData(0,0,1,1).data}catch{return ys=null,null}return n}getBackground(t){let i=this.getLayer().getBackground();return typeof i=="function"&&(i=i(t.viewState.resolution)),i||void 0}useContainer(t,e,i){let n=this.getLayer().getClassName(),o,a;if(t&&t.className===n&&(!i||t&&t.style.backgroundColor&&ie(pn(t.style.backgroundColor),pn(i)))){let l=t.firstElementChild;l instanceof HTMLCanvasElement&&(a=l.getContext("2d"))}if(a&&a.canvas.style.transform===e?(this.container=t,this.context=a,this.containerReused=!0):this.containerReused?(this.container=null,this.context=null,this.containerReused=!1):this.container&&(this.container.style.backgroundColor=null),!this.container){o=document.createElement("div"),o.className=n;let l=o.style;l.position="absolute",l.width="100%",l.height="100%",a=bt();let u=a.canvas;o.appendChild(u),l=u.style,l.position="absolute",l.left="0",l.transformOrigin="top left",this.container=o,this.context=a}!this.containerReused&&i&&!this.container.style.backgroundColor&&(this.container.style.backgroundColor=i)}clipUnrotated(t,e,i){let n=Le(i),o=$n(i),a=Jn(i),l=Zn(i);Pt(e.coordinateToPixelTransform,n),Pt(e.coordinateToPixelTransform,o),Pt(e.coordinateToPixelTransform,a),Pt(e.coordinateToPixelTransform,l);let u=this.inversePixelTransform;Pt(u,n),Pt(u,o),Pt(u,a),Pt(u,l),t.save(),t.beginPath(),t.moveTo(Math.round(n[0]),Math.round(n[1])),t.lineTo(Math.round(o[0]),Math.round(o[1])),t.lineTo(Math.round(a[0]),Math.round(a[1])),t.lineTo(Math.round(l[0]),Math.round(l[1])),t.clip()}dispatchRenderEvent_(t,e,i){let n=this.getLayer();if(n.hasListener(t)){let o=new no(t,this.inversePixelTransform,i,e);n.dispatchEvent(o)}}preRender(t,e){this.frameState=e,this.dispatchRenderEvent_(de.PRERENDER,t,e)}postRender(t,e){this.dispatchRenderEvent_(de.POSTRENDER,t,e)}getRenderTransform(t,e,i,n,o,a,l){let u=o/2,d=a/2,m=n/e,x=-m,E=-t[0]+l,C=-t[1];return ue(this.tempTransform,u,d,m,x,-i,E,C)}disposeInternal(){delete this.frameState,super.disposeInternal()}},Lo=al;function wd(s,t,e,i,n,o,a,l,u,d,m,x){let E=s[t],C=s[t+1],T=0,w=0,M=0,v=0;function I(){T=E,w=C,t+=i,E=s[t],C=s[t+1],v+=M,M=Math.sqrt((E-T)*(E-T)+(C-w)*(C-w))}do I();while(tq[2]}else Z=b>W;let it=Math.PI,rt=[],Ct=F+i===t;t=F,M=0,v=N,E=s[t],C=s[t+1];let tt;if(Ct){I(),tt=Math.atan2(C-w,E-T),Z&&(tt+=tt>0?-it:it);let q=(W+b)/2,K=(Y+P)/2;return rt[0]=[q,K,(G-o)/2,tt,n],rt}n=n.replace(/\n/g," ");for(let q=0,K=n.length;q0?-it:it),tt!==void 0){let _t=V-tt;if(_t+=_t>it?-2*it:_t<-it?2*it:0,Math.abs(_t)>a)return null}tt=V;let dt=q,ht=0;for(;q0&&s.push(` -`,""),s.push(t,""),s}var cl=class{constructor(t,e,i,n){this.overlaps=i,this.pixelRatio=e,this.resolution=t,this.alignFill_,this.instructions=n.instructions,this.coordinates=n.coordinates,this.coordinateCache_={},this.renderedTransform_=ne(),this.hitDetectionInstructions=n.hitDetectionInstructions,this.pixelCoordinates_=null,this.viewRotation_=0,this.fillStates=n.fillStates||{},this.strokeStates=n.strokeStates||{},this.textStates=n.textStates||{},this.widths_={},this.labels_={}}createLabel(t,e,i,n){let o=t+e+i+n;if(this.labels_[o])return this.labels_[o];let a=n?this.strokeStates[n]:null,l=i?this.fillStates[i]:null,u=this.textStates[e],d=this.pixelRatio,m=[u.scale[0]*d,u.scale[1]*d],x=Array.isArray(t),E=u.justify?mr[u.justify]:ll(Array.isArray(t)?t[0]:t,u.textAlign||tn),C=n&&a.lineWidth?a.lineWidth:0,T=x?t:t.split(` -`).reduce(yg,[]),{width:w,height:M,widths:v,heights:I,lineWidths:L}=Su(u,T),b=w+C,P=[],F=(b+2)*m[0],N=(M+C)*m[1],G={width:F<0?Math.floor(F):Math.ceil(F),height:N<0?Math.floor(N):Math.ceil(N),contextInstructions:P};(m[0]!=1||m[1]!=1)&&P.push("scale",m),n&&(P.push("strokeStyle",a.strokeStyle),P.push("lineWidth",C),P.push("lineCap",a.lineCap),P.push("lineJoin",a.lineJoin),P.push("miterLimit",a.miterLimit),P.push("setLineDash",[a.lineDash]),P.push("lineDashOffset",a.lineDashOffset)),i&&P.push("fillStyle",l.fillStyle),P.push("textBaseline","middle"),P.push("textAlign","center");let W=.5-E,Y=E*b+W*C,Z=[],it=[],rt=0,Ct=0,tt=0,q=0,K;for(let V=0,dt=T.length;Vt?t-d:o,b=a+m>e?e-m:a,P=T[3]+L*E[0]+T[1],F=T[0]+b*E[1]+T[2],N=v-T[3],G=I-T[0];(w||x!==0)&&(rn[0]=N,on[0]=N,rn[1]=G,ki[1]=G,ki[0]=N+P,Ni[0]=ki[0],Ni[1]=G+F,on[1]=Ni[1]);let W;return x!==0?(W=ue(ne(),i,n,1,1,x,-i,-n),Pt(W,rn),Pt(W,ki),Pt(W,Ni),Pt(W,on),Se(Math.min(rn[0],ki[0],Ni[0],on[0]),Math.min(rn[1],ki[1],Ni[1],on[1]),Math.max(rn[0],ki[0],Ni[0],on[0]),Math.max(rn[1],ki[1],Ni[1],on[1]),xs)):Se(Math.min(N,N+P),Math.min(G,G+F),Math.max(N,N+P),Math.max(G,G+F),xs),C&&(v=Math.round(v),I=Math.round(I)),{drawImageX:v,drawImageY:I,drawImageW:L,drawImageH:b,originX:d,originY:m,declutterBox:{minX:xs[0],minY:xs[1],maxX:xs[2],maxY:xs[3],value:M},canvasTransform:W,scale:E}}replayImageOrLabel_(t,e,i,n,o,a,l){let u=!!(a||l),d=n.declutterBox,m=t.canvas,x=l?l[2]*n.scale[0]/2:0;return d.minX-x<=m.width/e&&d.maxX+x>=0&&d.minY-x<=m.height/e&&d.maxY+x>=0&&(u&&this.replayTextBackground_(t,rn,ki,Ni,on,a,l),Tu(t,n.canvasTransform,o,i,n.originX,n.originY,n.drawImageW,n.drawImageH,n.drawImageX,n.drawImageY,n.scale)),!0}fill_(t){if(this.alignFill_){let e=Pt(this.renderedTransform_,[0,0]),i=512*this.pixelRatio;t.save(),t.translate(e[0]%i,e[1]%i),t.rotate(this.viewRotation_)}t.fill(),this.alignFill_&&t.restore()}setStrokeStyle_(t,e){t.strokeStyle=e[1],t.lineWidth=e[2],t.lineCap=e[3],t.lineJoin=e[4],t.miterLimit=e[5],t.lineDashOffset=e[7],t.setLineDash(e[6])}drawLabelWithPointPlacement_(t,e,i,n){let o=this.textStates[e],a=this.createLabel(t,e,n,i),l=this.strokeStates[i],u=this.pixelRatio,d=ll(Array.isArray(t)?t[0]:t,o.textAlign||tn),m=mr[o.textBaseline||wn],x=l&&l.lineWidth?l.lineWidth:0,E=a.width/u-2*o.scale[0],C=d*E+2*(.5-d)*x,T=m*a.height/u+2*(.5-m)*x;return{label:a,anchorX:C,anchorY:T}}execute_(t,e,i,n,o,a,l,u){let d;this.pixelCoordinates_&&ie(i,this.renderedTransform_)?d=this.pixelCoordinates_:(this.pixelCoordinates_||(this.pixelCoordinates_=[]),d=Oe(this.coordinates,0,this.coordinates.length,2,i,this.pixelCoordinates_),mc(this.renderedTransform_,i));let m=0,x=n.length,E=0,C,T,w,M,v,I,L,b,P,F,N,G,W=0,Y=0,Z=null,it=null,rt=this.coordinateCache_,Ct=this.viewRotation_,tt=Math.round(Math.atan2(-i[1],i[0])*1e12)/1e12,q={context:t,pixelRatio:this.pixelRatio,resolution:this.resolution,rotation:Ct},K=this.instructions!=n||this.overlaps?0:200,V,dt,ht,Lt;for(;mK&&(this.fill_(t),W=0),Y>K&&(t.stroke(),Y=0),!W&&!Y&&(t.beginPath(),M=NaN,v=NaN),++m;break;case et.CIRCLE:E=B[1];let _t=d[E],Mt=d[E+1],Je=d[E+2],he=d[E+3],Dt=Je-_t,Ie=he-Mt,Bt=Math.sqrt(Dt*Dt+Ie*Ie);t.moveTo(_t+Bt,Mt),t.arc(_t,Mt,Bt,0,2*Math.PI,!0),++m;break;case et.CLOSE_PATH:t.closePath(),++m;break;case et.CUSTOM:E=B[1],C=B[2];let an=B[3],fi=B[4],Di=B.length==6?B[5]:void 0;q.geometry=an,q.feature=V,m in rt||(rt[m]=[]);let Ne=rt[m];Di?Di(d,E,C,2,Ne):(Ne[0]=d[E],Ne[1]=d[E+1],Ne.length=2),fi(Ne,q),++m;break;case et.DRAW_IMAGE:E=B[1],C=B[2],b=B[3],T=B[4],w=B[5];let hn=B[6],we=B[7],On=B[8],Fn=B[9],kn=B[10],mi=B[11],Ss=B[12],Qt=B[13],me=B[14],ve=B[15];if(!b&&B.length>=20){P=B[19],F=B[20],N=B[21],G=B[22];let wt=this.drawLabelWithPointPlacement_(P,F,N,G);b=wt.label,B[3]=b;let mt=B[23];T=(wt.anchorX-mt)*this.pixelRatio,B[4]=T;let qt=B[24];w=(wt.anchorY-qt)*this.pixelRatio,B[5]=w,hn=b.height,B[6]=hn,Qt=b.width,B[13]=Qt}let De;B.length>25&&(De=B[25]);let Ce,gi,$e;B.length>17?(Ce=B[16],gi=B[17],$e=B[18]):(Ce=Li,gi=!1,$e=!1),kn&&tt?mi+=Ct:!kn&&!tt&&(mi-=Ct);let Gi=0;for(;E0){if(!a||C!=="Image"&&C!=="Text"||a.includes(P)){let Y=(E[G]-3)/4,Z=n-Y%l,it=n-(Y/l|0),rt=o(P,F,Z*Z+it*it);if(rt)return rt}m.clearRect(0,0,l,l);break}}let w=Object.keys(this.executorsByZIndex_).map(Number);w.sort(ti);let M,v,I,L,b;for(M=w.length-1;M>=0;--M){let P=w[M].toString();for(I=this.executorsByZIndex_[P],v=ul.length-1;v>=0;--v)if(C=ul[v],L=I[C],L!==void 0&&(b=L.executeHitDetection(m,u,i,T,x),b))return b}}getClipCoords(t){let e=this.maxExtent_;if(!e)return null;let i=e[0],n=e[1],o=e[2],a=e[3],l=[i,n,i,a,o,a,o,n];return Oe(l,0,8,2,t,l),l}isEmpty(){return vi(this.executorsByZIndex_)}execute(t,e,i,n,o,a,l){let u=Object.keys(this.executorsByZIndex_).map(Number);u.sort(ti),this.maxExtent_&&(t.save(),this.clip(t,i)),a=a||ul;let d,m,x,E,C,T;for(l&&u.reverse(),d=0,m=u.length;de)break;let u=i[l];u||(u=[],i[l]=u),u.push(((s+o)*t+(s+a))*4+3),o>0&&u.push(((s-o)*t+(s+a))*4+3),a>0&&(u.push(((s+o)*t+(s-a))*4+3),o>0&&u.push(((s-o)*t+(s-a))*4+3))}let n=[];for(let o=0,a=i.length;ox*this.pixelRatio_),lineDashOffset:(a||Ee)*this.pixelRatio_,lineJoin:l!==void 0?l:ri,lineWidth:(u!==void 0?u:Ai)*this.pixelRatio_,miterLimit:d!==void 0?d:wi,strokeStyle:Me(i||bi)}}}setImageStyle(t){let e;if(!t||!(e=t.getSize())){this.image_=null;return}let i=t.getPixelRatio(this.pixelRatio_),n=t.getAnchor(),o=t.getOrigin();this.image_=t.getImage(this.pixelRatio_),this.imageAnchorX_=n[0]*i,this.imageAnchorY_=n[1]*i,this.imageHeight_=e[1]*i,this.imageOpacity_=t.getOpacity(),this.imageOriginX_=o[0],this.imageOriginY_=o[1],this.imageRotateWithView_=t.getRotateWithView(),this.imageRotation_=t.getRotation();let a=t.getScaleArray();this.imageScale_=[a[0]*this.pixelRatio_/i,a[1]*this.pixelRatio_/i],this.imageWidth_=e[0]*i}setTextStyle(t){if(!t)this.text_="";else{let e=t.getFill();if(!e)this.textFillState_=null;else{let C=e.getColor();this.textFillState_={fillStyle:Me(C||Kt)}}let i=t.getStroke();if(!i)this.textStrokeState_=null;else{let C=i.getColor(),T=i.getLineCap(),w=i.getLineDash(),M=i.getLineDashOffset(),v=i.getLineJoin(),I=i.getWidth(),L=i.getMiterLimit();this.textStrokeState_={lineCap:T!==void 0?T:In,lineDash:w||xe,lineDashOffset:M||Ee,lineJoin:v!==void 0?v:ri,lineWidth:I!==void 0?I:Ai,miterLimit:L!==void 0?L:wi,strokeStyle:Me(C||bi)}}let n=t.getFont(),o=t.getOffsetX(),a=t.getOffsetY(),l=t.getRotateWithView(),u=t.getRotation(),d=t.getScaleArray(),m=t.getText(),x=t.getTextAlign(),E=t.getTextBaseline();this.textState_={font:n!==void 0?n:oo,textAlign:x!==void 0?x:tn,textBaseline:E!==void 0?E:wn},this.text_=m!==void 0?Array.isArray(m)?m.reduce((C,T,w)=>C+=w%2?" ":T,""):m:"",this.textOffsetX_=o!==void 0?this.pixelRatio_*o:0,this.textOffsetY_=a!==void 0?this.pixelRatio_*a:0,this.textRotateWithView_=l!==void 0?l:!1,this.textRotation_=u!==void 0?u:0,this.textScale_=[this.pixelRatio_*d[0],this.pixelRatio_*d[1]]}}},Od=gl;var He=.5;function Fd(s,t,e,i,n,o,a){let l=s[0]*He,u=s[1]*He,d=bt(l,u);d.imageSmoothingEnabled=!1;let m=d.canvas,x=new Od(d,He,n,null,a),E=e.length,C=Math.floor((256*256*256-1)/E),T={};for(let M=1;M<=E;++M){let v=e[M-1],I=v.getStyleFunction()||i;if(!I)continue;let L=I(v,o);if(!L)continue;Array.isArray(L)||(L=[L]);let P=(M*C).toString(16).padStart(7,"#00000");for(let F=0,N=L.length;F{if(!this.hitDetectionImageData_&&!this.animatingOrInteracting_){let i=[this.context.canvas.width,this.context.canvas.height];Pt(this.pixelTransform,i);let n=this.renderedCenter_,o=this.renderedResolution_,a=this.renderedRotation_,l=this.renderedProjection_,u=this.wrappedRenderedExtent_,d=this.getLayer(),m=[],x=i[0]*He,E=i[1]*He;m.push(this.getRenderTransform(n,o,a,He,x,E,0).slice());let C=d.getSource(),T=l.getExtent();if(C.getWrapX()&&l.canWrapX()&&!je(T,u)){let w=u[0],M=gt(T),v=0,I;for(;wT[2];)++v,I=M*v,m.push(this.getRenderTransform(n,o,a,He,x,E,I).slice()),w-=M}this.hitDetectionImageData_=Fd(i,m,this.renderedFeatures_,d.getStyleFunction(),u,o,a)}e(kd(t,this.renderedFeatures_,this.hitDetectionImageData_))})}forEachFeatureAtCoordinate(t,e,i,n,o){if(!this.replayGroup_)return;let a=e.viewState.resolution,l=e.viewState.rotation,u=this.getLayer(),d={},m=function(C,T,w){let M=lt(C),v=d[M];if(v){if(v!==!0&&wx=C.forEachFeatureAtCoordinate(t,a,l,i,m,C===this.declutterExecutorGroup&&e.declutterTree?e.declutterTree.all().map(T=>T.value):null)),x}handleFontsChanged(){let t=this.getLayer();t.getVisible()&&this.replayGroup_&&t.changed()}handleStyleImageChange_(t){this.renderIfReadyAndVisible()}prepareFrame(t){let e=this.getLayer(),i=e.getSource();if(!i)return!1;let n=t.viewHints[Yt.ANIMATING],o=t.viewHints[Yt.INTERACTING],a=e.getUpdateWhileAnimating(),l=e.getUpdateWhileInteracting();if(this.ready&&!a&&n||!l&&o)return this.animatingOrInteracting_=!0,!0;this.animatingOrInteracting_=!1;let u=t.extent,d=t.viewState,m=d.projection,x=d.resolution,E=t.pixelRatio,C=e.getRevision(),T=e.getRenderBuffer(),w=e.getRenderOrder();w===void 0&&(w=Dd);let M=d.center.slice(),v=Ci(u,T*x),I=v.slice(),L=[v.slice()],b=m.getExtent();if(i.getWrapX()&&m.canWrapX()&&!je(b,t.extent)){let q=gt(b),K=Math.max(gt(v)/2,q);v[0]=b[0]-K,v[2]=b[2]+K,Vr(M,m);let V=oa(L[0],m);V[0]b[0]&&V[2]>b[2]&&L.push([V[0]-q,V[1],V[2]-q,V[3]])}if(this.ready&&this.renderedResolution_==x&&this.renderedRevision_==C&&this.renderedRenderOrder_==w&&je(this.wrappedRenderedExtent_,v))return ie(this.renderedExtent_,I)||(this.hitDetectionImageData_=null,this.renderedExtent_=I),this.renderedCenter_=M,this.replayGroupChanged=!1,!0;this.replayGroup_=null;let P=new rl(Ao(x,E),v,x,E),F;this.getLayer().getDeclutter()&&(F=new rl(Ao(x,E),v,x,E));let N=$r(),G;if(N){for(let q=0,K=L.length;q{let K,V=q.getStyleFunction()||e.getStyleFunction();if(V&&(K=V(q,x)),K){let dt=this.renderFeature(q,W,K,P,G,F);Y=Y&&!dt}},it=os(v,m),rt=i.getFeaturesInExtent(it);w&&rt.sort(w);for(let q=0,K=rt.length;q{this.handleNoGeolocation(i)}):this.handleNoGeolocation({message:"Geolokation er ikke tilg\xE6ngelig."})}};var jd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD////e7f+T0aD17PT89Pzs5PTf3OTs7Pzk5PT09Pzs7PTc5Pzc5PTk7Py3ub3T3OvU5PzU5PTc7Pzk7PTFxsfK2OLZ4+rS7Pzc7PTn9Pq44fHB7Pzb9PzU7PS58/yhqqrz/PzO0dGcyLSUxKyM1KyUzKyE1KSM3KycxKyMzKWU1Kyb3LSTwaOoyrSM1KSU3KyczKyM3KSE3J2UzKSc1Kym2bWc5rCm5LakwqyLyZqU1KSM1JyU3KSf3Kxli212oH+Fs4+cxKSkzKyczKSc1KSU3JyU1Jyc3KTz/PSYwJyYzJy417qn1KekxKSV1JSd1JyuwK2Yy5SkzKGuzKyU1Izs9OuUzIytzqBbalW41aitvqOpyJO4y6WZmpja29nJ2be1xZq6vbXI1avZ3r3s9Kj0/Jzs9Jz0/KT0/JTc4Jj8/JT8/Jz8/KTp6Zn8/Kzo56b8+7f8/OT8/Oz09OT8/PT09Ox4eHf8+Yz8+sj08azIxqTZ17T89JzZ1Ir07pz076TZ1qv88pTo4IyvqGzHwH/89KT88qzr5bjQx5Pq5cnm15rz7dL79dr755v86aT03JPz3qT03azp5NmfjGTq1an45Lr07Nz89OT52Jz83KS+p4D83azjyJv03LTq17j87NOTjoaFclX01KTYvZbMtpapmIL03Lz55Mj81KT01Kz83LTZxKr8xozLwbbyvIT0zKP81Kz01LT83Lz03MS5qJbYx7bp2cj05NT87NyIgnz89Oyoo57px6j8vIT0vIz8zKT0tIT8vIzqtYz0vZT6xZv0zKz81LT83MTny7bOuamzr6z8tIT8zKz007z03Mz85NT0tIz8vJTpuJjzw6TZzsfzrIP8tIzep4b0vJz8xKTdsJf4zLT81Lzn3Nb8rIPLknT0tJT8vJz01MT83Mzvon/imXnzrIz8tJT0w638rIz5vKT8xKz81MT05N347Of8pIP0s5zypIz8tJ37rJT85N38o4z01Mz43NX81MzyzMT89PT8/Pz09PTp6en///8Cu069AAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAci9JREFUeJyMvXt82+Z9L/wFSBAAAfAGkhIlSpYl27JkJjadxBZzcxWzDtukTXrJ2jRpz9p1a5113ZqjrZedd+/27l3bbWp6zlnbdD09y87aLOvabeklDevQUZwmoWwnpu3QkmVLsi6UKJEESZEAARAk8P4h27HTJHt/n48/pgiAeL74/Z7nd39A3J7GCOuUax6YAICKzcjirWjUrBnCts+k571ge46UkxGqazVz/SlRV42efPNFnol4Krrl6W2B4Ps+Zby+HChIBIO+aWAIQatwXgDq/o0LFSI0sK07x0EEFG75rFADgGBXZpDpBTlRh0iwh55g0dHV9v5k671JvcTywWVyz6Dnl/s++SHx5TUSEchAjZ5Q9RpJAt6uLQdGoyOIXD/GGJw8NP+BAgCWqeU30HDBg9h1ODxvBj/irBlAKmI8PToLt4aJ8wE0wXD7gntYdmGh0Iawu8tiobLwMNUAKSpNCQokz7AzAL+fnZq/UxQVbQO8qfccAkM056dKNd+Ln/RA2Ccvk8x3HdzkAx/zh9fGSQgRyonMZESWMxMTJEnK4E2XHqWiV0YTAYB6VAYCTlGrWFV0n9K0ESePaiR93bidZOY6hkR1GagmoNn3TESDfbMI7LVQ90MB3PsGVVXv9gfo/mFek/PeCuAAOLZxkVRJSCKGwiX+QG9QBDd/YoCglQgetW9X9jfOXHzovx84yTEn+nvxo692/PjzE/q5c+NNMl3nPZCBbLYTwIQ6IUmrgMvl8oxGN7EIEQBZD+SMm9VWKh1gS4pJg0KDvk4IRzxy9XqGeFxAVkxCGNoSs/Q/ecwQXG0LBKfixAnoAuUt1jpYm2NYh1XxwglozfrqaqlwZgNTwAw7vMzagAsFzLTAEPho45uHI19ZftFo3jgkAcu5wQ7iex/BU6qWwjkykZVNsBEg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";var Xd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD////r7OTU5vDp5uf++/3//f/59/n18/Xt6+3d293V09XPzc/Ny83Lycvp5+rl4+bJx8rFw8b9/f/7+/3z8/Xv7/Hb293Nzc/Ly83JycvHx8nDw8W/v8GurrC5ubrq6+3i4+XS09XW2Nr3+Pnf4OHX5fLV5fPV5fHO09fV5/Pq7e/X6PPX5e7S6PXW6vXT5/LV5/HQ4evX5/DO3OTV4+vT3+bK1dvP2d/p8PTR5/LZ6PDa5uzJ0dW+xMe7v8Hy9vjLzc7Jy8zV5+/c6e/EzdHU6fLT5+/c7PPr9fnb4uXCx8nZ3uDj6+6ts7W1u730+/3f5uj6/v79///Nz8/n6OiRkpL9//3Nz83Jy8no7Ofp7+fp+uL5//bz9fLv8e7b3drLzcrDxcLp+9/v+unr9Obr+uLp8OXt+eXr9+Pz/O3o8OPd5df2/fHv/OXq8+Lo7+Hr7+fp7eXt7+vr7enj5eHo8N7m69/r8OPr7+Xp7ePHycT8/vnX2dTr8OHv8evt7+nr7efn6ePp7OHLzcbz9e7j5d7f4drIysLW2NDx8+vv8ent7+fr7eXNzsrz9evx8+nt7+Xr7ePU1dDS087r7eG8vbfKy8XGx8HDxL7q6+Xb3NbAwbrZ2tPQ0crNzsf19u/l5t/h4tvv8Ofx8ufv8OXt7uP19evz8+nz8+vx8ent7eXq6uPx8evv7+nt7ee3t7Oysq729vLy8u7v7+vt7enm5uLi4t7e3trW1tK5ubb+/vv5+fbq6ufZ2dbR0c7Pz8yIiIb///3t7evLy8nJycfAwL69vbuvr63T09KysrGsrKuoqKekpKOgoJ+cnJuYmJfz8env7eXt6+P18+3z8evv7efl493t6+bv7enOy8fv7evx7uz18/Lt6+rl4+Lh397d29rV09LPzczLycjJx8bb2NfFwsL//f39+/vNy8v9/f36+vr29vby8vLu7u7q6urm5ubi4uLe3t7a2trW1tbR0dHPz8/Nzc3Ly8vJycnGxsbCwsK3t7e0tLT////82rDGAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAdTFJREFUeJyMfXlgVEW2969u7/ve6U7IHhISSIAkJCCyKMERcBkV4zIK7uKoY5w3Cbw3D2Jk3nskmRnjqCNuo6BvRiPjjBuogLIoS0gCJBCWpLNAkk5635fbfW99f4QlLPN9X/3V3VW3qn59TtVZ6tS5hAHqrfqeOZpj4qSfc6rzxutwvdIC6IZ1GT0pxnMvxFe2zWtd29gUsiS0g/UXW3z0EOoVilF1rH7SY+vl6jCpRQuAmg1prv/wiF+aJuxnAFj1h51lqPiWf7kJY/fm65F7av9coZ7AeXxzbtmPlqjWjht/Kh95+NH3OdUraYORxJw7D5UdpsuUjLzv10XeOjTqi2i0Kvf44bv7umYRBsDaxvU5UdmIWgi4UnT9YEjtdZDUbDKOJtRchcKYgwNdfm/2yBSiHSE1lxtg/dxzUmZwEpDmoJRE1LUNGgCJUDLyx7zXEh0gijBilhe3jEeFPimhDK2QlpjgPVaWRl3UTF3kwFfTY8F1qFcE0zI+2JLziY1Z3ZQ4s8UtebasWFhqOafztUpXN0XMJfGboVHSrkKbmgFaPmpsVXK+fqFzXDaSxvtUhoh5U1NT81VAapq0fIqylsSKxzIOBTOt1lOEC/S/aLzUwN9SD7vX0aOZ9BBfqSsmtYBAAFAR/miYL+ogBGHA+GLzOMkyTidiAaUMawJ8u59XwcSscN+KOXfGCwiaG0KC4tYPEHzXtRpBZQ4ETl7y5SzxmAUH0j3gK5+AELljg6eNmgQYQHCipWMtb1DkMEEnYxyjSKYkqbmOb2y68K9OMBaCcW4k0qTRKG/oopEugV8jJrEwbJcmrQEVxAyhxkk4mukpepgA9RyHmlDZ4+j9M0IKAMDIC6GxUWOwm1mYHsb53QBOZzwzQMYT858+m8MH234kzbWgCys2mR4Zf5hiw1w87RCM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";var Yd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD////c8v/59/j//f/9+/37+fv18/Xt6+3p5+nX1dfV09XT0dPRz9HPzc/Ny83LycvJx8nHxcfFw8XDwcPBv8G/vb+9u725t7mfnp+cm5y1s7axr7Ld297Z19rk4+Xg3+G3trnr6u3b2t3X1tnDwsX9/f/7+/35+fv39/nV1dfT09XJycu/v8G9vb+7u72zs7Wjo6TKy87m5+nQ0dPd4eXMztDz9PXHyMnFxse1u8Df8f++xszd8f/X4+vBytDCxcfX7PnO4OvBz9je6fC7w8jHz9Ty+v/Y8P7d8//b8PzV6fXf8//S5vHK2+XG1t/h5unr7/G7vb7r7e7b3d7T1dbLzc7AwsPa9P/c8/3e9v+8v8D6/f7d9fvi+f/g+v/9///5+/vV19fR09PJy8vAxMC6vrr6/vr4/PiztrPFyMX9//3X2de9v72mp6bj8OG2vLWyuLH2/fXCyMGgpZ+wta/n7Obe7NvZ5ta4wbbO18zEzcLT39Dm8uPv+uzg6N7S2tDr7+rV2dTW49Lo9uTi797K0cju9ezk6+Lb6tbs+Ojq8+e8wrra4NjHzcXy+PDe5Ny1uLStsKzt8OzT1tLR1NDz/e/X39TY6dHe79fM2MfR3svCzb2/x7vN0cv1+fPI08K/wr3z9vHZ58vKzMjr/NXn99Lf78vj8dHg7s/s+dvj8s7n9dTx/9vm79jr8uD8//XY2dX+/vvQ0M3GxsP///3Dw8G+vbn8+/nc29nIx8XTzMH//Pfd1cnW0szKwrfn3tL++PDi39vw59z68+rz7OPc19HZ0Mbh2M7Oxr3r4tj47+XAurPUzsfIw764tLDKxsLPy8e0sa7MycbEwb/Bvrz8+ffp5uTV09LPzcz//f39/f37+/v5+fn39/f19fXz8/Px8fHu7u7q6urm5ubi4uLe3t7b29vZ2dnX19fV1dXT09PR0dHPz8/Nzc3Ly8vJycnHx8fFxcXDw8PBwcG/v7+9vb27u7u5ubm2traysrKvr6+rq6uhoaGUlJT///9XRU/aAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAbEpJREFUeJyNfXdgFGX6/+edndleUneTzfbNJiG0YKF4ds9DTz275jzPggoKiIICioAiRYkKioKCJ2A7sZ933t2Xs5xdQVFq2vaeZDe72WzfmZ35/RFaEL3f88/OvPvOzPuZ533fp77vkGHZ6R8XDQCASFOvHr9KdMMe4dTAWtWDvTqo3/h8aAtCjvzoKl9JZz2bvfD4EvdV/1cPYJZEqha7lly9keyoBuXbclyNVTbK/6T9OyQkxh6T+LaWsOrWxrs4iXXGvAmO8ZbesfkcKB5AWHLpfgKvTfKjGZJI8YrdLt2S1/dYH33wtf3rKY3qX4qaiTVhP2D3lH4dBzi/vSUwk71SxMIn+6p6CyDuHl3jA5H59eIoHJCjAQA2bxiiQsYXnbLe59spvmLeumOvh6bBMPvhaiZlCwn6ZrZxHcm56Wx5rm2i+luW8nTC1QPAx9j+DcAicpmBYt3EtyFb8tR+6zLZgz+tb6FRbADtb63FMH3Cuz0ZeXVDet1wYzCJcbEn3IDPmh1dQZO+6DHZqBJa82n1yNEWYKVZ1HrBUE0GW+N9i+oWjJR31GDo2se7TVJyXssHdGP3v//U88KSZ6uqhk9bLPK1KjW8BU08AJGN5nxWeGUPAoBbqnVX4qwUmHtf+w5+CgC4hpS/TxD9Xq6SS5y/CkRitUCpleTtlPQhsgUQ15xQQWbqVZ01Gjt9HNaMqBDrhROYsaijpm/2SCFHc6lmYoLCh86VTKh5aGjigLVJGkr+ePMdD8wV8qahIA8AlKjPZvbASi0G0Dsmi3WLn3yne5leCG+WMNThJzhMNUP/V2XoT9XLzK5fxEFN6CzNGux0cDCEZCWgl/l0dIWPUsv+Vh5dpOJMR4/n0/fW6nUVRgDAIpwGPPLILJSAMsXCv5zdWd4qrr9uOMV2+CBav+qClNwx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";var Kd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD///+ZZGiFV2FvTVXk4eJ2aG6Ie4JsVmdbTVh+c36Ng42dk52VjJWtpK21rLXVzNXMxMyko6S8tL1aTmdEPFR0bIR0c3yEg4yUlJ2kpK20tL2cnJ68vL7DxM12fJRFTGVNVG1VXHRdZH1lbIRsc408RF49Q1RNVGRma3Y2S3ZGW4RcZHRGTFhsdISGi5UnO16nrLVRa5Q0Q1xkdI1VXGdEVGxUZHx2fIWMk53GzNUrS3U3S2dHW3ZXa4YbOV4bMUwoOlA0QlNnfJZcY2xsc3x8g4wsSGgkRWg5XoVBZ4w8VGxaepw8TFxsiKVEVGRMXGxUZHRcbHxkdISKoLZsfIxMVFzP2uXZ2904WXdKaIVYd5R5kKYsVnguOUKZqbaRnKWwvMZJdZg0VGwrRVlJZHhjhZ9adIc0TFw8VGREXGx4ipeKnqyftcWElJ8bPVJTbHx7nLBifIxrhZYhMjzr8PM0VGQ8XGxchJk8TFREVFxMXGRUZGxcbHRkdHxsfIR0hIxLdYksVmjb5ek0XWw6ZHSDm6SZpKgyTFRjfIQpQklEXWRTbXR7lJuptLe6xMc8XGQ4VFs3R0trhIo0XGRLZGlbdHlVW1zJ1dcsVFrBzM1MdHRTbGxjfHxEVFR0jIxUZGRcbGxkdHR0hIR8jIyElJSMnJxOVFRsdHRGS0t0fHx8hIReZGSirKyEjIyUnJyMlJSzvLxmampDXVxsfXxMXlybtLFMdGw7VExjfHRDXFODnJNTbGJbdGo8RkJzjIB8lIhsfnRMXVNcbGKMnJJHVEtXZFt8jIGirKR4hHpodmqzvLSJlIqbpJuUnZSrtKvDzMO7xLvL1Mt0fXOEjIJVXFLe49l0d2ukpZuMjILMzMOEhIHX19RnZl1+fXOWlYutrKLV1MuenJO2tKvGxLu+vLPp59/VzMiOhICWjIjqzcO1rKnMqJ+vo6DHjoKrkYyonJrFem+qfXl+c3LIu7q+tLPOxMN+fHyWlJTMzMzExMS0tLSsrKyMjIx0dHT///8CMPxvAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAjrdJREFUeJw0vGd4XNX1vr32OWd6731Goxlp1IslW25g3HsHk0ILHWxMhxAIHQKBQMAGEkjov4Tm3jA2NsWWu9W7RqOpmt77nPJ+yP/9tD/va13PWs+997M3+hzscxk4QNWXRRnv1fJgaw0ozuu+b65t4I/kR88DoNUtICIzGXydjyATI1MDNCO7V526/Zqar6G8DNtzAzQAv5pjc14D/xKFLNK8gB+sTOpJkDGIFGeEKMPm5Jkop8gK0UK2ZtYhdlQRzX5vJBY0TsP9DObaXf38EIR//nmUAelE1SIXQKEuVuceM5NDdJYmq6eqQTH3ugLv16+KpM/Wfq2g3b67/qfb4FBFWGqlaWm5LXxoA4k+VVXVH1xfZvcKRtf5bliOLtyrR7F/a6vjLU3xzL9TzEoey8qfzsPzgR7g5iA7NvnD89bmQ4ccAf+cc2iBK8A4n9Wz5CVe2cqaqoYReyQhLoTZZZqmMBYZK0CViOFGeWRhtMA3xSdbHrn8JgiStWlwxpvbO6Vsq+qxv54nc/iXvmEAKS4NmbyLjy1KXBxa3sMp3LY/q82Igp3R37WyoqO9mUBV67l1hKUBAOCYcWp9qMKrJNbDNDAqLCKLl1ZNfXqkbdk65uqOutqbGc/4edqSqGHlh6NrtwrdFcArPJnhnakpig/j0+C2M4Krbgt7tfb4POgOLJBk6QDEc7EqvSXj77P3IihFuUUe5q9Me7z9SrmLgThJJiDPyo2OWx+erIC3emlG2YjJ+dkIizEvPKtYr4VZU2kAQOAwuMzUanfgts1VdpP9XAUKLHw2vh5YJcE4itvsMBYLoWM2GAbzVBsOXC5WPznNkNbLWDKROHQUWq+fOn0ZygDwQXUjm5acw7A8tJi1ka0dUgC2BbvLWtRRQdSuydP+ycL4NJo6Ipmbpkg4pp7zr+8i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";var qd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD////S+rGz0v7X0dKrpqfTzc/17fHKxsikm6Kfmp6XkpbX0tbj3eLs5evn4ObDvMPb1dualprf2t/++v769fuSjJSvrbSdnaOamp+Skpelparl5evh4ef19fra2t/6+v7V1tuVlprR0ta70/23zfe20v6yx+i5xtvn7PS20vqyy++60fSy0v6y0fqtw+HI3vu21v65z+q9xtGu1P6y1v631vqvwdax1vq01PW82PTCz9zM1+Gw2v7J3OytucGOkZPY4uiWmpvu8vPa3t+Rlpb5/v71+vrR0tKZn56mrKvV29rR19bl6+rh5+bL1dOeo6LGzcu4wb2ttK/L8dPD78uVmpZrynrh5+J8xIW63b7C4cbL6s6SxpbC7sWRl5Gan5rN0831+/Xa39rS1tLMzcy0tbSen56Njo2mz6OKx4K0zLDFy8SlraPe4t3W2tWRvoSXrpDA1Lq1vLPN+7vm6+TS3s3Z6NL6/vigvpCrv6DO/bLS/rbU/LvO4MLi9Nbu9OqDhoHQ/q7N+q3S/rLS+rbU9LzS+rLW/rbc+sTR/qrS+q7W/rLW6cXR/abW+bbT7LvS+qrW/q7W+rLa/rbc/busravW/qrW+q7a/rLa+rbT8LPW+qrQ8qbL66HU9Kva+rLf/rbO56/C4Zja+67e/rLa9bPJ4qbb8rvm/Mjf+bfb9a3f+bLb+KO604vU7KXE1aTM45uPk4fo/Lfn7NzF15Hb7Ka8xKP2+ezX3b3i493O0rPr7OW+xoTS1MSsraXDxLz9/vOlppf4+N/c3M3b29LMzMS8vLW0tK2fn5mbm5WWlpHm5uHe3tnb29b+/vrW1tK/v736+vns7OukpKOSkpG3tXXU0824tKLx7d2rqaC3rpPn49fz8evHwbK9uK2bkYPk2czUyLrb0cbb1Mzk3dXMxb6zrqnItaPSwbHTzMbgzb7r5eKalpTb1tTm4d/++vmgmpn79fTf2tr+/v709PTm5ubi4uLe3t7a2trW1tbExMS6urqampqWlpb///+maPEqAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAfmBJREFUeJx0fXd8FGX+//uZmZ3ZMlvSE9J7slEQlFPvzn7qqQjYKxZsJAFiJcYoRjDGgC1AAjYsnIoNBPGsX9vZUZCSTUIKIYX0bJvdKTszz++PAHqnv88/MPvKzD7v/Xw+z6c/Q17y6IqDjFQ8QIvs4YE61KMWK5bjCDVVAcCK5TUNANAIZ0J4QhWv4PSMXdHCTYoYi4sju+qP/jVW2lSbI3EcI8uBRqAa9RAVtQytcrKhj8Yjb7BtKTFLDabSYBc/9EbO5wUlbdy0rpvsZvyq+Z+f25DSf5EiXWG5L4XG7FG+SzhpwIHEf/QeiHWcEqQgFRtlC5wIw2y768PyljbBRRTHAfPf0UvfaySPcjSVOu2q//CJ6vBY3YrlNbapVQAAqusB1GLF8kZnP0QOOfzkxPDwmvAjL2X+sMGtiMRBmHDVURyN0GnStJjPePjIB/WobSEWCIcDDY3VK0HdxtCq83Na9hWR9EsMR7/5iXNiDv2KucgAO7R/fE+iMnpt8ebeEjqnMQ6H7QojRv6+e26Oq248MXGGPXBV3BPuT4tSSbjtedu/Ip8FS2huL6selD+ZFJkIs/yB2olox64ATswpnhb3GNeU6kZNjVxdXV1dXR2oAVALLIcTgLVa5QwTcXcH2ZcQaP+bjqCeSMJVxzhihWGHHkoix1iEmpjmsUhOAE3MQ3YOpyV8s46eBwzaF7NMol2NJqdgthsM2UXhYDlR/rX927yl/IV93UWn0Iwm+eaZatu7cslJo28Uj1WcIy1YdxtB0sMN13a68o4z0KEoh/BFLHwQLYQB8IiCVKcjHkqU56LDQauYMCxBAkRM4UATLLFhO8MhhxuIWG9QfOcmBD7ZS6OJFk9wglYfW3Zj9VPZ8qgceew3jjRZUgLjqK6vbZStnD1Sll5kMsQEEOOWGM6b0AI6HK/xwlth7Ew13ZcUrsJt4+39XxX0nPJ1Qktlsr2/pcX1Y5OeqaCm8J9Gqj/6c9e+u58urnwsY8cJlKq98ifz32JWmwwAKEjFwu7egwEVk1KWN856KCiS1NSGWkmqrQWAKsRgZwBeCVDjcORgAsIHvhxQHhJIgFD5KIz6+up6B293pNmOflJb26Tyfs2p1FtX6qpiKPNSCggxDYAghxjsjeMbNziIB4x4k5oAjdFzhe26/kaW9Vk+ipRTy9bRA8pkS0ZfyTr1YP+QMOGErunTN/Db83FzVihRAtHxvfVtdlXCHAYAUlOVqjXJCPRIw1HLeISJy0sTUyxY1ZLpQR0aAShVEky4nA4D5H6LdRYGe91CrIlSPSz/TpCQiJDsGGOOCRacyzwIhxVRAawI4l/nHWdSwgAUWuIQfeXNZynv/zLZY3spZWIPuPvGcfL0B36JZt1OXCkuC0iutcNxizo95UFoJhZLAQyFM5KrImJxJPv6K1PtTGDglbB86w2EbJv6zqrAitTsRNvDoyOhIX+UTLKgbt4ez4ku2IAVWFFdB4apdVC/fKc9n7yPoAIViOM8kECPwTARYSRp4jdcDeA2BiaWVYsWRwYRrDbjXuu27KVTd5z8923Nvf5M8lj0kxt4P0owO+uwQX/cedJnQhwjqgdkFC/z9RWwwH8u6mdYgKw535O7uKRmYau2a8Y03v4OYB7EpVZ9YxmGL2MA1A/XCAhLPx1uUtVAtehUJtoi4QAhHka1PG1dQwQsh1orYoXK0+Czh/fpCjTmSwqbNUYmYftNkOSV8XHimOV3HII/jrrq6qCLvOmwJ4ecPeSS7aAgqJyVQenbZlfy+T9mnNyFMSS0WqaFfumsjXhfPHToO1v2y4FC2AKt1pa+2pejkgbmyk7LjTcwlyhFrGqu6Js25zuWDdvknw4PUl8iFRgAtfBA8EzCWuVpaEB/a/8yh6pNjkv9hHhy7O64pDWrVqAOtQrv0BH5J1f6QjXb7oY9iU2IOKDrx1Td6gA7kqSh9hiOFXYDAohIuhxD6Xrk1PPspS0DJgFNGo7Ira3erws+aujs/wc2Ld0y4Q5Nvo3wJXgLHhVq140n7yDIFotfBPll1SSQ+7dZT21o5uOGOjbZ7KkZYW8JtEF8r99bj+P+0pPLAICoMPE0Jc7alN5Uj9TUhprhQPWy6jsZabRbi3fw1B2fmGZHU3KCEZMNK+EnrMMfqRREMiJVknlM16tZxIIOSf1tF4MVRAiqisr71n6w9dD0v7cntvniSSWSRnMsKRNnjVx+LoBlLJeZi7DsRE8yep/8cf6SrrW87ZUdmCeO5IG4wvlhk+G5vi7wIeBFelV0It8Bk1DZhS65JPcJc1sBCAOgBmJB+NaN4WERIlDVqFj1Iz/qCuJSBTF5Uk+ejDAJXKQtYfLMS0LhjvAvjjBsdur3N6CpCo1AdT1MkitIXHASlvuP4FiZkGZGeojCnJg+lx5OHLT/+tfwvrO1i74NzXHzrsHXbPPvKc1Qv1iebK4RP/yLvO0+dOl8hDNAtfj+iQ+qI6cHhpe+MH2Wacbbmz8SXqvU5C30EWPP9r3f77dotBdfhDV5HbmQ2w6mpqYGqQ3ZnHMF1QFUVVWh2npMOJYzVYoiHYyKkxBspcakbJyZ249O5RVWArGDW/Y7dahV7FYVkHBs0wLL/tIzkiY4xfgH5pKMy9sl1p2JrxoTz5ud5VcJazUcK6BeUZ3T77gEJ+l3rBCEUhqxMEPUwZrB7b1ccumZenlu2GVCom3Hc0JA3tXlS80pXPyjGZNtbUD0Sp5W0s+3XgomNVN4BC/ZXBJuUcQjAH4nG1LNcihyaCgYJC4EzPjRkiEGEy8nJ/tlp8eCpgagCqhGNWpX2BwYUU0d3FGGgBPI2he6+JxZgbhNGOibddl51kNl6/a+ZCsOpoT3fjb27eHrkzwzEM3o/RQdXZ95xzp3gRAm4/CT/Wb+3WslZCVff1Xo9EkAvSX7pMtOP+fBml8ngn5bp89BYcMXxuaQY31n+Ip35zGqFOfx9/sPScvrAenIAn5D0tCAagDq0qAFv6gKrjFSnPinkDwBVQjoVPnthnolKYk6HEMm42xCEwA0gnfGrYvs3vuLo2Szh2S+G547N+eKf45OF3nqV/X07XYTOx4dvs1DQQGrVfoM3cOaYZe6s+8pae/u6kq4BJfZjZtYIF50TZ7/7pMK5efK2T7/r1ELnO1AdIJZFKE6U0DSmLxSMc5uYlJprAUa8Gc0BUvQxYginMKmIBi1q9RKzDgy9nu9tnGyikNBphZAFYBGa5PIJA/dPXNsz/T0vXMQEdmf2jteTVz4kGpFnPPT5864/gXXxN++vzhlwBHFHjbnuauvMTPsvdMWrQyOSQU5hSS37cmBn2fGNDA28THPEOs894x5Qf699S2f9wJBE3JkYegV8cCbrLTIxQQmQUtnZGen2VboYiNWTW1Ax5bX1ASguho1bNAaCaSNwgRGu1NsAZrikaTfYKAeySw3whlKbaNfmeIHRE90klgLzkm+dcnM8u4TEyxW/LtjCR/WEKbtnhsPs/2UPW5dUTQTT4NER1ZsfuNfAzjxhs+2lq6oTPcK0z9qz/h4R+kk4LnvNpOd9kRUSFmIfypU601DZAjQmSYzIr3WCpFrZKJBIupiGh9vp9Y4V5Pw3zhQNeWjV9tEXp0kocWd+c5dsWaWRZwzEFkq/4aDAAl2jJtx9UecfyBO9HcuHfOPcxeeM33ZNuPzif3TO9blW3fELfAnhHf3r8PAeRs3X2Y/WK6vmoEHSpoP485rteCyUXQEnv/oln8kFxY7PyzeMATwN8Lv7Nu+eBxYPxTdMoIcFxszIYvX34PhOx9Mbo3Ywch0YUdM6Zgc8ZTFO5OdzsfqUW/if6i+frmp96q2k2NUg+suO9WJEBcn1am//YkhIqQ7NCtjdbIrAdTAKSjxnkckCcaYPyIcqtopzfx7zyez3pJjCZJ6g3RRxVfpVUmJbIQ2s/uAN3uv++Uf3Q6fDPzjsSsWVt1Vm4xLztIi4xqY3DM66O7yLn9bVnl5qjZipp0NDOPDl+mLxwN0nviKIYGpHq7R+ob6B4dD3RJHKZssrnG6av8HSK30mJhsynYb1wcEkKLARoxJEKGmCUDLynrU8hCkUYBwCE/tEtUk5AhEiVWIaRqIkixO7xTz7a15h/79NRKCG0+uMj+YTBaQZk8yBwTAZVNWY84zt5WVE0+L15RRK4x3uF+dBJB78w3OFXTxbPvcVSUlyDVBpiPqwplL01/lIrPz/r2qo8oBrr62xlasKSyGSPgXt8ClaAy0jaqmoLpRBpIRQ9UK2SpaYPWDZVwI3pOW5rMm0sBtR7jFcYq1jkmPiKQP9nsa9WrUi/W1aHFMYJIKgBp0cPYzTqw07x1v+/ngHqq8TtXEVZefugkJ/67JWLjqlcXIQ1DSHavGEv9Ci+a9nvy3kwtzclCaPkGdkwCvDi/UXI3/Nww1jQ4vGkbCEkbrBThm8NuKRQmEEpSsAgPExas6rTXwwHLcFTPG9AkjFGe3O21N1mSbLRaTgjUyHhYThnj7pIw8/NSfNJECJZ6s+m3DAlEiHEuTFQXVQD2kWiAWi5dILZw6y9daJzeipbVxf8nyokHruf6B0A0kjTQ3rF0hLmVfnUffy8ZPB4xkFNmSfz7Xdv8ZZZuevk9s6+23uiaBBOMqj5YgYpzDiBt7AMbTaQqAnE7I5qrEyF6CjCSANIgQQRYeWVKjFU4J1GHR4w1/VE1EJxrqrYpI3IhGyezckvCXbuHjSHbvtOz9Y48d4YhzApaYI1s4EAHDoRr1QG1NKrF7Wm0xrnolI3BSYBcaAeKd8+NHW6KS6Hp95FCFxxUZ39L2EL+sZa0dk8NWgr4M8IzS+X/GS5A9Ia38sE0D8hfGq33Jkw99dX0fsLlu2Ey7XyM9rlBMlN3j+G5ObLdvNQEYjmS41XHUAMCKmuqqqvDSpdKkoU1EkJVnKJ7UJqLUQoyHXzmcHTuMjOhQlI6aNGQ9Es/WVsf4qEFAJ6J2prYaqIcJwGKJC9iWAfWohV1o/XH3edXVy4p3v7udSgmhtlCk/Q203Pkuaqdtoa8C4Sy5aGxsBsEBkLKaOR8LnuB3P4zbNIC/tT84mDViTw71Ab92UJM5nyUaQnK6RsbhvFwLzryMAmAAvxCL1QEAlqO+vr6qvh7LxkKxoH88Es97M1JTLHV+bnhST7xf63fC/fyXlNfTEyPH4qmVOu+J2h0shVI7ZT0ZwANeighAtYlGGzuynwc6OjrnvfFZyHSqGV/g27XVVdG114C9jZ4a9qBn9IGFeUW5xUNXOC2P+EtpMXNd/0aqAbyL2J5yHMQLAr766qv2N0aQUmZaBwDuhdSUT0VFYqw0lQBg4ImLAqrQ2Ng4lW2oB1CvICRT/2A30QXOXZg8zUliQgjWNFSnLrAqgpZqtB/TECYK0YbE0YEHpza7WgA1Tj3eoQKox0PQg2rh/EEtEAqMvjIU0Pik+8E0xa1aeztw9fKimwZad4Iw73/K6a3Dmdu/99lVKPYT/G+Om0C88QhG+Qcdr02oFaBDe8ZNphIk5IL8/s1y9JHNdjabChEfAM5G6QjQgEZnGL9FRI0KRR3QODgoexJoCi3kIglZEaYAy5/5KE7QOBIko7/bnnWkUMH+zJ1HhK1JamhRxhlBquE0NPJhZVVFYiVw8Nd3XUH4OSELl02MVDpuOf7quOeftHfZ84B5/6denSItyFXteV6iJd35CqMBYJhbM75L1iLF/bXmRqBjq44cj/xTekj+4epn5SvvrxsZ3rpzMSlrLQMnuSMW7X8NIAIigBpUYwUCQUwWHISoF1IOX6akp9z3BEmJ2azRxqO+JRMmyVZmMmIc+RGgoEmLT5AgWSnAGvZvk3vhc5+7WrbIQBx/gLk8vvy867FC3Lxh4bLV3RHnrlczFYrDHvtIEa/3ktiJg65JAMBlM2+tf+bO289ni9DnDirjJlMl6+4QIL9+7Rs70KF+NeevJcCl6GA82qGQdMQpqTkGRARQLzbU1ztSUx0OvWOgz5lGo1ZkyIFdz3KTSVxPslXjHgCAxpidcyRi1PFQ3ZGbndW1CKSEpARQAKzDKLhDDnxgfhzUAB6IacPDF56Kx+k5L+H2auxDHN5UF/8ibU5405bV/9Dkq+eY4Y0SADDx9kGksdZvO3qXIQsLturIIcQUgR/0O2w33nijJe4irYiguKMDZBOi2pT7XovG3zmzR6i+trG63sopgq20yBKPXmPGRUXesGDR9SAQlR2esEKTdCNFkAZMejRTiiY/UzYyWoBWt6I5s60/URlTXOeB2MIzx6rNwc2Xfnbj+ovYvPBtLz3pDirtZd149eZUaFmZwcC37w0BAOLt97Z+eLFTWLEDV75JvnA0aml3AwcBWXyTDzhu456unHy9iaUAwCDmsKBWrK2t/a+A6ijVAoAiyaFQQvckEmwit+ZMnyMx2SUWJrjtCQkxK8P5w6mSOmlzCsfQgz+eIbbBLiuJS4vf82X0KA4ANsdqPil0WbyR//N6EDrqeqm8G2MQwiRfVYiecc3ff2x9e2SKH87qCdsFW8LezVgA95XqmA4b9D4X8IOOVseNIVTE/r2GpUArwAxr/oqqRqXxjxiOUmNtba2N9B2fMQAtywmpoMAhKMzI4URrQi60sOIdGhQSJQekY4FhLbK4iTAC6sMGE98T1DTtKA5Nk/WFiB/aivs7HmxDA7HdXFkyC9Nqo060XperDHxj8z+8zgUAjKdgUedhzX7bVh8WbHprZvTtjUg7HawRgixTtaixJX5kUyzQSkFQBjDEH1oJ51T+vf7PcFRX19Wh2rH6cNS1a+zMuh3s2xMhRdH8X/w7PdvwFOTafkqcw1MuqmPlsXsUnmgUsG52xv8ow+///fOEzwYkSHaa9nbxhjpxSVYZsIts2tydd04BYLUCy68dMAF4mBO7tjjdMxEtpQi7YBd12I8TFAA/RJL4SGv8UykPU5RhKt/HqYwJVDQCjdV/iqMetSAr7cbPJHhBENOFnTujia6RSedhyzsj9yamobVQSRxgudYE4aFj96xQbcOSMwwV8T9CQ9zvn6chVj3A+Z7XZneU3P0PmWmLX4wi/Hg8JbtHXrl29fK7Tz7zWh0ApDvYuEuxUfnXz6RcrQjuuHcAKbdS9aANsnxZuGvuYy+2D+v8FcwRw8y4OPrwyqZq/FYT+S+qAwBqJ8gw/o7MX6xWdlyJcQk6c8077fe01J1R+1MMZmLcwKiBxmMPUKhKFVST6eqP+OPW7gq3Vpz8NPnS2/FjaXpTYXQbei5rBjaUbCArN588d6zbbTIAXEXFz2ueZ567sbR800gffh5OSLE7iWwDfjh/y8asM7g6izXyRsJXxa0EBGAMj/NJRa+v/hNFnyIrgEnjOKQ5w8bz8aZSUpCtm+JY5MuO9W/5zDcGiUdh/Mxswag+lnJMzvAPLo89aed+0TQAPP9fD5TtSmXgsorNWLNOdVT5cp14wPggEVUVLgPz00IPtvfDBHgYNf0G/oOWDCxI2TG8DrAtMjEMl3yS/fB6bU1o0XMqd61yRkfZ1K51sN80ESWrGmX8bzh1hEtNRLWhSC/ASF+SbGpGsqi7ct07cNaLZwAZl9l8/olJPjYSa7QfUbIH0pLBQOK9X0+xQ/svrmhwveFmdgFtI/2RqJBHEH6zoG+sgq+6eei9LXsvE15LAMAY94avuZ+Z3PwP59ztq4SM23RgoWBEXQgV2rV70UeLhk+g2sSLXzEMQAHyyyurr0k7eRIRJSXAmoxxrHxYD8BkYrZqYIU4O5PNwDe5b/CBYI494D8Vw9n/Fw4/WSh89sLMoeNUOYTDcjJnkUQMAyQvZSiwrDarR9b8U/rBH4EwRe6b/Zs+LNWz/hWT77w1y19wc7Nl9wstbfDu+ODQNvz8r4AJ8FfN/KXkiZsbX3wAr3pOeOSNYSD3rBMmhwHERDn+mUCieZsYVl7fOiExbHEbWhlvI334nbf2/8XqcTFW2ZDrgSY0NgGAacKs45+ueWC5cb51FNkvbGChpGZCs3/nCx/OP6F28r3zXzjjgAi3PdGSlHK/HVyCDggeMiovW5kqyhrieB4Ar8ZUVVXd/BQm4sy6efZnZa8G//GPWGAkAWuZ5058+9lZpxiX3ZR+aUmhBwBzS05nvGWiMdJ1i4og3hgGUquKzWEAcvprpz2/vvbuilCEOe2OgZ3/scfyGUwwLMzCQ+8ObC4+sX3czE9MJfXwPy2HVtbXcrwo8k/epdltT2IfZmFymTsaahAMiwgaYxjB5fveP3fm4Mk2PRRQ4kXXJikQuF5Caqk3WZKAYeGIWPmBU0cKxsPhk6fYwivCqJp8wVVzc4RkVciIw9x5p9Px24Nx+k7PiDoB2QQ4a+gdM/TDlndOevgjXJk8jJScO1TsBAD9hUvLVby6PswoG1oblhz/753dXWZxM7fkvblrKfkM3e8JdFvQzVopmCCiU0Lg0FAPYiMns3sR7gdo9Gmnn6EgUm2LyhuKgyCJyT7ETtBUarHFKYWropmY5A0V9S7+6yNClQLbj8IPUIWPp0y/zSi8XLmvaN/2hL1dVZ5e4H0LA0pe2hF3TVXqmNYIgHFlx29F8Ofyvi/dSIsbjvOTOxlzpxOyTc7PMWxR3y1RVaQ3Jic1l9Pp+67uPKGDeXvo9o3V4H76Gc4z6x44/rTDw6sZZ5ytoQHVuOt2XWFlilKNXA2SMKRGkRBHmCpQNIYRHvJP/pxkWNMO9y/TB8dIJL4sKd9uk0bG+5fVmrACgHvR+aydXfpcqsViMY/oC1lm9Bx+sBuBi7pQCjvChCShzfpg1Vmz5fI3vzRHANwVZXO38VmAJ0jmDYNPvYMxY07INuS+wNM5617WX5v28e73+5qxoXsi84I7O+zkjpbMOSHp8a+r/6PMVtPJFyPcR8al29McYzZEZSpy7ETDs6FL3QnYGYr9EhGSkwPRpUANhLp6aVr3e+fNi3J9IcZgOSuhGVIMKbum8f6AhQijsga4DzEAkskQYWVLtqwB4OfOfOMtS+6aZQf29e16/q4scU/J/NWli3q4xrrNTpNZwveaiF+QM5a03L/9NOERvDEM5Jw8C1oYIUB2GpY3bgTUree4HN+eUVKxzb47nHnxSJhpwcV94HFQmkzZdWjrBzHX+bX3um46KSSYhCSIhqqjMTIyJCBBQ5sMawKJUAANDbaV1GmZLynj5qjoAovqqqVK96EeqqanxjM2OF0yAH4AisooI8MaK9MjRVO7O+9XD7f0+yczPiZ510YOhO+qnFNSXvnN+xu1/YFQRBswweCNsWT1+mnOthTyxjCQuvBvAgm/GQLwAxtvuxGvrHvjPvfzBbu/wnov7tt/7kSgg6kgM7aGl4YdX4q9sud9MQ+fTXa42VMqfScPCcTGMDqjG/dSih/xZYR6XEqAVAH1QHV0kpM+emGayx65BUAtUFMtyG49rEFTINKfoQFaxj/tNthTPAQ4Usfmz8s72YxlrP16MbMWXZic5Xx66Wnzn2aCFSEq3HldK68DiNuwta23pV0JNsnDiMu5X4DeE7oAAM4lxkZMzFm2pFW559umhYsWtZ278QKfLngZ4DaaHNd4BjWs3PJQbb/8Qa82WPPr/FuVeaecdFLQHrTZRiJe4AQl3u9KszjM4all1ze46IS2+XjoWFFVWwugoR5idWgsa/QXCnWpRwPAk4+jsmxYGV4GhQ0AbzMLMugjb60LjZMWf7QICOfn0e/N6dYXrkte937iRgUAQl/f+Nk72kdD5L4dnhShihGCXZAB2fXFFrqGTMS/8dQ4/2747wzd3HRKRUdCdoBamfU+k7yhZJxIWZtz6VUPG6cdeGPHc+e8XK/GMzbnq/cMRRRjqYN18t0YiFPg8g8/dtS3TEaidRqxjDqw4sgnoVqoCQoFnFmvyTwA3OSxAiRoagCJUwDgdN01kbCBmR9TZpAe28E0HMcK37B3x7Tom323jB+8iQGAqwsPKnD+c9r/hfpg3M8qehiwAbbQxXec6LgxvnnJzcwblWEGZIxs1gususW3i8Eag72BXvfDjoh/7donykq+zLo9Orv08onEIKcpJzx4E/nuYb6PgVXf+5ShDdnjj3oytUD1xGMZzolIYPlRb4ABrIgQqxo7eCTIWgsVUP0BAJbLdRv8E/PiixMeHZ5f0F0AzKLxeTBJ+xk73mEWX9LSjv94V7IAuDe6X42ZeuJJoesTrBdqpm00BAAyZG3tvhvN5hsob9Ti7yCAr8cTzg4q+flM+ctwLTxRtVz+bhup+mDjT4k3eK9sf09LWEsCYnTWTf08jRXHOcMDJlbaxAR1wnrMhYk10meTQ5zjdyl5NAoeq0UwR7Wt2ogfwIUjOFqGj+0Qg4jLCJ1VMIB81xOPRavQpvpXom3egyWzvjbXbTG36Ct7po2YAB6cm8BLyH13x3eh806ien8IgAwbkmJP4dXAPfHqG0JDPwMKtKSkzNYNBuA23sCEnxcFPnzd7hYkjaOcvhpk/sq03g6EtlwbPc7568484GDCc96DSpzTHzjmi0GKeSKJwoHw0fIbautBRBpiYUlwTWhTVoPYYJMB2GAqBsDfduXE3PRLClZfmTemAK8terBxbt5rqJjxNX6lJth3p6qretdQYK2nZ3Gc3MjJckoIAGyAzL9tl+S//Wj79DJcZa1sBshAw8Px41bAYBYOtv9yuqRylD0JGE+kLRuinWdeitLSV4hQQeOlk1bPSnAi57H4CY7a7LFjqwZMq27QWKr1t09qYaURIawQy3dH/MTtR5YAyAD8sPG4I1Pcumr/64++k4SvX9nsxAczw8BtOKNqMsH/rKs8FUxapo2MvmL49TjreRbKRvccrScxscs2WJuZk7nzXNpMVAAg26+9Rmd9gsPFbHw8+uJLL0+TbTjJusj8mhBKvbuzsy1sYwkiUrBmr02eRLA7PqrpTCKk32pUJpCYJATDv30CNHI0IlV5ROuUivh/q1TLgBtxPEnMGaKoqGxZcn/rOGZ9chUwfxEqWhZ/UlLif7X5iXDi3YlX2YOHnW+jkCuykjIERjHFU0Dm4523OG+nlxT/NfS6rwwA5iYWpiIGw4wyP5uOm1fcINvIibh46fWFxhUVBLPeHmKvqvr1OLLjvQfc7i4RRgCRKFzjUXYqZJzS7PuhBtXfVdUBFx+HMKpGCDQN4FMIqCnLADkSWCNII5lAs6OZ0mZgY0ocwtszsani7XdBek2wl9nahJ/Ucq/zGqtM5Oq7hOBwaC3kKT3TGUN5SV+8eKtTfnP1cUArmM7DByfAlGiszhiM/91frc9EGdBo/ssV+zLMfXOuGS8v31J1CuO98fGWeJMHaCzegwQHrzrE37XQPCpM06EI4m8MiSEiVTc2xfsAgLdVXgKeCkCcmWwKJgAIRev7HZHKm+eRJyaAytwkEFpLJHp5u3VRCdMxT6eccFBRv9lx2qWGh7DQBwG8coQj8U+NMLfRspZSybWKAGUtZO4+Z/lgDLo+SbjSH4utjHaHWArsZnwMYG/YevWi9Sh/e+zirWWoVMwQpD4z1T/gn+boYcWjGZF6zmpgEmOi8zfZUhNBhDrF5j6kAUDoYZVas9sZ2cDw4k8Q1YDLH6rMkBwo3bb/vkdA0fo25lqeAF4NdNz0xlXpr3BbK5J6U/qKfylm36qC03ziAptsu/HIF8TSqjfLN8+AsZ89mwJobW7L8HZdxOscdOhM7yuJlCpveysqCCj0Zhp55asVFMB4+RYCArCz0Cns75bA6/00iuSmJtTUALVOwKlP2izh6FEL2ejh3BELIcQzde3XrHYSLiHQNKtNkTXAFrdTH1jfv/7FyrIIgJNLr8IzXz4IeistXjsmhZnDuD6Uw25CfnpSxOEI7Lo15dhmAXDDL0YXvmjONb1l2wAUl5H7F+3/B+XtLofJgZGf6/qrXNybiO3/CNLS9WR187zT8gmpaAEF5lyaYzpx7mQ3ooG0vPhE2aySUVUvNgCNsXAKDUb1cPWxWL86DoEwKBe3EzwAWyphVc08BJuNkE0UAEj0za+36OnK6QOURFCxoHsWtB9TEisG2xYvLg9ILVUB1KwIiLE829gDGuOZpYZctikLAsSm8RWLZq5j3hM7CilaY4VzyDeRJwRTVX8KEIfJWH42dvJ1b421fNYRYCzcq/PmYSk/mggirCP4YIsSduPJtL0qKUw1OGpX68eHa2rFfzXVB4aTEIFd5Y4lgeqhiZPLwmqEyL9LN/g1yADcU1denPOyRblog6Nq8qxfljTfGQ6Tsk1joD8M2DcgbZmoF/WFn5SWhXcfMPigpjPJxjGO2APP4rj7AEO6ZDtQZkFn6ZeunwXi8wGQLAznadIdlNxScd6/v1nCdNy8G+/NXPzuFS2JskmAVmQDM/2wpIh2WB1xeVyhTXgkcD1EuwhlwkHZ3+1ZjyXz1iYr8PXU5RHR5mEDEIQG8MEIRsd8a/Un32RWLDjxawpnD20N3/Iv3F5AlmXSG2ZzvWf6D05vMy2CE0zdDetDPyXH4HIB+EI3r7OYT8w3RAYmkI7GzpGitWM68vPzAb2DQ3Cx13cN3bhhjVl0ZtuapXhm8bNJFABF7M7VTM/1CCZ+ZBWV3pR4f4DxxAXSYqIfw6JdFAUdnKkLx9JZnkmRKlaSo09BIMP4XyJ5X6+//OyTvOal22wKfr0PyO+MJo19mnj9K1h0mz35W++ZOwrk6a/DSlVBJ3mLtdmhDy8zPSEXzmNfpw3tRVvNPUu2m4A45xG7jRlRYoIKoBvgBk/d87N6Ouht7flsu7elvaKLIVdsGsLYojWWZzpDhYdwYM+/FerUtGHdge6ceFE6oNTYEsQIImOEY4jGHV1mOEGvqneO8kdYYU3thw3673DYzn21ubv087GTq9++RCZo0S8C7s8CuajpP3TZkJC111v7fXGX57v/nDDsIX3pld+WEWD2L89p17kO8uSiC8njpuGMvroOaC0EYF06rHd7AXTDCyZXFDb/nQC+Qhih8sw1awtPoAi3k2cPAgdyitoQDg2AakRM1ENDQ9Udl4S0hL/mZyACd4I9Iv+uFGE42fBjtWEHdzSBpUKG/JuMARDQ8tki/Ras5uTngFY8Bzy2cJySuI3LSAZRvF2vlHQ+rrtKIieGHjEjrlmVqKig9o1LbAG78FyiJLGWnj1sGEAZdsTbxkf02BQOAMzYF87iyp8rcNzVdy49u+XQ2nX0NrRUlLT9zU6AKD0FZMt/1OWBmCckVgeUGlrTGnEeSnUnCiwNOKw2buWxn5yVBIsEJ7psR3SDsUwp6lEbysOG+9FX6Ku+esmlpyfSk79OBcp2oWLpU6+Q6MD6A132gOi9eczCC6GnAubAcPb6OUBh6RzTMabRJWVopmlzC0ABpHurZw+eN6wD6O4GADAfC8//DSetB76+7dnILRd3mBRJgC6VvjkH0FqdCETi45vswySyYIXINVgb2IXth3cFWGTn6qqqgvzWgSNEdfqInuWZutJgxoDflXigEbh6Kxo5bxQVv65FxYIdSwBShU30bgp7QYsX+Y69THbEZGztd1SpbrWfZrX0YcPrm3SOefbl/UDJCdtZChAM3rQojsngYt2G6vV6UUZ8zPkJ140ZxoYKMj4riQjZ/4jnnkdFywNnGCR7mWI9JSyRBVGqs8V+HSzEJms96hjTHGxNDB6ErSgtzZ0EYEUNUF87HE3+S9zt10e8PADwikBtMiBABmAlAFDYuXndOvPM5jceXDcyDqwCULEb7uLvFksPX74z48z5Z9+306bhV4OJhzVGT0JLRsc/FlZHxpP2X3NTGUj7NkIoQIGyu4oe/TWAWWy36oOXUi93fGfk43Xzwe/7do9CN4VvndW2Zwxk3A8802k7XOLcqe1+sDGU7AhIU7Mk9XCb99QR+2D6ATXe4Rp3abbHaC0A6RFF8kC8WxA58BoAaxgy+FTVT3WLe86nVANweTIjLibzMvIqAYDe+RLIg19fcWV8ZeiAF6b988y/Pv+Q1TpbFgYcWQ+vF24anEfXGOWRgLLzFAYgHbqXAhSEePX3XuJo90wBgM8LgOkse3ml+c6WzaXbKxZAIrNQ2lKBxM1XZaDTNiI4d5E4NMnWOEIcU42KAJSVNgKr6tAt8hgcvKO0YMOGFjQootmrDwlIlWxT4iTwFkuqRjwEnLAlDAAhQFzlcBQ7JP1RtAAAxj8ZH4H4SjZVdYmPFL6wLomTfxkK2iKHF5VHhzvebzba1HEuq9LCksV0OldpLHEeYID+z0PfwlJsieZ3A4DPx5zC3r7RwpqG8Z53xDQ2VJAkAKfPf3NmDENeHaf87Q21SuWdiFRVHR144aDbUxzhcXt4Uvb3jFCRt3BoejW1djhoTSEYcgN+AOQgIUQ5jCGimaMWUQPgSkOkMhKJdIgcgE10Lua+FU58NOGG6DDNzzrw+a8r2w3iSOBUN7FPvNFkvL2/27if1TlmOUFux5oLdxWtI9tvOT6LkO9DfxEVzjLJmNMBnw/5zA2YdR97oCqemJXaBcZ20/wa69uT3yE7BKT1zUIAbmcjiRcnj4aGtbVBylMoZLL2HkkKLVtGJzs1jydNnOCBvEmLRxg2vXwcABSomjYimFaVqMrIBVMh41Bzs6O5eVtjPwDgaoCQ8ZnlFBR72BmzcrKmKcwl34Q+9RvmjpUEIDBvRCm3/wq2mCNZ2zhiug8vxOD+Ug/+PhzR4YkJUnF+fj66mVFa4RJP3xBx3jnaALJtnVFobiihN4NQ28g49sg/qAEAgdCxVuW6OhDEc+OOujqYzErINHGiy99LM+2vnmCN6NmlYuuUiaSDxGYjxE9gsxF8CAAHAFIZqaxcVp0GANgFtKKtb8Jx3Zn4yw/RvqhxaFrb+57Cco2DMJWZJKz+ve2sHaUmue8LaJTcRE7yGcf5CpZzxkGHXQJnN3ieg5d5l7ScjytEqBve/fbJxSCGVT2tqHJZJb5CyvUoULZMUms+H3Ac8dXrG20riWh3OyKjNlstg4dQh7ZR+Bk+oDlYi54cJlbaZeMBbWohNI4CAHt0ysTX0uJYvIqyM4EweQIo3Re+OdFdNGD9uoizgs20le17w/8rrwtXmQBira1ocfwSeWI/6LaLDq43L1kPFJvzDoQnAwdnmlBZHR425v6LlaPPnhgNQ71FANbTqqxPSvf2zNh1T9IrJe8+ddUEMt+Pt0mRDKofPDptBOdE0APLJOSH6lFbA6C6BqgDHhMD8ROOXByMwhoFwNMpz90Pm2w7Yt3LsP1eRNYt39dYNj61jT5jvog3Ylmfx52qnf+5b8Br4UHucKLdPR3z3ik6YClr169lzlq/ugyM3q89Xb27/bSvi5htsWt0diZ25zOsGJZ0a1ThmHvOkj1Zt3y9ES3by1E6dJxj7VqlaFtOeV7Z3RZILtPBAQLpOtbVAA4kkhsLRvEk0OhpRH1TakMdALp0PNwz3qmm+8HN1gANqUfukCFDCE79vzIaHfyxIetVPJqUhKuBO+c/ccPwUF9Oqia/PzKCAzaNylx7W8kG0tFYdfA4AHGOrAihYOA9+/jvVz9c+h/D9B7o5BQdJN+Eg5IYqytWjlu4ymW7cDF/6RYMOAG0qKD7CbmCp+k9CtjXvlcMkhIL2o7a71o0ukiUA6j7iPrX1tcCTVWQaiBZA4fy9ZyljzG8BigEADQLeA1QAR5oBaWO4pe/arkktmb8aqx3Apk+4j5w8uFeiVWihbFhjEXTQZnepeQfp23G8e3m+Dj/0JU3gszdcqiNnk4XGMt/new+tHzUgGq1KojyEFRwus5xL0wLnlm6BkbGfAn0lgp0svy/5fY1/ZSZVc0UtPppWrI6zv6WlwvE2aFEotGU2480rxxpIW8A6lkEND21MRgCr8EaAmSbjNR+2CD7WSePVBium5sTklpTLpnrh8/zHTCKUz/hP/cXRuJGVGIvw4TKa833iadfMXd7+dLzDNbk+UVcCSIZVFoC+hYzHNRjY5gM8N3HVoR83UEZ+uyOX55Y7DLbe819mRj0931m0c+rLqVPf5OD67oPOGiDhQT131WubaojJ9iPxEn8L9WLEuJGeFYVB6dMogCbDPTyAEA8vIYRsKtK1z36lxft6ZfE4Qx7ITrV5J9OfEko6NBHotaDBWht7dNGHqFPjG3C3JaS3dB/YKykFOTatWLNv4zBCa7ayyC6XJ9K1ByjCJiCvx9fvLbqDHfJJWuLexblanrbtk+2dnnrEroncLr/xxHPCkvM6ag51mfS6CYwbclOqPgzsowbkuKwzuYBgMoAHyDpVJZp3KUAPafZgWW4fxNZXXmCH1+ZQNv2YIll3fnS9IOthEZ6AUeRNVV6qRwL0ELK17ItZxqjr5qIoFKSz3SmV3qwup8p9Acm/utbu7vBZMywWZ665xJ1yQdLWWKzJj7x1QNhdgt4iUNi+COVc1otoaHf3xS0wz8Cf/Rh/C/VSg0NFVaip8DyKQDwCi9Ds07rEsDzAmzAcEkxg0UdHR2VLb/C71WAuTRavVifiPMXT1MaT7fgFVYKWV+6dTa2A4nNraO1NmHHjQTXFr3EjBevatbb0DbKz47Fu499axnKuoEOZuL8XyPix5VKeRtzwPGUTNecUnewlZRqh1OQCNAqQNRUiMc6ZqrdmEYcDpv55B/ZUQtAGOQyeOfpAC/bUokN1Dic7rFQHASAhzDr9oaWoqKitWsfjoMPAH5JebxJjI9YVMvQqjnFV15NxtQwHD7rAHBFl2JmRfmbKEhaw54KD8Vi3LtaMCcSlN9GBtFa1goA3J5v1jcnz4w5kNm1WGnf8Oxtt7uAkM6nFYQ9n+wdq0vkpbEHmn7TkSaroNp+SWRp9E9Fq8bZ5eYxpto0jQ8GoFsgePamxwB7NniZmXt6uBKL12EJbvXHlU3sw9PTgkaP0q74RCkFH9D9JGRNPjSO4tCzS9ub90QKv3/1msQyMu9uWnjbifdVDhZTovJnD7I7vb9DgrJWgCm+oyXp8383/RrtF573PXjn3gN++YnQho0rUkAOf0kFqB6gUWmsO3ZfZNAai6PHwr7/ITH82LDGpnqmrijAIZgeEwD1IRUQ3Py1If9LDkeLA0CrlosZDM+sZXi1MMmb4fuq89n1mRg9oVY36S1NdBEx+wuv+8ALbP9bzyUbTYgZI5G5xW6bWy0m//21Xi/TTjKwhnqP55Nv3Tt9022xYk/V4sBXxiogFfFRqJPW4TCcThsw1Z4SwvTxAXut/GfdRI2AOAy3PwnSyQBcRGNissbApvI2Gx2JQdYtcpkzsoAaIyf1+B8xAb/OMpvGXB0T8QUYP8morJVowzfeIsqYTYUVJscEzBsovKZY0LikojsykbiwI0viIRAH8BtTWssAso970LkRFCAobzZjIvaa7JPLxOYHc8PvT1xbE1dodosVNal+WKw6NF5lcgWp367LLPMnzURAvdTwEhM/oDt3aQANK8QG00TMBuhEK5BtT4dJq5dWOFYvbogzJ9gk6deMibVjefdzj27bf9jB9rIe2ShpKwOAr5OHrVbLY/FrMT/2dFFHS/MViYubF5U4cpIDViimRWO6vXBEFXAd8ILRvQ8uNjKTSBKlbzOpr2iR6Q8at45MPAj1glb2GcSJfiWhHroFkMGjmrW7J1REYcMfpmUAAFIDqD4yNqSczsMvXEcAqFPVJkKpCnTFfi1ahBaJTsQlQgW6s8yMBZFVkBsnD9hot8cz+EyIKzUpsOyt1xIZy/SkWPaS954oIMWmubl/NmV2SvGTlFVgNwQz3+cDOA6AD+SyX/eKkCyLyXrQihZSsZb/WRUyHaI/97ZpiUPB3LhuW/z1+Nf1qLfe0wjCpupUHWU46OZDf4pkxXK8ZGAU2T9q4KFGZJtpImaTYUHMkkxq3GgtqxBDzLNMxrtZSsF5m6hhnXRrOrFmtBM6hPgvzqDGyWduJa3ssJtwxmzAPtFdDBMgQOJE7KoB2c1KKmMFdKox3V4A8IFJkovc8gHh+cP2DWQpQbMJe1xmP4Xeah04jII0oyjdbGwaRL14z0qdCmmIxyhMoJb5UxxYDoQtngJx2MZD04R0mwwCCoADhc3azi5jKskT/kkkDrzEI4yYxuXyAb6b7ypnYzqrBU5P9R4Xzba0vvoax/ASU440v0ioMVUpmtCXdutuqrcJFkOBaBFovjDlzzIPf/LJ1Xu/F/buUP+uFV/a1qZLT6UMUSdUPV5QSJyggU4YVXINpDq/hKph92HVzjDVaPwTFTkS1Id1okzyheAByOlQqMrLAFIJgRJ4rrF47dpFifEAIB90glr2H+SdimdwM/q5waw2Z8RTDrr0OWDCYZp2+9t0wESMjbd0MgBjiiNCjALetjaNNQIQ7RYtqqo+gDk4HrobZ/yy7jbFsFnCJ54kkrv7KI9ESxsFcZrSUIw401+si4vUWgXg2RQKRGtrUf1nvZxHgvpaDVrd0IQNgAY5GXFZACBDoLDO/r8l9y9hsdaB8TawufiFDxRo0dsTl51ZfwU7lNrb/SypQAVKdiu3Xsq8cdwLtVc+a4jSX5lpDNfpojD3DCvdHFS1zCt0aNSIQSQGz+XDyxQUTHg8SF3KWGor53yuju9qU08ZnQEz0qYICo8D8uHBQUfym9kpKwD7/eM2QHqoDvV/1rV9lOoFJmXjY4YXADSEhOAhAoBXTchEfG0dZrETLy1svbq0xRLFibEEYfIFA7s906YlMGOOK25o2b4Jrp2LbJNfmHOZ0GfrbrsINReRTlpCoowhXswZiHI+OBwOryBokl1SrWyMA5jWrnh9cjS9cDqy9ITbVGc+K/yYj3CwK+qwMRyVleAkMaMc63Em5LofTfRPYOIRayP+xEE5RrUDvSOOVVBsPAAtwQUbKChlcuJwWuwySJ89e97tRd7NuFK1I50C/zo4Y2J+8U/OQcU9+ThenLugJWzCrV4V9pj3jsWMpyXzLVqBihLS3nluosR4EcrvjhAAvm7hJ8rpCnSAOeOi4kOJfKuw8I51ijU9c8+YoBoF+OHw3knFCY61pVpVQTrUFdCy4tJS7Enx/JiNAuafd20fITMIR6KkzZ66igOlgoWHGXKTT3tTK5fG//K35+58ngJMKsAEGL/Z3cwnD0iE98Mz65qWbYU+OwYsRr7D8yC8nTPYocAtLRUgFdUz4rmYADs4L52YNIziMnjZtvaunm74uHJX3Dnm9tBe0hR71tv3aV7pL7qMcJcOgcTiOT2Jn2ioH6p9JMqPWEhcVtGQ6VQVxZYeRnUTcHTM4QjVHBn2ZRI9MemxWutUxtHPqBZKgBHBYvsHQ64/7votKMUe4GGhG2snnQ0BoBe5RRbK8M9VOsI4nGiYngkPEy2xZy9tK5GWJBYq5apQ8I93D9wqCbBGOgDko6MM8MF7ZPvl3v447Xsw02UwTKyH3eBndDwfXvqv++NsAXsSR+lB1AN4GE9GDUZNHZJ4uyNB0/q1ut9mretRO3XCztGZZbc1QBXU3336VO3KSB7O6U4f4ZPvmJh1+UWnX/361gcKFp4OP+z3huMHzDETQO48y16n6rrjef+eE8jp/PrLLIZ8fOV/aFPnfkLWb6KoOGna689Pck4VCry+/O5uoHUKwhQx0YeDD5bkSYSC0ggm+Y8MW6PzyY/cKaYQVQNCyMVzUu0jjY06rxJF96tBNsHg1GSyatWwHqvlRFEUpxrRjvRyNwGoAp1c1ogcFfADtnx+4uqFjJAyuc56sXp6G+7seYQ+/yDBGd/B+YHR4QTAhV/vysjbOjlzDTlOvyPpySrO/vEXzDsw1lJv1b+mSpBzR6r/EQyoPsCHY8WlY0RkjprUYDiTuWzHLfa1S+7nhmcEE++32mKKas9WiK6qQshUBfddj8VzntFRD1FUHG8QPwZtVqrg2PlCv6NVCe7AKAsjoScIuD37JuTPr0457Pc2XMHlDNS+UFGd0Vx559w3ztg5Hf9JwXKYiL97gol6Rk8HANp6/Feb7z/sLi2/B/eunh65k2mu2H5a3Jv9XQ8HAzqBPcCxpPUPQG5bXEwO0GIKpqDtTuOz77QiA05lFdX5IMukcXZ2DIRRxYGILY/w0ojsmGjYyIdDifFiaJJMuBCOqiIgQvrtEKiaVJHTJ2j1k0pI1sCPMu7DCVGSoq1KGb2YX73q9YtqbU8Gkj+dnrR0Ogb4b98AkF7Ts/6pwUJCgeIOHDyUHfIzzpmYv62w7bJMQtZf/XOkazS0WFKsUEwLuFav73+AMJtOBigBiNFvmmsivGUSN/f+5FCggrGOC0Jh0rTU5Cxnaargdtn5TKABC68PWSf27NITs4t4e5w9LVJbW6XW1tQcLbE1qKYuLQM462wN0LJp8BuTId0HmTF4rXRMTm4G85a/K5MCsJs/AkhbZhp+V+E3UziY/rdY+QLXKxuXbDP76eo1aw/dF5aDltDrepSyitVO0OrF/xL341pi5HEAMfcknHbZNzrDIKH9e+WhRmKzyfkRdZixxKA6HFa+WCcvcQ5jahqu0UaG+RAKaCxfsj0mUgUNx0bNmhAXIPVorFoT4TVApmR6VisvJs7PGHj8pee3LrL2Fa67WsR1b9yJhKwOAqBSZuNsWPpykKID6N58feCjnbSl7fR5qySSmznj/faVfSWd+C7Yg1JLlOE6/gADIHuKGB0WCsQYTrj3vm5xOkI79467gSSYFm1IAbVBJnyyUgbon1w42QmhGsBGZVT1VK9KdHA0ovEaKynH0txrOIcWlQwBRvaP0MCr4QJ0Koizy/Qe/0ZHdKaPCfu3JI7e0ft5Ys/ks93gb8jnRv/+C1bzzRe/B+ZL08797e6rZ4FqDtnl70beSO24bcec0UmrEOou5o6G6f/NEcAUwzozf0vO/JGE+kDWzdibcKeHVx5e46Z+JsbamAhbC7QYfRem/JS39LlZ6WZ0BUcxBJsNjXRAIEiNpy4La98oDVMbJz22dskLxB+DbNokCRp4AH2vffzypQPbWXYD7LR8Q/MXZ11HFfG67HCPLFAwGbqdvmEsyXqR4CdO930+V7ftNCnJPNglLQk4ZEavry689OE9QSrA5UUr0OrF/+oImX/e7XNi2457n9bGGrgEhRaE9xRumoTHZWUwIsYgWRWIqGqKBlc7dj+RmJ8YE0N6aJCXaMMKSpYDjdUtieqkyLlMXtekeFOIiYo84ecoAs4HrnMCcA+/r3131zu5H554JXndIHEXvWbyDMoH357/yYeu+A1DaZWCVThQLXy1oAXtGy9975w4l/d7Zwkx23K5+e2tlkLGND7UHu4yemYSxQevD/iDroMYpGJxkdlJZ0g9uR1prBB38319fYdoXD4/NK5ZEOc3mVqg3uQmXu4c/X6I5acFmXgjEMeMR0lMQW09p5uM6QoqqXlUJX5PII63QomGaUyXHtiQ+LUG8MyC+z52hSreHm8r3VdE+dZC9sUHP9559YmFn35a2P6ymV9l1N12xpUjWZvCaHvmZv3tK52uku/sVGcOvzu8QyY0Kf5A5OfmYaLvzkc3vIT+AQZADOCytw3mkndMcS8n2pIg/tS3S0rNicE8CHV5o1UCB1SvdSblCN+EJwWoCjJTAllQVRpwDUsP1ABoaIICm+E0D6tAXFqIZ5LVoMkMciVfQoM/vpGxZAyBVrQA1p9LDXqp9d1rajPBOz89fterWOGKPvKiSM7IQgvZt6Z8xwUu79Kbm2ferjlkZo7xpIEWx42px+VJHAgUhgP7JzjAoJ0qFaBbL++QQ1rMiqA69EvEk6pbTQmB5fVWCbUyBSBg3c6hJYpxP7UK1mBEUfx6BKFpyU3eOIiosjgDkwUpnjgb4D880CNFg1KqO9X5MTQg5d4RR3u/saFifVIF1OMWX3LV+1/jjXWy7MQl9GvkODXr4C3D1h0tLaB8ReRMVXl4UfGahffoe5d0IMdUFEd43R004tAQiwkU+p/hAGMUz9m6jkHHO2XR6U7eCQ1fTlrTFOqXFDQcMdgEj/Ep7vN/yHlANZ8szbVBmewanWiLTpIIMjz5TtLUMtrvyRrWkJqXKjZYRVRFCPz+JOv54Be7K5G8a3r7P29+ZcPc9UkUG7LT7GOk7R1VBg5qMs4msTr0QXaigjx7l/+LFmbWXLWaMA3uvCsufpJQ65u+vd8PFSPCwwHd/mcoAHBC+N0u++1P52E/2EQX9uT89KXpsEUDh5cD9bWoqq9tlKufNCOprtfObbfa7NxVqFPAiPHjGHGHGUuAcxX7I2EILje6l6EGYr0kiugUa+vikZMlACf35G7yRYv7jTNu2r3oiiSMtZCuivVruju2YJe2YSTleOrF2XGicSN6fv7bydL5Zzi61tA58z/378H5KGoxsTU7YkhWAQoX4XSF/XMgTPQg8lK351/LALLdjYJrttyNFG5yktYAIhpRi+q6Ji2tuL/19EHezt9jQY0aDoMYzrhkQZXL+w+1weMwGFuM5wM1NVM+cSqAGnXSktY3NvBzx8cJs0ddPerBdx1PLzFGwyC0sOUfdbK5Fy6lH4tIbOwb7bX9wSZzv32dJ8YUFTYsXH16ZogOd+7cc6GPJBWMc4TGFHAuAeD0PwdC1NZmh++jy9+JdQgjmQW7CnbuHctKFf3Dk2oDmpSp441c0yVHZv97+To0HkxVTWpVTWpGlxWoQg3QsNFA4sRkonvyIJ0KSJoUVNdLEE6iwV0CIeP0LYzTtjUvB0r6w/M+bPv2DteXc3+iT9Y7P6Ubc+6kjAsUBHPeX0JusiuKJ8RztpI5dAv3VYK3fdtSe5mHSt2YDRKhvnx0449GBADXxix56d9zT547DfdkhMIJ9P6oYIoSmylrDzwGyDag3pWufDFH+EiVmOqVOmcF0KjaYa0Cpo5N6rPnwOOMTjIQpwITP0n61yEgecSMCVaPteeDSCKSxjdouQOm/rlWUORwzzKJ5SJnQmlzykIa3aA0KpxlDi5+//5PT0pyzfpZkMlzW8ye2Te8dcqWeT0k19Fh+ctPO/PR7fX6AC+hf8QBBt77V1duOyNv4h6BFDqHeuNdsCoWxog/Mf9VKqtcfV0Mu2SZee60wnD1SkiBqprUqmoujh+pm3pCUyOWHewLcs6cFEj1TU3W6mo8HLteaoizuAU5OVHofNF09W24AnT7JWxelzIitr93cNHscPQUHDoEm1MLKU8eKMgw39+xg7nxrMQs5kMuemLJ7pLOwqcY+w4Gk2rHo4l68Fg/E3yt/8WQfADwepkS8z1j6CfxoJYghpz8yAbZKhwejRwadEluNd6eqOiEiH/zXBgbC1n4RrtdEOrFBNTEkWH+CJCq6jgEhiciSIPVVgugHnX/Qg3gTIxEYSCqptOPH7jZXNQ2trj8H5dkj+02bI4l5AGewfDzN58OvWhVxwXW8eNZSnvcKvlllpP9Z0b5mv572T0tJdSYlfLM1+5kgQW8gO9Pd14APpUzgavpxubNsZFDF6B/Ra7CpdhjkQCjCjHQFLaPEmo1rUTiodnA6XWNung9bBbovyX2q9AAtLgP6p5wvQTUAhPDVmVF/Lig3vOM4pd01eIDgUGbcLK8uWIsvv/j/B07rU4EbhwqIMTiO2uskDlQ0bzfGLUkn/LhlqvHy00z4YOMofMvN8S95322b/oEuxd/phgA0A14ffkcU1VV9YkwnjQi4e/gpXkBv+ZwWIZVOSaNCrF4PacoSfiRmaCOmb33KJDQVC0lAFaPFLb+1+PqY4ND4x7xSHu5BE+q1c4PW542iNKMr6t+rVrPHC82rTnFs3P4npHO7R2TOSXITssqYmORX48TKmRgaXvzmGpvBRNeXUHX0Bme+fjoNgPmvNNuP1m34PdlhP+iMsCXzzHMhnffjThZxsnrQE9vKxUgkDG9QZSk8FC0l3db02dd3RZ6b3BIX0HlWgUQgbpEoi37fYau/klIFePE7lQNSQIgNcCZCk1RVfnwrpQfClF8AKawYGF1SczxzvLocZUpstyL99stBE8/sRpzMbcCpeErbBbz4q631rjL6Rz8++f1ic9eIEZUejktjCh/DgJT+gFoPIOxMQDdYHMhqbEoBcsxKXKTaBchLwXNdZDPlFkDJzMx07ShpraqHhONjBu/r482AooIhCE4hCPRbpPFofn8y4OMvXW3qd5uYz9/tukciJH7ZbbiZ0dOv8rYnNAKeJW7uS+uYtN2YJfgETjHx+HAYjSdsPRp0u6l6N6G6+fThQ+nOFj8f0WLAoBgMElIIovvM9VJJ/ykjREEkQ9JHoAxG9RHhnHwzO2LdmZcRBnTaoOKGojisFWgDFf/W4auGkAIECY1zomGBgBICPAedRnqXEOqfWzjvw58aNyyGOtgRpNXBew/XAEE0lEdRoSkLW1Dy4K521vqP40gKTpvxG4w3bvyZnBsIk5eS+cEHnyErh6XwmX/X9Hy+XwQOIUJt33t+2tqhElJ+ObAAZnWebgRTYMCMGjgrH17r75m3+yte2xsRlqyWzwy3xLHjun/lTapBVPbmJJEXeaaJgD14kQmAmjEGqt0kKvExfvCukkyKx0uB5nttw5qds4xgjPzgIGOTAqsb5lLUt55JzmgIADQs+/tltjTx3bt8jsfLZopJ8QHI/wfQ8KjlA+A0C7mpmdYlthtL8RNlHn3G9JKexS94OUq1LY01bJS9Mo0V6oXYwHqTCROzYOEBKhJFqvw30+TpMY03kMPwRZpAmoRsU+oglJD2i/XO8womGg1Q5ppJITQT93bJ/On6bY4nMQLFlpiZZaW78P6q++ZOzr26t9H7JPsgf97ZgbbPo7zg2LX08PvwHOikjxlLf5/VGa3e8nhxiuTnZrIO/ek7P3aUtciap7LH+BV0fR7nAmWGaEU42/XJtuVUIYlRfNDE6VxOT+7rwti9iEcSWc1VdU0NAWteUKgLblM2RduaHKKTCS4tMbjTv5UvOqS45OG2FQx2p/RXNHMBY9/8K9GnD1SsCuBj4r1B1e0LC3qKGXwtVvW6ZlLyA0ti7m8bnrWGJ49Lbf7kn880sk9Pmn89IfFe+FDPrqRDyu1BqmFiS3JcpIZA85dIdJq2gA/CbSkqJnww+QtX4/Gab3XZIZj1dbxnoNBi8cCiSU0ZAEwgiNlxEYAUEAD0YOCFoKHwDJ+MBII1MC56OcZaWsZxVVMBo2h9JbK9eS5rPc+W3cyx0bC+TohXVI0+/Kiwr/qdywSQzp35ocLVx13JwuxiB3HuXdP/0FRPzhU8G5Q+umP+kF8ZWVcN9Dd3apGLRadefI5qGrnDDgT91O7VhODmJqYkpzktGUmmT4B7Ybz5Lj4iafFhxxLw4EgQ/PSTkjU4RGkceBIYbcKqXXBafn8ITlfaPWnndiElFRDWN4ghOGIGUnezBDeTe/VCajB3JFirx8bAMlzjmoqF9f8vu10oyOe2m5k30ZoFyPsByV50lIvJZfvxJvma5eQO3tHyB9DdACtrazXi5kzc0VRd7iYhZc62K5WhF387pgIuyQolOWcwdxsdyg9NjfZ/fyrrvh7VclorEWVMjGhRahNREQmngb87uRTghRhwA9YzGGuOC/scIliE1S5MaYl/bOAuTUyj+SnOyrWE0Jwjvow+FkI8wCZrLwaJkGH78Cn3A3MBSOZ8qsGILIEaPvb9L3bT0pdbFS06nuFP4FRBi8AL4jLEqQUTGJeG3/SmTiAw0OKwaCWunQmQiKqYOP+76Z3u9472O3rQDxYK1CjRCkbDANKKM+GptrfNi6F5BNZQ+KhfqJoQ1B7Otu6h2sabIDc9VHEfIluc3SbEXvl0kpM/ysSSKzEaULQ7cJkOPtSalLy0DxJMXYxwI1dJC/MradkTQwll/zMDz35TjLK/qwTqdULwOcLRC0K1w2VIaE0lxt745Sv40IS91AdHRsP+/ujQ1acvGD4srKT/3aO1fI44TULAKUOC2ka6dUS4vJdZFXjkTpiEwJp7pHhugZIIGmIRrMTBOvDDQ2AzNrPHGtmWr70dqesd5CW/vV+dmyawHRsCRs2hr/n1XNNx54qy9K14QmOOXMkU2YsZ+eL7OXAL82zuxbfnEPO/4nMmKb8iWQVA4CvON+VGJDF2btVpsTiLEE46Fhnl+MIWqwSiVNDsazu/S7NEJg9AVFkoUDjKqZOmq1XFUGQJyYZzi1ajxxwWNVoi2ctQ/X1XCqscbx6KD457cgJs/bJJzfMGyzWfflk8cInF118viehREXsdThjBsL+rp9+Ohcb2NtuveBDybGLUbHx4j4atnxanvRCDE/fGg3GJyTv3qv/2ebbAcCXr1ksgEPXwZFfk0XG2a+xzcMFbvX+xkAqPPRw7sBpRhz/LNIsEUEIQzeBI+0B9ZY4MpEzHEExjeggYaUaNQ1NosfwEcaucHClmvuQbJGCqscKhWitP+gdvisKM4byI7Zn6BVbLl2WZViH6KwuxsaUT/TtFp2uwfZRz4QrPvWXLVfaisW9tIBn0Nb0vLTf8dINkOelwUomuv+IBF5fmU7EADyK3D0bjKuIcd7MOd6ZlizCUq+SKoadzFX/lsiEyZkzLYcVaUKXYw+JNtSjqakJkhA/WD2coNPgoJW6Td62CqhxJvM+ECYlJuekTnaDBBJzGGs1LEBGujlxsOXMegd/i3hHW+UWsC9ahMfWzEJAUHW/rbhdWjCPlLpn5ZuDnY5Fb3npnukzvrtnn6/UQNfI+K0RVjsFRkT6MxzwQbGKsNgDnriTIzqD/zjDTbFONeTSo0r014S1ys9lvqTU7g55aG9/JLkOqLXZ6lQdaJKqqmDLoNNWVV3PYqHqHwnQ1FzvJhsW6lpcnSzBYg8bQJ0CLpT0cBNicrBr/twJ2TG4TvKwyto1A6CbEygWkb3nJjK29z7bjZo0+C/dR94fTzxzRM1fbcwrTtiTfBOjX9gUlPPeH8lqqhmL/LmzmA94BV2KaHuNYUTkENk3HfE/d37msYiVTYp95NS8w7vyy6xKnxr6d5ldgY5aAI1yHYB6CbClJWrDSjUAPDlOcCJlTT+vHrY4pNrG6qZIElHHkv2W/MAtqBcVmQtMEGOIW/FQclWTZekTL16z9cL4xxmpv+nedH5Es5ekw/vpL8bH94YxjMH3mk3DcoAWm3OemIVwV4BaScrlBi/Dhz/Jvud340gZFNOjniDH3IMv97Gz552Y6X5W4d0FuafrOVjz9KACpsxm6oGpu6rrGgGgAQ0uTEaOnHCviCkZo+FhyROfmh4ern3TWRcsTowNkHB8IROpr+FQzWDMxIZtqWvTlphL1j756TVvLFUfVaKR2W5VYPuzaeVu6fJKu+eR7wYiCOUb6CTIJczSnJci0cuThZyc0QarXYLvSNnzv6kbUFWfzzd75kzdCKSwzJaEHIsWEUvj7AmIT0ucRfOtlhzrh3sOcdMsqmQ/WhysBoD6hiZXHB0PV9cAgFQLV+jA2HgwguwC22MTIOA5v82jhowJQFQULM9wMcPzKlsYx9oHXjGH5my+rOdBTnAu30M3EMU5aCsfPXvni8ahXZbNYXyxCvMKmANo6tjARsklXwZV4eCOcXaU9ZUV/5mme5HPccXwRgDBnhC2EsIfArHHdvplhIxcNSXbQKfhgzSN5zUtEvvd+2GaJHAkW9GGhN/6N+oNFk57gilMIEJUmiXsiXg1A/qkGRVsVt1/uOXCHaRyoFiqbHE8yZzv+vVzgdT3PECyrWvOwpldd7rLs0ZP+g8/evGXW24uYcRwbN7Hyf8pvX1tVWXiQU4mD5rjAkT80WWEF74T/YxJBPi8DkyaAgOneqBN/fnbawcHmeSOCX1vb++4mT2WnBgNkZQ4Sy2wHEeLzqgWHPrQ0axSE2pq4Bat/uzejm5XfApXkDPZX0v74lKHygFAFggG5uYsvpRui5ivrFvdjo+WlAywymC0IJ6R5H+/0oUkffta/66Ykb7ri1ApjPAB579t46XmSNwGrU9LdL3PjP7pfgXA58v3260AfPnqzohgizHoPXFaQY4jfqUpS352aFfH0JDIqZlVXdD0SKJn41TrklQPNAH1hHLWI1mHpoSpfy0Zh+7SlP59XYk5hWRsBR7gtKQ6oMFWNz45OfdL+5AxeFmFc3U1uQ8Xv1aQZRrych/VNDaUdTDpytvZwdej9niELnZRMKBntyuJ5fPfugjIcdQX7ppK1QT/BEj+ibwdMdoNcMj3CYLA3Ns5Uej6u3iSQyO1FqcwJhkJbj3qWCkpXMSvx7O/HbtWhVopMOk6yo+qQTQ0SFVIidea6gKTYRIbGkqgzr+839ZBUYtV8iq78v7uBeE0Nj3/AdJW/PyOq7dTCubAMzk2N9t1wIWUXu4rP5BkRvHFmzfS0sUH8j44iYw3f/ZSYmJevSn+KxS1eeGb+JNsr9fUWUQ1Hj4vB+SrABkwgjPCObRtd9vAU08zskrzrKpHPxSGRVU8LhvRtTEZIiBWoV6CJ9EyBKC6qQo1QlzCxLDVnS3+VFsvITU1JBjRVFdax89oeFrjFIua+cV7n71yUwsGildh8aQfrkfWSov1phcD3vDhXlfIwW854HadlR1KDIXSY+tXLWkWJJ4hlybNPKMEFZorFBgdSZpK9/7RjS91KIbZAcAr7M6zsPCRb3MxMR0JnQHHJsVIBsIBe06qYrbGoIjZE0FrIdc/LqS3QhQlSLZpKV3ho4ML9aKSfv0jyckYm4BkK7EYvzhFT5oUOACrI6qe+JPiZ7ZcNpBB0TIvw7Hg79Nw7+5yl43U3XzB95OfnmNmoOLUHkpb+uJHQvKH9PGlZOl0OXsIi5oZ5wJ/eU5sIvzocHfZH8psXsB3YtSBCRugwtqab3XQnfmUeTkYTIng094TcKVDHY9VBIisBomZRBVRnKgSUk2Vz3QNCgBE0abE/W7Q0ypVX9+UbJG6JyA2CMNgG0SH1tk/IKZawdm+GmwZMi9zFDeTwWXbBsAZkP9GZZdudX+8P7RlP+BPeKLToHckYm/Ixdz2ZBmp1CX2MMqbr05a0Iem3gm4Rh1o/R8c+QAwPcoCLhXo7m7NByjyKctckaL2SxOYZckcKE5SQw84U0Taf8hIjSe1CcM1VqH1QFwiFyCZkCSJ5fUojk2SKLVNQNgDSCLqk+zj/W/Z3BYbhSnpQu64x3V9MYOOyDJajHlZC6ML8ek6Cj2wf8y/XzaLNnwhMLwnOd/8LHQB4FyX/b4wPouprGyj+GKs5YO4huK0l6ute/8Q4nbD51MlFhHJIsq+mbPzYXXsnKRsMZPY23xOhj62a0I7s+SahMyy4rTpqeLYL8PpMzZebxUsE7Kug3cmi1wtIDE8//te7qoW0MBkYmrVcMSdDYtCIiQkMdHaqPNH68ynmxsd9iI68Ky0qth85tf1+Wv6F1oPTu4PXe3O4PRrIvf+9PrI6D2lCO1yTTAtZWA/28uaxleVGeM//0w3whhaR/U/6obXm1/M2WEoMcXimg6922qX8ilbWs6tIK/P/DW/u2vPDK2ka26HShiohGfGUvnhGmobU1IxjNT02LCMWtQoHFD/u4yWVUgPshR1aiYOjSXatSitQp3wDNt+ZuosnRJf9jr2dpBFG+6L7jmfa26NpPGuNz98zC7POfHgLvaTcMrFbPahwZDLO0h/MeLmFVaste8151PywosOd+jt+yTmD66JF+guhs6adiWieGIhwWuHSuNT4/5OWksWDSVhmTuozAJ/sKt3aNqNL2IiyhTz2h43FCU1YVDN9Bj9LFWqa1Ag9v5m1aVU3u7oEarwSFxmaBDFfBejKzErcdlKNircGqb4H4hs6iix7S4pX5wxe6ZrSVJ3UeXGPVnWvSkjp3dtoaPMrcd1TMA1sW4LfIW+ez/EBdvYnCFxjrHcFfM3+nTbHxkCbi/y0e1VOV1grLGQByEan3q36x9M0bnP1ic7/AcT0ndB43P+LtDXpORCLTEW4Iur1aSGquur2ZA/6HSL1qYGG+XV33A0qFTsF6T6RuIQY1yyv00OATZA77K3f/g2ScehZsfVG7Qb11w71uLpTGBTSOFzefcp6hOfbPu/xfl7OiNJruiTQIhzUxgHZn0A84l53AV0wRvVfrcTI9aDf8Sh2rQyCIJX6NYFqxmwuIzdlE1deVnpEBMrOPvp6OCaeC6SBJRo9osmkQguNTbYP+F4kUNjXQ3EqoUjxBHv4qGkGMdOBYPYRJP9iRbJcCaafUKcB8oDiNZSlQuqhZ/OHUF/x/vL2MTLmTXNdrQkXcY7KNUPqXPd3SOxkGOwp5BNVEhiChBO7C/cQF+TCDrP/eD5jRWbCu1ZEfkxWfpDhOv1cUHOyAegotuhqlSxaKVsccLrNI0yXMvqjXVJ0v3ZPD+GWWkxlPp0P3GMBATeoCkSbAKqUE9HgpOMZYVnlJjLMTV/UQuSGImjYcjjmam8xEQmEuseeqgRVjk4Tts3dVkupYguXX/axsq77joP41rkBp7abhw8PnXmtMnD875/9+xpF96WsLMR+Ehul+8evyqV0Nwv2DtoS1jGaGRgwEzC/zhaZT4YHkUD4DMwc6fCdZsBsehU5c4rDruKmLn6TmRW7Y7cbMsI7f1UfHHU9HLmkDtPgDCSkJWtIrlpRY0ksVok5klLEIVSYOoMuqZMG7UN9AesthJdk3hqyBWWxvpqYhXGh5EP0pF6gCUzr961Z+iJktuTCuZM4gAb2fSe04HzheqJnrNwWkL/SPBLxK7lP7k4cGrRBC7s1CqT0jOWbSn28KZonyibfRRCfj68Xii5BVbJMtWNXhyC1T1LNa3upe8WHU+ZAqaI3GpaTxM+euKRHxriwlh34cyTiAVsgl2+avInKZxkjUkEaKieXNrTzXDxwtS7IephEDUuIVIlgSRaJlvDHg+116AaiEsa/WwzEC49t7flqvGFH9y38b1OoxU4PTuY55Su/1bRGk+900CrK7d0m33ABWz+tfmkPpOyFeYTXC489k8vMYn/mabwKH6bfurmAIBjPYqm/WQA0HUU22mQsk5yLsdQJm8Pc6DncvNRnHTe3Y/byvk9mOj3u+JilsBkYVyNrTCQkJGq1jKpqagBHrMS9XCQoY+twQrLquV2EugLAdYkh0GsCATUZQK3srYxNvjLFh0MNeYkz3hj86Hgleews8kKD0oeyeH2T8DSF65aSVoSMNI5EKYa8MUtD1a5t1HCtHTm/rX6X5s3j+VH7ri/a8Jkun/3FrkOr08tNjzwOM38XYC3u9vq3jlJ44sf+3yAoSS2rZ8pyMkit5y+OXHR0vwybloE7kOK6bIYVMwA+JCmcta62oSEetQCSthqGpGC0sw3i73Z73tIFFU1niTRFRimFASArNTHsaPdPEuIEWuKbWfYzNhpuDBS9UhnljjBWl7fOiPbTEq57dWsEApKY2fIfw/h3NfHSwcNkRXN3P74A397wsPmzp0c7dEN618cv2m5F/m84VECsBDkg8A72y7l0/jU0tfPIZTERLaDUSqerqAZCyFP6gSOyT239Ki5iLeMqHAGuoe7DcZubzx0yBQBQBmSVcYIGVAUTvMHhqtqrIBpRlkQzh1rhGqHtXv/2bmHCCUsyWynFzz7Usncj7C+9Br7YTdbTS4xVW8/wWMXhuX2ATHty058IT4DYQ6FEersGRo5YNgnU7/8eVTQZdgp+c2LEHwctSpGQgB2CpUCOlQaf3zpVY+IQIxG2RKiLkNHcePSDRTm/JVZ7fkn/fM6QgcssXAGOv1WzmnP7h0LWzmxCkcKCLJdoQBlQFzD8Njs2X3dbrgslpFl9Sbv9Hz6+Y135g4BYC5//9ZnKQGtQAuuSX6l1YJpXzAZkemV2i1qNPcgoyRZQ+A2N2X0aea8zn5Iv75yoE9m3olbPqKP2Aiv6frRbcsLldoV06I7iAFD68bsiErjU+/+8PnDIBd8Hl2yjjCViGT0L7Fu2EU63i3ryNrZe43pKE1JtMRDFOER/ZOHSKZNmRoNqa6urq6OE91JttzkxERIsFo9tM/yWLWTRUSEBEHcPeyb97NnDgjw6Hkvo0KkFS2oIMsbdtv1up+Fc4TpZ8cY0UjqtLn+HQbk2DMZF88p6bGcH8mk74fi1VDsgqlAyqG1/hZQ+cDZogLVuyOSApbm50Ol8al1ris7i0pin0fZdQTMRIga9CBue+Fq71K89LBn56lv5h/0jo+g359Sqgwry9g4W3Hh7yuGFUqFcEM4FmOkBqsax0duWPGYM94jSrAzpG/cN4dNND8AZYwZmWfSTVdWbKpoAQzdvle7bJpySMFH728rma5x6uhNSUDSu4XW5i395H3G3f3dtW9u/ajz68//MhikST6JHuvZAOBj9R7lYHc+ut0K7Dy3k7JJpW/OL3N07qdR1iTQmQSX6Qpbo0bzfdCWUXD6vu2jKYdOjof9IB/nsgJjuhCf9MxjjTjyEokqVKMK1VVVsNWRBFVUakiSwvonKR7iEBzxPTHs3UJBYJ7r/3jOgrdwxqaK9eV5tH1Ts5BZ2D5wdsdAEHEbv7T8m58FORyGWk73FGYsVZmL6DnnTQ97omdG9oXxFzhm/2ZHAB/rdXnR3e0NGLrVwZTF/127VmaKSh47wLImITrlaMfjL1m33Ffd8X/qxg23Xsgr3GuBWJLj1O9tBRqToD5cH4uESGrmpNxI9Ace0wX56AsoJamhBR59ki+ljsBweFk9GrmkgVazkFZUAMQUo3cia/uCTV+sR8acXo7c+XTaZ9Q859u79rt+oelzn7sqvCvE0MGTPM84zl55GOUtKm3rPWRJOMNiAhE7onb7b1O0+d0+rwp4fWr3bFPiHBitXFt846qS/QdeesIkJCbK5JOn0tj1uBjpG1Iwbvf3Rhj6ev7MJOYbWCbNrN5Rm0yK402zsCOqEM3CSGTYAaC2XpRM3pVh9Qfj2ElTkPwmDKZg98TboT2v/+PvDCUd02MdJc4Fm658a0ELFq3plVc+4LaHT5uxvmBaaOcYad1bpYTkHe/a3njh4/5bq0qBioXzi78dIP/UW4v/2H2ZP3Vmk9eX3z0TTDD1U62nhILExCm5EqMs83bmBqny6uLHRecVY/i5QkYoNOeUkjEuzaXHZxiZcVYP7Z0c5YaoPTUlgXeL6YJRW1uL2irRRRQrgiQyRtihMJiHbGSQVlikF687Re8AnT4n+Vws2HTGWwu2k2ebuOCJQtjDWHotQYpwRBf3Lj4EMF5b/ipb/5wqL5C0/qTSbR3GBVD+tK/siICVWb27QzpxtvaUUHoMR3aUNbn17ZUizVhFaWAjod7n7y4nGszq9AUnfKuIOOTOjyBn+JDA9GdCHI6z+m1SWfCloFpdg+HUVLt0SLUGsRxAYzWqHx2FBRzue++ipzvm7CpbvBQtquDaRnDbx0VJ31giXOfxPcyJ5fPaBcs0hFIgu07sSj+lYe2WlDHsHxFOM6NsMMJ0e/84HHLMfbQjkk+jiceN/IVSJibKjEnQgYHF6wh3z0BaV0bDfWi8N0ZBK1+JOG4LuehPF3OOXugpPLXLEQXVD1gHl68QhgJxg7aCeJjaClOFGpf7g5arVdWgHgYaq+vpxDqbC9Lc7JmFc/pnnf3B/B2k4ky4VJ9mH+aTWHOP060qdPsg9ak7F9tCSExPgfm6fW/HOBY1xW7w/0jI/awN+LMGuSMUEVReT2zJakXRuU1ilDEJCn0cs47pYOhrzFay4EDj/U8vSQJuvWEd1C2DLzwe6z6hWKB2NhhRBpIy6h3u5XVmtSxEgahmcGJGXKYzDp0JR5prTBZostqbMzMPmrYvh76qypPP3tb2rm51SO7QuDFeUnBaH41PbdnzwmfOuW37n+7aHR8KjTTXVdDgHMz2wreGsG/t7CLcOPP/azmZ6kXxhURHcUuW7aTeziYxypqEFG7jGJPpmM5EANjfTFsSiZV8TSvoem51s576ReRF674C19CE4hASvUq41pCa4upQV1dXV93dsX+Yd2UkHE8Ckhk33FpjBVALHpOTRbTjINPzc7ltA7P0P+y93W3BIt9nO8tpWfte/VxmovulmkXU3RKJLd37Tx/A4JWbrvz287OfQluxrcic6NYHK8f/pBB9TEGK84vzqSX1bn93Ko67QIwuMQnad3gZc3HH9AjnqCSMNCfTLnHigmaclHjF2mtO6nN88NT1y+yONA5CVLPzgVVRWnXk/ZkIUMZKIiKvEp+XT5UDy19tnDLBNuXcgV56TTSnZSFtIcSSW3TR59hraHUjfcWjCEopyUhvm+1qNxP6YOVDXwx8fYY9fjPyHlxEaYTa92TKj3R0weuI/klzltcHgIND1rnSDy9WhkvytrFJ4wSF0QFiMlXTIxwTNY1Fg0/bV5sVgSY6jrH1mW+NbNSv3vfO+bunp5NDUcTGaVFcShKGUTVcVVVV5eHYqolof+/o4cyJ4UkqQ0ItAE2ww168agO1Y1dJBeh65s4Oi3z29BNITwDKLBxQLAXndJUuINHXw+HmGHC9kftJQSXb9fI4DIO1RPNJdICdla/+WVXnSI+TrjpOHdz85kpH2/Zt3NIJhuj9g4zJdEyfw1WQX0vNxWJkIKP5Pqxa3Nxeb7+vqen+G1m/cPrXcu5/6L5Su3XcCpvqs+Xh+hoAogigCljB1mIjHa+ulxJ1WRWS2f4AudH2QAKsl50BWoFNEnwlnTlzPsfO/N5ZwaAQLj9+/O2h6puS+t5c9y3kDyMHu0vuPVfO/4Rq5nFzrFtauVtJxJfPsX/Yfr2+/O7ZiKiULX6qIL17H3Y8ktnRlUdodxFjMh3T9xYbB5iS+xaTDmyz37eKlIOuXR59ZOn9q7xbrerE6afzLr40pBCEArJok7uvb0ltEDy1U6PF9SxWPEbdiWsgohrWOjly/gfrmbyHBypufc/YkLS+ZUE59QaNA73y2Wz8rPDtFuXkrYExsdoiaWJj2IWCjnWf+3B15pI5pWCZZaBfY5GyE14Av+lJfv7R/EMZIiplT11SgOs7WP7SPW2ddEmX6Jh/H9ORG1lDUU0uzHuqgjqA1YsCm+8bXO5lQMxfH2bvIgmzRr4rGBwMWyycQlOM4EgYHmcCJiqOPLoGqU4jbnRcTlU0hmW0gBpav2wVWeSMkIrjSIcXFBUtBL6T+n49H+dZ1vjPDw932otrz2NP36m6RsRHV08/f6s9cueG8hbioP7LH+Vuje2Zqaq/50j+UQsyGzvzKVuq79g7FF9WjUgL2vCXsx+dvfe+1dPnvIuKZpPbvqi8edmqSnHe4+vm4f1yOvTIai0pbfi9+cLeaZ8fzh3kh1Uhh4tYPMmjAwElZgn/xnGnozeWMAbgITS6+3flLMMqVLBhFi1YW2DYVbRUYH30i6FZCJfsOhA48csJT+MNthZX032uEPPie/qc1M7MqqqfWypamIDBFF6nRLwAN3U23hQdtYOzSSSfsqdedvHZxplzM4FN5lBmP5PJRVa8SyOciXUgTMzevAzVk3LmRiPtPd0hpr/whnumnUZcA4G2lOxel5hOGU4a0RVr1nFp6vDYsZdENUAhCQ7Vaq2qbmx0R/q5gRQAzetczTAIa8bChkA+3e43MtIO47JR+sbXOG9w6IYvaPqnyeGQnPx1Z09szYwO4j0RLYWiEVtxcDh6EAD3Z12YUapQ9tTEiyO53m6sW7suvKHetv2atcalD4kMZwLAfIZpXLa6X16pTq7m1pOlN9M147s23vFUgXV1qZKXllV0aoxjWFngY7aRUT4310Z+GwJtiCEbw7DWr+St44eR8V42UDkH9D77UP9cjpiXSfumfzaUj715eGJADQ3MxBeAHLm0NpYC/X4fPXubmeleCvwMeW5reuGDIIA61WTyP1TcOknZ4uueiFR9MVfeSolJqfcmcXHr+tViZAoH3cYsXvLktcmBFfJbPZSrXLcxusRlwzXX9o2LD+D74L4C/xi8lCO8VTbIhDWnLMN29JBDNLksaS6l2grcpSutKAcPNO+YE1mNjG1FlbvbF5tFsY2GxCY7w/Fao4Zrq84BE9OAbMieDGPG5zHaHj2PVoD8dS36Zg9HuuHz/dnmW4x8yhabp+z89XPUm/9Z2rlkfyv7QKiMrZoeObBv6m8oiV3MrC65BaBC6F/lYdtQevkJt5DoXY/+3zfP3vLRmUKECcE/nBODOpYb42kyDrEITZ08KaYkpHV0LwNQS5S+lNB6AJizA0D5hn2WsjnbDdz8yhhDMyCNWFdOsp/82Gn7/IJdp8e7Ogffc7TrH2o9a+70lm8ausQrl8/+qyQLf6iyeX0AijumS2zxG+bBNehva2eWbPjlrzc2O3/wtrPTI0ubKVDcUdwBUoWFWjPwIm7hHE/etuE+EsHh1avI7Y+r737joeGzBug3mHAlyDG4LIc1PkHQJyKqroNzuqYpiEY6kRk2I/3L1MvOKi8D5uCDeWnsumXPfXTKryfpy8qHCuPFc7eFlJaQc6P2/hcH6k77T09KyPmA5wULrHtLGYqKxxaQleH4m0I9XgN6t9eH4mPSNeXR51u105ZO33tfW2nGIo6TZyV9/PxduWhnp3+6uXl/GY6eVNPUcsBLK4D1i56J/3ENGejYPpF0wt7YDKltA1n0PL15mu1bWZpIgVXnYpbJJIuVH6W4fmVmLEeJOSfQHbO7fz2sGZnNpa0AwMwtXkVBD8B7ACd8mq+7eZA9ma0pIz/cVzfn88nS00PTO7ddpc6F993uZf+nlqMlkO5YeG3dsP8PJXWvD/mcy9iVx5563blhwuGitX6XbJ5ENuxe28oe5ccRYnLXmQYAbALhAn6zZWvbmneYQOZ9CzuYK++PTW9+qS9aZhPiBwYG2ZjLEz942B/WU1K2nnJS6mCvRdkzmI1AiMlo5+13F1K0traK21eZy1pJSd3ikpJfs00hDc5fc01bKPfuHoc8E/83FnJuu3WyqP/ANpE0qhSbdi1IwYJ7ByZ/5/Yes4P5nDuyK4897bpTPj3Q3dH6Qb9DPhFkw84rSC07PcKtowCOJL8459n/LvWVbgqDrjf1x7ffeyCzOSbuuaT4gy/f3DHnOLnVQg4bDricrYqeRdVYasznSQjxkDq1cBI0q5QS69Nsfrz91XGP3X9jGZjytpZrVn8FwwP88uKNSvFO5y5rR+aZD1+GkbM+j+GR0NlfWnLl86X5sT3FDrUCYbLtnhsMVSIu/C/58jlXzJfHnjp87qdPbN/Pca1n7DsBLSffGSSVq6dHlq4DjhweA4CL2iktIVcCFesv37y1Ett0QbpXoj97r2TK/ft5qfn6DJff6HBk3/H8OBMPj5ri6h9JOywSKY/P7aBkJIHUFpHWxdcclAfXLsv98onr4n2Pbzdx53HIr0g61HYuZu3S3Z96Lvrgm7PCPefxIexoUHFZQsBG2py0pQK+5yMth2Tz97XJo0LGuamax57mefniN7eZTHEHR47fY3mdD/rYqulne0KEgqEX7mBACQW5/SnCzv8g6QpsgrTvoT0Fn2d2XEHzrx09o809kj2oxGnOe7PuGirEfjV0gCIxFyTY77cqVkc6cVqCA2rQfl/W19Mjh/zSxpfJ4nXmJU+sNe94cHvljgFIh1XhlcY9usnmHxDoY+WfTx5+ZMMtIfd3TwT+oxMUi2o5WsjXzlLHhd/mSS7s/l+WzKIhypZWnhupWgdQX5mP1b3tzbZVi6t0FkWEUko6UTQ1csWsZ0SyrXwcmxZciZo907k5l1yhqKPRognFOd0/ozQ1FV8uiWwewKxTLdl5VnXAT9Pz4rOLy0oTnJYJnmHs52cN5X5a0+xKGce8SurbqlZUzdhKq46rCEQTpg0+CKJoY5fw00kJZiJh5hyEycphzwkvzriLUSg2EZ+LlGR+9/eoGP1DT2yxspuypxacm+55atn+crMM9OwT5zdfsWpx1XRj2V02io478XrxkRciMqQzbCx+mbYswIvpO14pKUm9Ic8rLM11WIoOkdwcl90z7Zvinx4ZGw0rZ5+Z4HT6u3vDNm9Sjg2hMat7Mmg9b7rHWBofeXb1BfuK643W40hpycwD3LzSj9DdK9W+7oQBiuNI+NWzPo/nT/j0glDctyS18+eG8L+fJxUtYRgvj0epa2li1P0/nkkxODWPPe3uJ+Zc4MhqZO68f15r2cCnWJfQXjU9wm3/MGwjyjV3nr3fnFJ4YlLVcf7j5w+J4YqWXW5RH0zhu4q4LppjB2dJHyRfJdjH+HjtnbMNahT39Vh8jqyICJ0aPVl5hw8UZkwv/lJ/6aZHuf/MM9dUr6po9jGjO25Z18Ig6YqVmsPi3Lv2/kHz3Yaed0/5pOeRyazQ6xfZX8TGsG1vCYMKtLQV7SuB2vbmrnCUHNt/vT4AZbogscVLzk0fDcMwSQdjPlBf++W3Ze3s9J1cCcBqPWTNzeqWVUdEi2Z2YrV3buIpSS2XGWaIpGhmltpz/MwEm+2S4plzLlpFJtnk4eCZ7q+sXE96UmJhijxxaLi3b1AQpIPyzmT30D1F0bVv6h+NPR7toM0ouz+xsaipAui8GfZJZzijjo/Ic0vTTvl+Pntecch1nc9xTfmcwT1FzxMASYb5yCWMbzsZj5L/zQLpLLvVXHXvqCP1xg7SvoF74L2/ZX5btpidHtlQitZvKnvt0hxinTN1WhvIHZ2ujvZzOqsf/MFk2aFzvlS8EylQTwqOkeIOAHNQtkgeR7JfLbSPfHcSk6a+8JeOeEaWqT3DlD/g3/7S9oDCfFDedNVbWLy42HfcV2+1mMsaqw5+vDMprBc7JUnb44zlAgPbJu/6NqswqZ178Q6zrJ2bPdJxZhiwhYxuc/Q2m0GsSrdXUH3I5zqQz7lju/PYU++eHql8NmXW55+exjJttW9f/B7a2ekRzgT5KlGTS/aJs7/YsQogFCDGHPlT/uwPJiWO03vnXfXcouG3YJIqcmjrES1aYq5jTRxMmPT/9QuessmOvboqs2FGiDMjv24e7u+5vE+4aV2MUMLMfQ80Y/Y2SpcOqJ8dsvAj0/Gzy9qDJx+d1vq5NoHmHotFOGgW9lnOOuHRQq5K8Me9wod3MpfY7AoL+PIBAb4yBZxb8uWxpy3NZTwS1cUI2348JdhXjPbxcyNcYQcxzWpv5XdO20HzjKMvP6344PPn+W926ZNY4Z83tu6OdW8BLNZUHMmTXXl5VWCJAZ+sTZLP3399ArZwVvH0RD4hLukkLu6UfFfW48XnPbXNpCAwMR/M7AwKEB2ig8Qobk4RgPhI/pDrjAtwwseDo2Oc7Bk4LnfGNy8dd/VI3+YZk+EudZmN1RgDQj4lok2Y2YqjdnA64znb7KBRZvFxADWKsJg9N8KZHdhXsfeamV9gbMzx5lEnhdx+73gW1UcMvIRe7MBUMRAUBJQyxGRe3Iq8imKTjZCdZ8+ZW5oTS1KUQaTT3rJQL6tmns1euPH8fxdEDpmMSQgzF9tNYiwd/ODquxXv3nPRKfak7/tEGlsx4tm1Y1marf/Er2fbljQ5Pl4wfR+IrT9skzrKZrC8boCFaQzMCLTPhAUxVWFz7j334pT+rUZPcfu6l1VQM8YwHVNyZVRdK1JeeW3JU/Sz/UcsKbM2WhCL0eg5r0y0lGUDDAEBwBDQpRaYpP3Rjz/qPD7/OoMcSmy7dyZor5gV4soOe2YTnFBSHJrf3/ThPuSULeVQRaj53jYDFMwHiMtLiZ2Kc6143V5y3qVPQD/tEXzYJxTPSeiJPdUhvX34o5nks80jNqnjkrOpgxX+X1FX/hbVeYXPd+8dZpgFkGFwQUAEBATHQKtPkpa0GEiwICCxUZMmLijLsDWLprX2yfKktS3tk7gwkCa19jGpJigqmWximpgoLnFGdhhECKvCICAzd+a79873ff2Bmv4H5zznfd/znl/OyzsJJTc/eZ0svwnA5jD/yMtZ4sLaM9qBhKiUahwWRv1cgdPcLlDo7mgpRQHi3OdFci2dfOAIuD1hIqvfd/ZGRBYr1XUBA2Bo3sBYOR64fcOFqLls5OKvdUkpJGw1Gja++9IBx8iqwCUKWhryfdSboRB0/snmq/VPHz19lGPAOKCFiNl3CAvv6KFZI/9lmsQnDk4Yz8Py9DhZB8nJ6u/jeYQstryLy4weVfLSKZVHAnUsWXHluu8LiV8uKCLjHwnLEkP+SbSRiZUKSgLXVwriasxiQjwgqgu6Z7gfSHMT4nMOuR5oHLdNHqInJsC9PrVzzfGVwIAryK/gAAD5dRY+L7b1o1J4n7nqK3mS1BLq19d3ax5zrg7uNQa7Zd3awcAAvGjFRsdFdroUSnsZBUZRVLMpMApDEjj6haBFcBcGdTrcA1tDuNjqTygHfhQyGQam1XEL7wvrtvgYVSQgKv3RTrB2t7cEuZHEp7/4183lATpt5K2KeleZyUTjuQqnWexjTkSFEG8Q/xHzpyB65v8OTYgcWNkKA591c0dhOgkBlw/nGKefAwA0zedFseP9jTk1CNgMF7fxrZvpqPRe5Gxc1ULoLEyLHjK4DaDDM9nDzP5j9suI0SV5h5jw3ikX6lACB9bAy5dvRl2U3ZyGJkVknSVxY9vPBfpqe9O8z9frrfjFqbatXm5c0vmdsbO8/tJ10JHTXfem1YRLCDFHzOpdWo9QWc8sDZkfKFxFtVmsOsJQx4c5CzMuD+fpA5Csmlfe+YnIYa2Pne1UkjZ0dz+fUVBZce4MBfIExxAwPv/cQwolexrXatVoimUeLB8hNEUbFJsXAQZofBYtXZcCbq3LB3GL1PUwMAq2d/p4rtRl6jbxihWy+sZncslLEeFLVkdM5Z6U5cgm/cZZi9kTjOC5bM/Pbv0DiN8jyOrU27z+QO9nuuUnIflDf2x0Ov1r+9Slhtc/EypPMUuD6wOF46rNonAEoOMdGun8D7f8lJTCVJCALD/c+K1t2T67HWNDnq+6Ghf7fRhLWNohFWG8W/JJxcp5jDHG/vV0O6EFbdg37XBkP44QQk/G7JarOtoRQrMXxq+MTl69nrVuXUlnyf37ocUTkx0IvTY8cWmP7/H2OXGX6v4dW2vk7rbRzuIOz5bi5YufXp+HZmIeWpue/khiWmryj85fvOmVjHaMozOjWy8gjygZkFhdTElJKFW8uPUC6pCjMfbd6Hvp66+/vtKneCWMMcYSzsQYG+0YFYhvJRBgjKtE6IgiWI4AAEDB0iN73fXbwmueOgWA8iNHVvTlvexhpim1l+6pyeGaPQNmeOIsb6kgM+GrAWb8EsL6/agurp9ZGj6LICO/GmqLnIIJlKr7ovmZVUG3OeZdM7bdcIzNVmm7L7CtumPN6Vl+XuECBc89EJvmDL8/jRgAoB7eLApK9L15XNUxOo8rId4JrAfmNIDcC6TUH9iRCzZl2fcqRHd+fySO8tzSAgT0IFs4LwOo1IBEjXS4rJ6ivX38l9uGauKE/Ksuy8AX1M85zbD51Sg9gAfx+RAx2TYC4HDpowL8r6E6tjTw3xELnWb3YHCA4oRH7s56+AzjlVGjKuCNIbVAbTu51M13D5bFpEb6KZJ8/37l0Tb3lw7T/vdkxDEA7imbKOhnKVJV1DNLg+tBHxSAWUp8i8Zi5ybS++MfkKO8tisZAACVWLeGDNt6VwLUvzhHfyBPxejSumcXHCFsAwjnSt/rZQcPI8Y7kwyeQlwTY3CQqDsuYxqAZ4tP09NNGDMAtAf7Q8JxuTPECs9zzU80TaDA+16mRbdWDxfGHDNw3pnfAbo2JfbEjISrTL5MIijcTD3AIn4sKPq3zvDfrUCAyj9y557Oa9St+7R3FbM0TBGFq6iO4QQKiNwOO5OE5HDyr20p82VGjCHWZbUkAwC3ZVY7Gc09xhh7cdoPQAEQY1BOvoaKV3FF5ea/BXO93/TAyrpKoMohcEN4o9kA1LPEZA7vd4Dexh+IeapQeN0DYL7HbnTM/fNAg4awRveV+6hHuzhaR+JWBSTmaMtVsjbo+PGLqev6ObWuy5SYKQuA1PkAyfwYeCPeT5haJTBA1ePiaUujbt2n9LAa1bmIgsKqzZzAoPvbVvesK5A1GaBmPsmcwRgwAEtKN+I4dOfWT8CEnwMAK1MQQoyxjTfPHwbCBR7cCgsY+rg5sZSNN/nDpv38Rps9d1AHIAa3BOsHY4bUKn8aQBuK39ST2MD0ACAKHfdSYJx/BZ2QuaIPN0RvUUOA8a4qdPGmnolRWasmz3TYGElLNMpq8KsCTu594Tdr8k88tdU795wVEbrpxODBk5O69rQdb0OhppH4Ue/vbbmnKXwTqiPg94aNy8bkefQDADDEoGtV3mK+QuDjUc4vAY67TahixZ65O4t5Zvv729yRTSSByo1bXk2qy3xrvDdDAVc51F2F7wZ1AOKxZ9JmB4KHojW94BpJWw3uA/FcXpOXMoPOkSj7hCS9Y4PIwoGt2WTLN1CDQSCzvUlb+lbsfVtujM+zb0s0KWqQNAF/Hta/AI5Rfr8XANCNtL4T3KGKQ7r2tKKPyuMbVcSPON4mhlOAMNXdBXcXwHAT2lFxdxGMXvopAJwDBpBM//Cvv3wjgI8BWKEOAstW6MsMhpq9O3u/q+XK36gXFVNZ4J6l8Na+ht86OcIf2xn+bf12HUDusTOfbz1R+7eV6hvLAEcMh+oN4M63wcYm4tGnwSv7+I0w4YDh9CdvTU4DuG5mkimjcUadi5fEv1kpeUBLjQrW+zU8ALutNkg2bdZyqSzuu7Qec/NJdPSwOGBiLtMkpRRxTrNYNVVe23msnOFFwmECsB8aARgAg/k8DUDJ27qMaFA3mdcPrIwdBqe1VkHAqjQ4UASdF7R/2isP+z9GBWcZh+C9UoD67TqA9m/PCJIzt44VWRANF+D2Sj3TA4CH8y16fvJE4XlwF4LVQEqav62J5HO++llPErdMgx+6PZCY4vl8iWFZKlEoJSqB522A0MjxPwQY8ous5bXvDseJfYnAWOg2qwXqmG4GFdSYRWHxOOx/djZh37ZA9sYf5/+Tl9c+cO8sYgy6ABaD47K/q7OtFWcXl2T9vDPHh+1VGBfhqippo1S0qwpnS97sNuyVrJRQK0YIPV7cRUjn7tjiEkpKrtNr/mks7fKJCCEkenN27LJ7TQjdnpyYifxF6PWmb260WDtbLl7O6L87bszYicYGh/szHlr78MOP/jQjE2O33IEcJaHa7SWUKCK6ILsxxruyi2lJKGnz4dYO1BGLsd3bc+3Cns6e1660ebGEMS7C/9uGdjvOzMT2mWkF1BrNeLWkWAkl69c/rfHioiqMi4qK5Owd2TukKixly60L/dhPSagVI4Q6iikhndkSlnf7S4h2fehybXG2JMk+cRlCSNwg7WoV0RMzA+OtbevJtWs6q9X61edDLRkxPeNj01JU++WRoehH09PXPoYxtrsdt5FcQLaTElKieRx5s2WMMfZJxYQQxYclL/LK0Rjbz7d0Oi5Ut7QW3cDRGEvYiIsyizIxtmOMM7Hd3jLZ8V8A4Wd8Ywl7QQAAAABJRU5ErkJggg==";var Vd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD////c8v/Nzc3I8KD85uesm5z98fKyoKKdk5S7p6q2oqarlZykjZXj19utnKKzpaqynqaYh49QTk+klJ22rrTMxczr5Ov++v6clZ3Y0tnOys/SzdV8e3339PtlZGf6+P6PjZTR0dmEhIbf3+G8vL2mpqecnJ1qbIJ3eZGQkqmFhpWkpriChqO1uNCsr8Ocnq7IydCTlZ2Snb3Cyd2tr7Xg5O21t7vFx8vW2Nzm6/SbrMfK1unv9PzW3urY4u+mweHc5/OwzuxpuO6JyfXO0dPm6evD5/3Z8P3e8v6q3/vn9/71+vzf9v7a9v76/v7S1tbKzs7x8vLQ3dLN+86a4ZuV2JWj5qOh2aG05LTK8sre997s+uz0/PT6/vqNtIzH8sWcvprG58TX7NXJ0cjj7+HH28LB0bnP2cq0v63G8qLK9qHO+qWy0pOQon+HlnmxwqHV4snF8ZnQ/qK85ZLS/qax1Y3K8qLO9abD6J3I7qK94Zm32JbT9q/L7Kirx46wzZOkvYrF4qiasITY9bvQ67S/1ajM37l/inTS+qLW/qbO9qLS+qbW/qrV6b+NlITb/qvKy8OpqZ3k5Nfb29X+/vj+9gL79kb9+H/9/O7q1AXOvBS3qCOqoDqUizmgmVbk24l2ck6enZO9vLT59dyysKPPzsn+9cx1dHDX1tKoo5H867z95anDuqPd1sXy2qXu1qLcxpbu16bn0qPz4LXm1rPm2r7az7aclYbt48zt6eD43aTozpvRuo6KfmWgk3rYx6aOhXPy1Jy+pnvJsYarmXmyooXCsZPNxba8qYmzp5Tpx5PfvIyomYeaiHTt0L+um5KmiX3r08m0rqy1kIm2p6WrpKO7tLOVjIuwp6aGeXi+rKvayciahIOjjo20nJyslZW7pKS2oqKkk5OcjIyPgICUhobv29vi0NClnJzNxMTBubnX0NDEvr7OysqjoqL+/v76+vr29vbs7Ozk5OTc3NzW1tbS0tLOzs7KysrExMS0tLSsrKyUlJSMjIz////e5Z6pAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAboBJREFUeJyFfXd8FVX6/nPOtNtLctNoCSk3hJBQxC4iWBFRWSvqCrYlrq5uvOtXY8G+sew1q65r2F0VK/aGLiv2hqJ0SEJuEggtpN86t0w55/dHQgmgv/PJH8lk5sw8877vOW8fcssoPZl4rpYCqscRjzbit8btzNH/7C2+m095tmd+0ban+56u8VninrpDT6l1DDB78JADgeAdjwEIiFLkmMsmtjKTV2HSisSU9ogBV0yeuoXbkTSU6AlL7I9/OcBNMdt+XD+0VWMY99LMhK+4afv9ZxEAntLNyajoR6g0pVNuiQCexJTtiStfPsZ40mZQFk8L9OGM6FNLla6o/TdxgKnMU0s76Tcb+fL891KAVdC1ETgCDUq29VAc8N0n1gAIGnba+uC8ignSrK1NbwCr+2XpWHYuWXOZHbCBnEgfUAfTAInY8en2bXK+XZS75YkrTE5ofoQQwqNwFEz0twChUrOyEoTwiMb0qtWysVrPFIv2KOy2VE46LYThyqj1/SOe4rDhE5W9svX+affhts6n1wsSaJrREWeoN+6z5R56oCbi7AUABIHFtqT324qmzvG6ap/XRH9qMVbNfOF1J5Co+uVB1N3f0mGlQAY8yteScxyvRDa4EhInrldWhTi8KtQugfhDZnkPyfqMc3jTpbJ5UncVROdJs8UggMU25EZ9UtEPLkfEFwB+FUuvY9+4ffYSG2c5Rdbswb/XWsSekUQsHBT0ESSyxhP8wClZr0akzXGzYrMdKxJcQBqRUgIkbRH0m3JzZiprE6UeyrXMOOMt4sD8y6pLQ0akX3LnAZO3hmxMCAECI4OMgKDS0pJ+xlpx69rGe1aLALAUQM34nV02Mliw2w5WmzviWQ6OlOJkdK1iXH5pLKe27emAb49vJB8FBm1J38hLiMs9PNsto6XdFzHZXrwF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";var An=class extends re{constructor(t){let e=t||{};super({element:document.createElement("div"),target:e.target}),this.visible=typeof e.visible>"u"?!0:e.visible;let i=e.className!==void 0?e.className:"ol-layer-switcher ol-unselectable ol-control",n=e.label!==void 0?e.label:"Skift kort";this.labelNode_=typeof n=="string"?document.createTextNode(n):n,this.button_=document.createElement("button");let o=e.tipLabel?e.tipLabel:"Skift kort";this.button_.setAttribute("type","button"),this.button_.id="layer-switcher-button",this.button_.title=o,this.button_.appendChild(this.labelNode_);let a=this;this.button_.onclick=function(u){u.preventDefault(),a.toggleShow()},this.panel1_=document.createElement("div"),this.panel1_.className="container1",this.panel2_=document.createElement("div"),this.panel2_.className="container2",this.panel1_.appendChild(this.panel2_);let l=this.element;l.className=i,this.visible&&(l.appendChild(this.button_),l.appendChild(this.panel1_))}setMap(t){super.setMap(t),t&&this.renderBackgrounds()}renderBackgrounds(){let t=null;if(!this.getMap())return;let e=this.getMap().getLayers().getArray();for(let n=0,o;nt)throw new Error("Tile load sequence violation");this.state=t,this.changed()}load(){ft()}getAlpha(t,e){if(!this.transition_)return 1;let i=this.transitionStarts_[t];if(!i)i=e,this.transitionStarts_[t]=i;else if(i===-1)return 1;let n=e-i+1e3/60;return n>=this.transition_?1:Ra(n/this.transition_)}inTransition(t){return this.transition_?this.transitionStarts_[t]!==-1:!1}endTransition(t){this.transition_&&(this.transitionStarts_[t]=-1)}},Oo=El;var Ml=class extends Oo{constructor(t,e,i,n,o,a){super(t,e,a),this.crossOrigin_=n,this.src_=i,this.key=i,this.image_=new Image,n!==null&&(this.image_.crossOrigin=n),this.unlisten_=null,this.tileLoadFunction_=o}getImage(){return this.image_}setImage(t){this.image_=t,this.state=$.LOADED,this.unlistenImage_(),this.changed()}handleImageError_(){this.state=$.ERROR,this.unlistenImage_(),this.image_=Ug(),this.changed()}handleImageLoad_(){let t=this.image_;t.naturalWidth&&t.naturalHeight?this.state=$.LOADED:this.state=$.EMPTY,this.unlistenImage_(),this.changed()}load(){this.state==$.ERROR&&(this.state=$.IDLE,this.image_=new Image,this.crossOrigin_!==null&&(this.image_.crossOrigin=this.crossOrigin_)),this.state==$.IDLE&&(this.state=$.LOADING,this.changed(),this.tileLoadFunction_(this,this.src_),this.unlisten_=Ro(this.image_,this.handleImageLoad_.bind(this),this.handleImageError_.bind(this)))}unlistenImage_(){this.unlisten_&&(this.unlisten_(),this.unlisten_=null)}};function Ug(){let s=bt(1,1);return s.fillStyle="rgba(0,0,0,0)",s.fillRect(0,0,1,1),s.canvas}var Fo=Ml;var Wg=10,Qd=.25,vl=class{constructor(t,e,i,n,o,a){this.sourceProj_=t,this.targetProj_=e;let l={},u=En(this.targetProj_,this.sourceProj_);this.transformInv_=function(I){let L=I[0]+"/"+I[1];return l[L]||(l[L]=u(I)),l[L]},this.maxSourceExtent_=n,this.errorThresholdSquared_=o*o,this.triangles_=[],this.wrapsXInSource_=!1,this.canWrapXInSource_=this.sourceProj_.canWrapX()&&!!n&&!!this.sourceProj_.getExtent()&>(n)>=gt(this.sourceProj_.getExtent()),this.sourceWorldWidth_=this.sourceProj_.getExtent()?gt(this.sourceProj_.getExtent()):null,this.targetWorldWidth_=this.targetProj_.getExtent()?gt(this.targetProj_.getExtent()):null;let d=Le(i),m=$n(i),x=Jn(i),E=Zn(i),C=this.transformInv_(d),T=this.transformInv_(m),w=this.transformInv_(x),M=this.transformInv_(E),v=Wg+(a?Math.max(0,Math.ceil(Math.log2(Ds(i)/(a*a*256*256)))):0);if(this.addQuad_(d,m,x,E,C,T,w,M,v),this.wrapsXInSource_){let I=1/0;this.triangles_.forEach(function(L,b,P){I=Math.min(I,L.source[0][0],L.source[1][0],L.source[2][0])}),this.triangles_.forEach(L=>{if(Math.max(L.source[0][0],L.source[1][0],L.source[2][0])-I>this.sourceWorldWidth_/2){let b=[[L.source[0][0],L.source[0][1]],[L.source[1][0],L.source[1][1]],[L.source[2][0],L.source[2][1]]];b[0][0]-I>this.sourceWorldWidth_/2&&(b[0][0]-=this.sourceWorldWidth_),b[1][0]-I>this.sourceWorldWidth_/2&&(b[1][0]-=this.sourceWorldWidth_),b[2][0]-I>this.sourceWorldWidth_/2&&(b[2][0]-=this.sourceWorldWidth_);let P=Math.min(b[0][0],b[1][0],b[2][0]);Math.max(b[0][0],b[1][0],b[2][0])-P.5&&x<1,T=!1;if(d>0){if(this.targetProj_.isGlobal()&&this.targetWorldWidth_){let M=na([t,e,i,n]);T=gt(M)/this.targetWorldWidth_>Qd||T}!C&&this.sourceProj_.isGlobal()&&x&&(T=x>Qd||T)}if(!T&&this.maxSourceExtent_&&isFinite(m[0])&&isFinite(m[1])&&isFinite(m[2])&&isFinite(m[3])&&!Ft(m,this.maxSourceExtent_))return;let w=0;if(!T&&(!isFinite(o[0])||!isFinite(o[1])||!isFinite(a[0])||!isFinite(a[1])||!isFinite(l[0])||!isFinite(l[1])||!isFinite(u[0])||!isFinite(u[1]))){if(d>0)T=!0;else if(w=(!isFinite(o[0])||!isFinite(o[1])?8:0)+(!isFinite(a[0])||!isFinite(a[1])?4:0)+(!isFinite(l[0])||!isFinite(l[1])?2:0)+(!isFinite(u[0])||!isFinite(u[1])?1:0),w!=1&&w!=2&&w!=4&&w!=8)return}if(d>0){if(!T){let M=[(t[0]+i[0])/2,(t[1]+i[1])/2],v=this.transformInv_(M),I;C?I=(Ae(o[0],E)+Ae(l[0],E))/2-Ae(v[0],E):I=(o[0]+l[0])/2-v[0];let L=(o[1]+l[1])/2-v[1];T=I*I+L*L>this.errorThresholdSquared_}if(T){if(Math.abs(t[0]-i[0])<=Math.abs(t[1]-i[1])){let M=[(e[0]+i[0])/2,(e[1]+i[1])/2],v=this.transformInv_(M),I=[(n[0]+t[0])/2,(n[1]+t[1])/2],L=this.transformInv_(I);this.addQuad_(t,e,M,I,o,a,v,L,d-1),this.addQuad_(I,M,i,n,L,v,l,u,d-1)}else{let M=[(t[0]+e[0])/2,(t[1]+e[1])/2],v=this.transformInv_(M),I=[(i[0]+n[0])/2,(i[1]+n[1])/2],L=this.transformInv_(I);this.addQuad_(t,M,I,n,o,v,L,u,d-1),this.addQuad_(M,e,i,I,v,a,l,L,d-1)}return}}if(C){if(!this.canWrapXInSource_)return;this.wrapsXInSource_=!0}(w&11)==0&&this.addTriangle_(t,i,n,o,l,u),(w&14)==0&&this.addTriangle_(t,i,e,o,l,a),w&&((w&13)==0&&this.addTriangle_(e,n,t,a,u,o),(w&7)==0&&this.addTriangle_(e,n,i,a,u,l))}calculateSourceExtent(){let t=Ot();return this.triangles_.forEach(function(e,i,n){let o=e.source;gn(t,o[0]),gn(t,o[1]),gn(t,o[2])}),t}getTriangles(){return this.triangles_}},tf=vl;var Cl,Pn=[];function ef(s,t,e,i,n){s.beginPath(),s.moveTo(0,0),s.lineTo(t,e),s.lineTo(i,n),s.closePath(),s.save(),s.clip(),s.fillRect(0,0,Math.max(t,i)+1,Math.max(e,n)),s.restore()}function Sl(s,t){return Math.abs(s[t*4]-210)>2||Math.abs(s[t*4+3]-.75*255)>2}function jg(){if(Cl===void 0){let s=bt(6,6,Pn);s.globalCompositeOperation="lighter",s.fillStyle="rgba(210, 0, 0, 0.75)",ef(s,4,5,4,0),ef(s,4,5,0,5);let t=s.getImageData(0,0,3,3).data;Cl=Sl(t,0)||Sl(t,4)||Sl(t,8),Tn(s),Pn.push(s.canvas)}return Cl}function ko(s,t,e,i){let n=Mn(e,t,s),o=rs(t,i,e),a=t.getMetersPerUnit();a!==void 0&&(o*=a);let l=s.getMetersPerUnit();l!==void 0&&(o/=l);let u=s.getExtent();if(!u||qi(u,n)){let d=rs(s,o,n)/o;isFinite(d)&&d>0&&(o/=d)}return o}function nf(s,t,e,i){let n=ii(e),o=ko(s,t,n,i);return(!isFinite(o)||o<=0)&&Ur(e,function(a){return o=ko(s,t,a,i),isFinite(o)&&o>0}),o}function sf(s,t,e,i,n,o,a,l,u,d,m,x){let E=bt(Math.round(e*s),Math.round(e*t),Pn);if(x||(E.imageSmoothingEnabled=!1),u.length===0)return E.canvas;E.scale(e,e);function C(b){return Math.round(b*e)/e}E.globalCompositeOperation="lighter";let T=Ot();u.forEach(function(b,P,F){Br(T,b.extent)});let w=gt(T),M=se(T),v=bt(Math.round(e*w/i),Math.round(e*M/i),Pn);x||(v.imageSmoothingEnabled=!1);let I=e/i;u.forEach(function(b,P,F){let N=b.extent[0]-T[0],G=-(b.extent[3]-T[3]),W=gt(b.extent),Y=se(b.extent);b.image.width>0&&b.image.height>0&&v.drawImage(b.image,d,d,b.image.width-2*d,b.image.height-2*d,N*I,G*I,W*I,Y*I)});let L=Le(a);return l.getTriangles().forEach(function(b,P,F){let N=b.source,G=b.target,W=N[0][0],Y=N[0][1],Z=N[1][0],it=N[1][1],rt=N[2][0],Ct=N[2][1],tt=C((G[0][0]-L[0])/o),q=C(-(G[0][1]-L[1])/o),K=C((G[1][0]-L[0])/o),V=C(-(G[1][1]-L[1])/o),dt=C((G[2][0]-L[0])/o),ht=C(-(G[2][1]-L[1])/o),Lt=W,B=Y;W=0,Y=0,Z-=Lt,it-=B,rt-=Lt,Ct-=B;let ae=[[Z,it,0,0,K-tt],[rt,Ct,0,0,dt-tt],[0,0,Z,it,V-q],[0,0,rt,Ct,ht-q]],_t=Sc(ae);if(!!_t){if(E.save(),E.beginPath(),jg()||!x){E.moveTo(K,V);let Mt=4,Je=tt-K,he=q-V;for(let Dt=0;Dt{e&&e.getState()==$.LOADED&&t.push({extent:this.sourceTileGrid_.getTileCoordExtent(e.tileCoord),image:e.getImage()})}),this.sourceTiles_.length=0,t.length===0)this.state=$.ERROR;else{let e=this.wrappedTileCoord_[0],i=this.targetTileGrid_.getTileSize(e),n=typeof i=="number"?i:i[0],o=typeof i=="number"?i:i[1],a=this.targetTileGrid_.getResolution(e),l=this.sourceTileGrid_.getResolution(this.sourceZ_),u=this.targetTileGrid_.getTileCoordExtent(this.wrappedTileCoord_);this.canvas_=sf(n,o,this.pixelRatio_,l,this.sourceTileGrid_.getExtent(),a,u,this.triangulation_,t,this.gutter_,this.renderEdges_,this.interpolate),this.state=$.LOADED}this.changed()}load(){if(this.state==$.IDLE){this.state=$.LOADING,this.changed();let t=0;this.sourcesListenerKeys_=[],this.sourceTiles_.forEach(e=>{let i=e.getState();if(i==$.IDLE||i==$.LOADING){t++;let n=st(e,H.CHANGE,function(o){let a=e.getState();(a==$.LOADED||a==$.ERROR||a==$.EMPTY)&&(ut(n),t--,t===0&&(this.unlistenSources_(),this.reproject_()))},this);this.sourcesListenerKeys_.push(n)}}),t===0?setTimeout(this.reproject_.bind(this),0):this.sourceTiles_.forEach(function(e,i,n){e.getState()==$.IDLE&&e.load()})}}unlistenSources_(){this.sourcesListenerKeys_.forEach(ut),this.sourcesListenerKeys_=null}release(){this.canvas_&&(Tn(this.canvas_.getContext("2d")),Pn.push(this.canvas_),this.canvas_=null),super.release()}},yr=Tl;var Rl=class extends Lo{constructor(t){super(t),this.extentChanged=!0,this.renderedExtent_=null,this.renderedPixelRatio,this.renderedProjection=null,this.renderedRevision,this.renderedTiles=[],this.newTiles_=!1,this.tmpExtent=Ot(),this.tmpTileRange_=new _o(0,0,0,0)}isDrawableTile(t){let e=this.getLayer(),i=t.getState(),n=e.getUseInterimTilesOnError();return i==$.LOADED||i==$.EMPTY||i==$.ERROR&&!n}getTile(t,e,i,n){let o=n.pixelRatio,a=n.viewState.projection,l=this.getLayer(),d=l.getSource().getTile(t,e,i,o,a);return d.getState()==$.ERROR&&l.getUseInterimTilesOnError()&&l.getPreload()>0&&(this.newTiles_=!0),this.isDrawableTile(d)||(d=d.getInterimTile()),d}getData(t){let e=this.frameState;if(!e)return null;let i=this.getLayer(),n=Pt(e.pixelToCoordinateTransform,t.slice()),o=i.getExtent();if(o&&!qi(o,n))return null;let a=e.pixelRatio,l=e.viewState.projection,u=e.viewState,d=i.getRenderSource(),m=d.getTileGridForProjection(u.projection),x=d.getTilePixelRatio(e.pixelRatio);for(let E=m.getZForResolution(u.resolution);E>=m.getMinZoom();--E){let C=m.getTileCoordForCoordAndZ(n,E),T=d.getTile(E,C[1],C[2],a,l);if(!(T instanceof Fo||T instanceof yr)||T instanceof yr&&T.getState()===$.EMPTY)return null;if(T.getState()!==$.LOADED)continue;let w=m.getOrigin(E),M=zt(m.getTileSize(E)),v=m.getResolution(E),I=Math.floor(x*((n[0]-w[0])/v-C[1]*M[0])),L=Math.floor(x*((w[1]-n[1])/v-C[2]*M[1])),b=Math.round(x*d.getGutterForProjection(u.projection));return this.getImageData(T.getImage(),I+b,L+b)}return null}loadedTileCallback(t,e,i){return this.isDrawableTile(i)?super.loadedTileCallback(t,e,i):!1}prepareFrame(t){return!!this.getLayer().getSource()}renderFrame(t,e){let i=t.layerStatesArray[t.layerIndex],n=t.viewState,o=n.projection,a=n.resolution,l=n.center,u=n.rotation,d=t.pixelRatio,m=this.getLayer(),x=m.getSource(),E=x.getRevision(),C=x.getTileGridForProjection(o),T=C.getZForResolution(a,x.zDirection),w=C.getResolution(T),M=t.extent,v=t.viewState.resolution,I=x.getTilePixelRatio(d),L=Math.round(gt(M)/v*d),b=Math.round(se(M)/v*d),P=i.extent&&Ke(i.extent,o);P&&(M=Vi(M,Ke(i.extent,o)));let F=w*L/2/I,N=w*b/2/I,G=[l[0]-F,l[1]-N,l[0]+F,l[1]+N],W=C.getTileRangeForExtentAndZ(M,T),Y={};Y[T]={};let Z=this.createLoadedTileFinder(x,o,Y),it=this.tmpExtent,rt=this.tmpTileRange_;this.newTiles_=!1;let Ct=u?Wr(n.center,v,u,t.size):void 0;for(let ae=W.minX;ae<=W.maxX;++ae)for(let _t=W.minY;_t<=W.maxY;++_t){if(u&&!C.tileCoordIntersectsViewport([T,ae,_t],Ct))continue;let Mt=this.getTile(T,ae,_t,t);if(this.isDrawableTile(Mt)){let Dt=lt(this);if(Mt.getState()==$.LOADED){Y[T][Mt.tileCoord.toString()]=Mt;let Ie=Mt.inTransition(Dt);Ie&&i.opacity!==1&&(Mt.endTransition(Dt),Ie=!1),!this.newTiles_&&(Ie||!this.renderedTiles.includes(Mt))&&(this.newTiles_=!0)}if(Mt.getAlpha(Dt,t.time)===1)continue}let Je=C.getTileCoordChildTileRange(Mt.tileCoord,rt,it),he=!1;Je&&(he=Z(T+1,Je)),he||C.forEachTileCoordParentTileRange(Mt.tileCoord,Z,rt,it)}let tt=w/a*d/I;ue(this.pixelTransform,t.size[0]/2,t.size[1]/2,1/d,1/d,u,-L/2,-b/2);let q=Nr(this.pixelTransform);this.useContainer(e,q,this.getBackground(t));let K=this.context,V=K.canvas;Hn(this.inversePixelTransform,this.pixelTransform),ue(this.tempTransform,L/2,b/2,tt,tt,0,-L/2,-b/2),V.width!=L||V.height!=b?(V.width=L,V.height=b):this.containerReused||K.clearRect(0,0,L,b),P&&this.clipUnrotated(K,t,P),x.getInterpolate()||(K.imageSmoothingEnabled=!1),this.preRender(K,t),this.renderedTiles.length=0;let dt=Object.keys(Y).map(Number);dt.sort(ti);let ht,Lt,B;i.opacity===1&&(!this.containerReused||x.getOpaque(t.viewState.projection))?dt=dt.reverse():(ht=[],Lt=[]);for(let ae=dt.length-1;ae>=0;--ae){let _t=dt[ae],Mt=x.getTilePixelSize(_t,d,o),he=C.getResolution(_t)/w,Dt=Mt[0]*he*tt,Ie=Mt[1]*he*tt,Bt=C.getTileCoordForCoordAndZ(Le(G),_t),an=C.getTileCoordExtent(Bt),fi=Pt(this.tempTransform,[I*(an[0]-G[0])/w,I*(G[3]-an[3])/w]),Di=I*x.getGutterForProjection(o),Ne=Y[_t];for(let hn in Ne){let we=Ne[hn],On=we.tileCoord,Fn=Bt[1]-On[1],kn=Math.round(fi[0]-(Fn-1)*Dt),mi=Bt[2]-On[2],Ss=Math.round(fi[1]-(mi-1)*Ie),Qt=Math.round(fi[0]-Fn*Dt),me=Math.round(fi[1]-mi*Ie),ve=kn-Qt,De=Ss-me,Ce=T===_t,gi=Ce&&we.getAlpha(lt(this),t.time)!==1,$e=!1;if(!gi)if(ht){B=[Qt,me,Qt+ve,me,Qt+ve,me+De,Qt,me+De];for(let Gi=0,pi=ht.length;Gi0&&this.getCount()>this.highWaterMark}expireCache(t){for(;this.canExpireCache();)this.pop()}clear(){this.count_=0,this.entries_={},this.oldest_=null,this.newest_=null}containsKey(t){return this.entries_.hasOwnProperty(t)}forEach(t){let e=this.oldest_;for(;e;)t(e.value_,e.key_,this),e=e.newer}get(t,e){let i=this.entries_[t];return Q(i!==void 0,15),i===this.newest_||(i===this.oldest_?(this.oldest_=this.oldest_.newer,this.oldest_.older=null):(i.newer.older=i.older,i.older.newer=i.newer),i.newer=null,i.older=this.newest_,this.newest_.newer=i,this.newest_=i),i.value_}remove(t){let e=this.entries_[t];return Q(e!==void 0,15),e===this.newest_?(this.newest_=e.older,this.newest_&&(this.newest_.newer=null)):e===this.oldest_?(this.oldest_=e.newer,this.oldest_&&(this.oldest_.older=null)):(e.newer.older=e.older,e.older.newer=e.newer),delete this.entries_[t],--this.count_,e.value_}getCount(){return this.count_}getKeys(){let t=new Array(this.count_),e=0,i;for(i=this.newest_;i;i=i.older)t[e++]=i.key_;return t}getValues(){let t=new Array(this.count_),e=0,i;for(i=this.newest_;i;i=i.older)t[e++]=i.value_;return t}peekLast(){return this.oldest_.value_}peekLastKey(){return this.oldest_.key_}peekFirstKey(){return this.newest_.key_}peek(t){if(!!this.containsKey(t))return this.entries_[t].value_}pop(){let t=this.oldest_;return delete this.entries_[t.key_],t.newer&&(t.newer.older=null),this.oldest_=t.newer,this.oldest_||(this.newest_=null),--this.count_,t.value_}replace(t,e){this.get(t),this.entries_[t].value_=e}set(t,e){Q(!(t in this.entries_),16);let i={key_:t,newer:null,older:this.newest_,value_:e};this.newest_?this.newest_.newer=i:this.oldest_=i,this.newest_=i,this.entries_[t]=i,++this.count_}setSize(t){this.highWaterMark=t}},af=wl;var bl=class extends af{clear(){for(;this.getCount()>0;)this.pop().release();super.clear()}expireCache(t){for(;this.canExpireCache()&&!(this.peekLast().getKey()in t);)this.pop().release()}pruneExceptNewestZ(){if(this.getCount()===0)return;let t=this.peekFirstKey(),i=td(t)[0];this.forEach(n=>{n.tileCoord[0]!==i&&(this.remove(yo(n.tileCoord)),n.release())})}},No=bl;var Do={TILELOADSTART:"tileloadstart",TILELOADEND:"tileloadend",TILELOADERROR:"tileloaderror"};function Go(s){let t=s.getDefaultTileGrid();return t||(t=Kg(s),s.setDefaultTileGrid(t)),t}function hf(s,t,e){let i=t[0],n=s.getTileCoordCenter(t),o=lf(e);if(!qi(o,n)){let a=gt(o),l=Math.ceil((o[0]-n[0])/a);return n[0]+=a*l,s.getTileCoordForCoordAndZ(n,i)}return t}function Xg(s,t,e,i){i=i!==void 0?i:"top-left";let n=Yg(s,t,e);return new Eo({extent:s,origin:yc(s,i),resolutions:n,tileSize:e})}function Yg(s,t,e,i){t=t!==void 0?t:42,e=zt(e!==void 0?e:256);let n=se(s),o=gt(s);i=i>0?i:Math.max(o/e[0],n/e[1]);let a=t+1,l=new Array(a);for(let u=0;ui.highWaterMark&&(i.highWaterMark=t)}useTile(t,e,i,n){}},zo=class extends Jt{constructor(t,e){super(t),this.tile=e}},cf=Ll;function qg(s,t){let e=/\{z\}/g,i=/\{x\}/g,n=/\{y\}/g,o=/\{-y\}/g;return function(a,l,u){if(!!a)return s.replace(e,a[0].toString()).replace(i,a[1].toString()).replace(n,a[2].toString()).replace(o,function(){let d=a[0],m=t.getFullTileRange(d);return Q(m,55),(m.getHeight()-a[2]-1).toString()})}}function uf(s,t){let e=s.length,i=new Array(e);for(let n=0;nthis.getTileInternal(M,v,I,L,a),this.reprojectionErrorThreshold_,this.renderReprojectionEdges_,this.getInterpolate());return w.key=x,d?(w.interimTile=d,w.refreshInterimChain(),l.replace(m,w)):l.set(m,w),w}getTileInternal(t,e,i,n,o){let a=null,l=Ln(t,e,i),u=this.getKey();if(!this.tileCache.containsKey(l))a=this.createTile_(t,e,i,n,o,u),this.tileCache.set(l,a);else if(a=this.tileCache.get(l),a.key!=u){let d=a;a=this.createTile_(t,e,i,n,o,u),d.getState()==$.IDLE?a.interimTile=d.interimTile:a.interimTile=d,a.refreshInterimChain(),this.tileCache.replace(l,a)}return a}setRenderReprojectionEdges(t){if(this.renderReprojectionEdges_!=t){this.renderReprojectionEdges_=t;for(let e in this.tileCacheForProjection)this.tileCacheForProjection[e].clear();this.changed()}}setTileGridForProjection(t,e){let i=Tt(t);if(i){let n=lt(i);n in this.tileGridForProjection||(this.tileGridForProjection[n]=e)}}clear(){super.clear();for(let t in this.tileCacheForProjection)this.tileCacheForProjection[t].clear()}};function Vg(s,t){s.getImage().src=t}var Wo=Al;function Ms(s,t){let e=[];Object.keys(t).forEach(function(n){t[n]!==null&&t[n]!==void 0&&e.push(n+"="+encodeURIComponent(t[n]))});let i=e.join("&");return s=s.replace(/[?&]$/,""),s+=s.includes("?")?"&":"?",s+i}var Pl=class extends Wo{constructor(t){let e=t.requestEncoding!==void 0?t.requestEncoding:"KVP",i=t.tileGrid,n=t.urls;n===void 0&&t.url!==void 0&&(n=Uo(t.url)),super({attributions:t.attributions,attributionsCollapsible:t.attributionsCollapsible,cacheSize:t.cacheSize,crossOrigin:t.crossOrigin,interpolate:t.interpolate,projection:t.projection,reprojectionErrorThreshold:t.reprojectionErrorThreshold,tileClass:t.tileClass,tileGrid:i,tileLoadFunction:t.tileLoadFunction,tilePixelRatio:t.tilePixelRatio,urls:n,wrapX:t.wrapX!==void 0?t.wrapX:!1,transition:t.transition,zDirection:t.zDirection}),this.version_=t.version!==void 0?t.version:"1.0.0",this.format_=t.format!==void 0?t.format:"image/jpeg",this.dimensions_=t.dimensions!==void 0?t.dimensions:{},this.layer_=t.layer,this.matrixSet_=t.matrixSet,this.style_=t.style,this.requestEncoding_=e,this.setKey(this.getKeyForDimensions_()),n&&n.length>0&&(this.tileUrlFunction=Bo(n.map(this.createFromWMTSTemplate.bind(this))))}setUrls(t){this.urls=t;let e=t.join(` -`);this.setTileUrlFunction(Bo(t.map(this.createFromWMTSTemplate.bind(this))),e)}getDimensions(){return this.dimensions_}getFormat(){return this.format_}getLayer(){return this.layer_}getMatrixSet(){return this.matrixSet_}getRequestEncoding(){return this.requestEncoding_}getStyle(){return this.style_}getVersion(){return this.version_}getKeyForDimensions_(){let t=this.urls?this.urls.slice(0):[];for(let e in this.dimensions_)t.push(e+"-"+this.dimensions_[e]);return t.join("/")}updateDimensions(t){Object.assign(this.dimensions_,t),this.setKey(this.getKeyForDimensions_())}createFromWMTSTemplate(t){let e=this.requestEncoding_,i={layer:this.layer_,style:this.style_,tilematrixset:this.matrixSet_};e=="KVP"&&Object.assign(i,{Service:"WMTS",Request:"GetTile",Version:this.version_,Format:this.format_}),t=e=="KVP"?Ms(t,i):t.replace(/\{(\w+?)\}/g,function(a,l){return l.toLowerCase()in i?i[l.toLowerCase()]:a});let n=this.tileGrid,o=this.dimensions_;return function(a,l,u){if(!a)return;let d={TileMatrix:n.getMatrixId(a[0]),TileCol:a[1],TileRow:a[2]};Object.assign(d,o);let m=t;return e=="KVP"?m=Ms(m,d):m=m.replace(/\{(\w+?)\}/g,function(x,E){return d[E]}),m}}},ff=Pl;var Er="1.3.0";var Ol=class extends Wo{constructor(t){t=t||{};let e=Object.assign({},t.params),i="TRANSPARENT"in e?e.TRANSPARENT:!0;super({attributions:t.attributions,attributionsCollapsible:t.attributionsCollapsible,cacheSize:t.cacheSize,crossOrigin:t.crossOrigin,interpolate:t.interpolate,opaque:!i,projection:t.projection,reprojectionErrorThreshold:t.reprojectionErrorThreshold,tileClass:t.tileClass,tileGrid:t.tileGrid,tileLoadFunction:t.tileLoadFunction,url:t.url,urls:t.urls,wrapX:t.wrapX!==void 0?t.wrapX:!0,transition:t.transition,zDirection:t.zDirection}),this.gutter_=t.gutter!==void 0?t.gutter:0,this.params_=e,this.v13_=!0,this.serverType_=t.serverType,this.hidpi_=t.hidpi!==void 0?t.hidpi:!0,this.tmpExtent_=Ot(),this.updateV13_(),this.setKey(this.getKeyForParams_())}getFeatureInfoUrl(t,e,i,n){let o=Tt(i),a=this.getProjection(),l=this.getTileGrid();l||(l=this.getTileGridForProjection(o));let u=l.getZForResolution(e,this.zDirection),d=l.getTileCoordForCoordAndZ(t,u);if(l.getResolutions().length<=d[0])return;let m=l.getResolution(d[0]),x=l.getTileCoordExtent(d,this.tmpExtent_),E=zt(l.getTileSize(d[0]),this.tmpSize),C=this.gutter_;C!==0&&(E=vh(E,C,this.tmpSize),x=Ci(x,m*C,x)),a&&a!==o&&(m=ko(a,o,t,m),x=js(x,o,a),t=Mn(t,o,a));let T={SERVICE:"WMS",VERSION:Er,REQUEST:"GetFeatureInfo",FORMAT:"image/png",TRANSPARENT:!0,QUERY_LAYERS:this.params_.LAYERS};Object.assign(T,this.params_,n);let w=Math.floor((t[0]-x[0])/m),M=Math.floor((x[3]-t[1])/m);return T[this.v13_?"I":"X"]=w,T[this.v13_?"J":"Y"]=M,this.getRequestUrl_(d,E,x,1,a||o,T)}getLegendUrl(t,e){if(this.urls[0]===void 0)return;let i={SERVICE:"WMS",VERSION:Er,REQUEST:"GetLegendGraphic",FORMAT:"image/png"};if(e===void 0||e.LAYER===void 0){let n=this.params_.LAYERS;if(!(!Array.isArray(n)||n.length===1))return;i.LAYER=n}if(t!==void 0){let n=this.getProjection()?this.getProjection().getMetersPerUnit():1,o=28e-5;i.SCALE=t*n/o}return Object.assign(i,e),Ms(this.urls[0],i)}getGutter(){return this.gutter_}getParams(){return this.params_}getRequestUrl_(t,e,i,n,o,a){let l=this.urls;if(!l)return;if(a.WIDTH=e[0],a.HEIGHT=e[1],a[this.v13_?"CRS":"SRS"]=o.getCode(),"STYLES"in this.params_||(a.STYLES=""),n!=1)switch(this.serverType_){case"geoserver":let x=90*n+.5|0;"FORMAT_OPTIONS"in a?a.FORMAT_OPTIONS+=";dpi:"+x:a.FORMAT_OPTIONS="dpi:"+x;break;case"mapserver":a.MAP_RESOLUTION=90*n;break;case"carmentaserver":case"qgis":a.DPI=90*n;break;default:Q(!1,52);break}let u=o.getAxisOrientation(),d=i;if(this.v13_&&u.substr(0,2)=="ne"){let x;x=i[0],d[0]=i[1],d[1]=x,x=i[2],d[2]=i[3],d[3]=x}a.BBOX=d.join(",");let m;if(l.length==1)m=l[0];else{let x=Ae(xo(t),l.length);m=l[x]}return Ms(m,a)}getTilePixelRatio(t){return!this.hidpi_||this.serverType_===void 0?1:t}getKeyForParams_(){let t=0,e=[];for(let i in this.params_)e[t++]=i+"-"+this.params_[i];return e.join("/")}updateParams(t){Object.assign(this.params_,t),this.updateV13_(),this.setKey(this.getKeyForParams_())}updateV13_(){let t=this.params_.VERSION||Er;this.v13_=Pc(t,"1.3")>=0}tileUrlFunction(t,e,i){let n=this.getTileGrid();if(n||(n=this.getTileGridForProjection(i)),n.getResolutions().length<=t[0])return;e!=1&&(!this.hidpi_||this.serverType_===void 0)&&(e=1);let o=n.getResolution(t[0]),a=n.getTileCoordExtent(t,this.tmpExtent_),l=zt(n.getTileSize(t[0]),this.tmpSize),u=this.gutter_;u!==0&&(l=vh(l,u,this.tmpSize),a=Ci(a,o*u,a)),e!=1&&(l=go(l,e,this.tmpSize));let d={SERVICE:"WMS",VERSION:Er,REQUEST:"GetMap",FORMAT:"image/png",TRANSPARENT:!0};return Object.assign(d,this.params_),this.getRequestUrl_(t,l,a,e,i,d)}},mf=Ol;var Fl=[10.61010906,56.15950977],vs=[12e4,59e5,1e6,65e5],jo=[1638.4,819.2,409.6,204.8,102.4,51.2,25.6,12.8,6.4,3.2,1.6,.8,.4,.2],gf=["00","01","02","03","04","05","06","07","08","09","10","11","12","13"],pf=[256,256];var Hg=function(){return navigator.userAgent.match(/Android/i)&&navigator.userAgent.match(/Mobile/i)},Zg=function(){return navigator.userAgent.match(/BlackBerry/i)},Jg=function(){return navigator.userAgent.match(/iPhone|iPod/i)},$g=function(){return navigator.userAgent.match(/Opera Mini/i)},Qg=function(){return navigator.userAgent.match(/IEMobile/i)},_f=function(){return Hg()||Zg()||Jg()||$g()||Qg()};var xf=_f()?"SDFI":"Styrelsen for Dataforsyning og Infrastruktur",tp="https://download.dataforsyningen.dk/content/vilk%C3%A5r-og-betingelser",ep='© '+xf+"",ip="https://datafordeler.dk/vejledning/brugervilkaar/sdfi-geografiske-data/",np='© '+xf+"",yf=function(s,t){return t.source==="kf"?"https://api.dataforsyningen.dk/"+s+"?token="+t.token:t.source==="df"?"https://services.datafordeler.dk/"+s+"?username="+t.username+"&password="+t.password:(console.error('Unknown source: "'+t.source+'"'),null)},Ze=function(s){let t=s.name||"",e=s.type||"",i=s.title||t,n="white",o=!!s.visible,a=s.auth,l=s.service||"",u=s.layer||"",d=s.style||"default",m=s.version||"1.1.1",x=s.matrixSet,E=s.format||"",C=s.tileGrid,T=s.auth.source==="kf"?ep:s.auth.source==="df"?np:s.attribution,w=null;if(e==="WMTS")w=new ff({attributions:T,crossOrigin:"Anonymous",url:yf(l,a),layer:u,matrixSet:x,format:E,tileGrid:C,style:d,size:pf});else if(e==="WMS")w=new mf({attributions:T,crossOrigin:"Anonymous",url:yf(l,a),params:{LAYERS:u,VERSION:m,TRANSPARENT:"true",FORMAT:E,STYLES:d}});else return console.error('Unknown service type: "'+e+'"'),null;return new of({opacity:1,title:i,name:t,color:n,type:"base",visible:o,source:w,preload:1/0})};function kl(s,t){let e=document.getElementById(s.target),i=document.createElement("div"),n=document.createElement("a"),o=document.createElement("div"),a=document.createElement("div"),l=document.createElement("div");a.className="title",l.className="description",i.className="ol-popup",e.appendChild(i),t?(i.appendChild(t),n=t.getElementsByClassName("closer")[0]):(n.className="ol-popup-closer",o.className="ol-popup-content",i.appendChild(n),i.appendChild(o),o.appendChild(a),o.appendChild(l)),s.olMap.getOverlays().clear();let u=new ld({element:i,autoPan:!0,autoPanAnimation:{duration:250}});s.olMap.addOverlay(u),n&&(n.onclick=function(){return u.setPosition(void 0),n.blur(),!1}),s.olMap.on("singleclick",function(d){let m=s.olMap.forEachFeatureAtPixel(d.pixel,function(x){return x});!m||(t?t.childNodes.forEach(function(x){let E=m.get(x.className);E&&(x.innerHTML=E)}):(a.innerHTML=m.get("title")||"",l.innerHTML=m.get("description")||""),u.setPosition(m.getGeometry().getCoordinates()))}),s.olMap.on("pointermove",function(d){s.olMap.getTargetElement().style.cursor=s.olMap.hasFeatureAtPixel(d.pixel)?"pointer":""})}var Cs=class{markers=[];icons={};markerLayerGroup;markerLayers;popup;showPopup;set markers(t){this.setMarkers(t)}constructor(t){this.icons=t.icons||{};let e=t.background||"",i=typeof t.zoomSlider>"u"?!0:t.zoomSlider,n=typeof t.scaleLine>"u"?!0:t.scaleLine,o=t.layerSwitcher||!1,a=typeof t.myLocation>"u"?!0:t.myLocation,l=t.view,u=l&&l.center==="auto",d=l&&typeof l.center!="string"?l.center||Fl:Fl,m=l&&l.zoom==="auto",x=typeof t.mouseWheelZoom>"u"?!0:t.mouseWheelZoom,E=t.extent||!1;this.zoom=l&&l.zoom||2;let C=typeof t.fullScreen>"u"?!0:t.fullScreen;this.popup=t.popup||null,this.showPopup=typeof t.showPopup>"u"?!0:t.showPopup,this._target=t.target||"map",this._source=t.source||"kf",this._token=t.token||"",this._username=t.username||"",this._password=t.password||"",this.autocenter=u,this.autoZoom=m,Nl.default.defs("EPSG:25832","+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs"),nd(Nl.default);let T=Tt("EPSG:25832");T.setExtent(vs);let w=new Mo({extent:vs,resolutions:jo,matrixIds:gf}),M=new Mo({extent:vs,resolutions:jo,matrixIds:["L00","L01","L02","L03","L04","L05","L06","L07","L08","L09","L10","L11","L12","L13"]}),v=new Mo({extent:vs,resolutions:jo,matrixIds:["00","01","02","03","04","05","06","07","08","09","10","11","12","13"]}),I={source:"kf",token:this._token},L={source:"df",username:this._username,password:this._password},b=[];this._username&&this._password?(b.push(Ze({name:"dtk_skaermkort",type:"WMTS",title:"Sk\xE6rmkort",visible:e==="dtk_skaermkort",service:"DKskaermkort/topo_skaermkort_wmts/1.0.0/Wmts",layer:"topo_skaermkort",matrixSet:"View1",format:"image/jpeg",tileGrid:v,auth:L})),b.push(Ze({name:"dtk_skaermkort_daempet",type:"WMTS",title:"Sk\xE6rmkort d\xE6mpet",visible:e!=="orto_foraar"&&e!=="forvaltning"&&e!=="dtk_skaermkort",service:"DKskaermkort/topo_skaermkort_daempet/1.0.0/Wmts",layer:"topo_skaermkort_daempet",matrixSet:"View1",format:"image/jpeg",tileGrid:v,auth:L})),b.push(Ze({name:"orto_foraar",type:"WMTS",title:"Ortofoto",color:"white",visible:e==="orto_foraar",service:"GeoDanmarkOrto/orto_foraar_wmts/1.0.0/Wmts",layer:"orto_foraar_wmts",matrixSet:"KortforsyningTilingDK",format:"image/jpeg",tileGrid:v,auth:L}))):this._token&&(b.push(Ze({name:"dtk_skaermkort",type:"WMTS",title:"Sk\xE6rmkort",visible:e==="dtk_skaermkort",service:"topo_skaermkort_wmts_DAF",layer:"topo_skaermkort",matrixSet:"View1",format:"image/jpeg",tileGrid:w,auth:I})),b.push(Ze({name:"dtk_skaermkort_daempet",type:"WMTS",title:"Sk\xE6rmkort d\xE6mpet",visible:e!=="orto_foraar"&&e!=="forvaltning"&&e!=="dtk_skaermkort",service:"topo_skaermkort_daempet_DAF",layer:"topo_skaermkort_daempet",matrixSet:"View1",format:"image/jpeg",tileGrid:w,auth:I})),b.push(Ze({name:"orto_foraar",type:"WMTS",title:"Ortofoto",color:"white",visible:e==="orto_foraar",service:"orto_foraar_wmts_DAF",layer:"orto_foraar_wmts",matrixSet:"KortforsyningTilingDK",format:"image/jpeg",tileGrid:w,auth:I}))),this._token&&(b.push(Ze({name:"forvaltning",type:"WMS",title:"Basiskort",visible:e==="forvaltning",service:"forvaltning2",layer:"basis_kort",format:"image/png",auth:I})),b.push(Ze({name:"kommunikation",type:"WMS",title:"Kommunikation",visible:e==="kommunikation",service:"kommunikation",layer:"Kommunikationskort",format:"image/png",auth:I})),b.push(Ze({name:"natur_friluftskort",type:"WMTS",title:"Natur og Friluftskort",visible:e==="natur_friluftskort",service:"natur_friluftskort",layer:"nfkort",matrixSet:"View1",format:"image/jpeg",tileGrid:M,auth:I})));let P=[];t.overlays&&t.overlays.forEach(function(F){F.source==="kf"?(F.auth=I,F.tileGrid=w):F.source==="df"&&(F.auth=L,F.tileGrid=v),P.push(Ze(F))}),this._map=new Qu({target:this._target,layers:[new oi({title:"Base maps",layers:b}),new oi({title:"Kort",layers:P}),new oi({title:"Hidden",layers:[]})],controls:Js({attribution:!1,zoom:i}),interactions:mo({mouseWheelZoom:x}),view:new Re({center:xn(d,"EPSG:25832"),zoom:this.zoom,resolutions:w.getResolutions(),projection:T,extent:E||vs})}),this._map.addControl(new Zs({collapsible:!1})),n&&this._map.addControl(new kh),i&&this._map.addControl(new Dh),C&&this._map.addControl(new Ah),a&&this._map.addControl(new pr({zoomSlider:i})),this._layerSwitcher=new An({visible:o}),this._map.addControl(this._layerSwitcher),this.setMarkers(t.markers),this._map.on("click",function(F){document.activeElement.blur()}),i&&this.adjustControlsCss(),this._map.on("change:size",()=>{this.adjustControlsCss()})}async setMarkers(t){!t||(this.markerLayers=await Jd(t,this.icons,this),this._map.removeLayer(this.markerLayerGroup),this.markerLayerGroup=new oi({layers:this.markerLayers}),this._map.addLayer(this.markerLayerGroup),this.autoCenter(),this.showPopup&&kl(this,this.popup))}addVectorLayer(t,e,i){this._map.addLayer(new Es({name:i,visible:!1,source:t,style:e}))}getVectorLayer(t){return this._map.getLayers().getArray().find(function(e){return e.get("name")==="name"})}autoCenter(){if(!this.autocenter||!this.markerLayers[0])return;let t=Ot();this.markerLayers.forEach(function(e){Br(t,e.getSource().getExtent())}),t[0]!==1/0&&(this._map.getView().fit(t),this._map.getView().setZoom(Math.floor(this._map.getView().getZoom())),this.autoZoom||this._map.getView().setZoom(this.zoom),this._map.updateSize())}toggleBackground(t){this._layerSwitcher.toggleBackground(t)}toggleLayer(t,e){let i=this._map.getLayers().getArray(),n=i.find(function(a){return a.get("name")===t});if(n){n.setVisible(e);return}i.find(function(a){return a.get("title")==="Kort"}).get("layers").getArray().forEach(function(a,l,u){a.get("name")===t&&a.setVisible(e)})}adjustControlsCss(){let t=a=>Array.from(a).find(u=>!!u.closest("#"+this.target)),e=t(document.getElementsByClassName("ol-zoomslider")),i=t(document.getElementsByClassName("ol-zoom-out")),n=t(document.getElementsByClassName("ol-my-location")),o=document.getElementById(this.target).offsetHeight;if(o<300)e&&(e.style.display=Qr),n&&(n.style.bottom="97px");else if(i){let a=Math.floor(o*.25)+6+"px";i.style.marginTop=a}}addOnFeatureClickFunction(t){let e=this._map;e.on("singleclick",function(i){let n=e.forEachFeatureAtPixel(i.pixel,function(o){return o});t(n)})}get olMap(){return this._map}get target(){return this._target}};function Ef(){let s=document.querySelectorAll("span.geomarker"),t=[];return s.forEach(function(e){let i=e.dataset,n={};for(let o in i)o==="lat"||o==="lon"?n[o]=Number(i[o]):n[o]=i[o];t.push(n)}),t}function sp(s,t){let e=document.querySelectorAll("div.geomap"),i=[];return e.forEach(function(n){let o=n.dataset,a=typeof o.type>"u"?[""]:o.type.split(","),l=Mf(t,a),u=typeof o.overlays>"u"?[""]:o.overlays.split(","),d=s.overlays?s.overlays.filter(function(x){return x.name?x.name.indexOf(u)>-1:!0}):[],m=rp({element:n,filtered_overlays:d,filtered_markers:l,opt:s});i.push(m)}),i}function Mf(s,t){return s.filter(function(e){return e.type?e.type.indexOf(t)>-1:!0})}function rp(s){let t=s.element.dataset,e=t.centerLon?[Number(t.centerLon),Number(t.centerLat)]:"auto";return new Cs({target:s.element.id,token:t.token,username:t.username,password:t.password,background:t.background,icons:s.opt.icons,overlays:s.filtered_overlays,markers:s.filtered_markers,popup:s.opt.popup,showPopup:t.showPopup!=="false",zoomSlider:t.zoomslider==="true",mouseWheelZoom:t.mousewheelzoom!=="false",fullScreen:t.fullscreen==="true",myLocation:t.mylocation==="true",scaleLine:t.scaleline==="true",layerSwitcher:t.layerswitcher==="true",extent:t.extent?JSON.parse(t.extent):null,view:{center:t.center==="auto"?"auto":e,zoom:t.zoom}})}var Dl=class{maps=[];constructor(t){this.init(t)}init(t){this.maps=sp(t,Ef())}refresh(){let t=Ef();this.maps.forEach(function(e){let i=e.olMap.getTargetElement().dataset.type,n=typeof i>"u"?[""]:i.split(","),o=Mf(t,n);e.setMarkers(o)})}},op=Dl;export{op as Initialize,Cs as Map}; +`+T;oi.get(w)===void 0&&(oi.set(w,100,!0),l(m.style,m.weight,T)||(oi.set(w,0,!0),o===void 0&&(o=setInterval(u,32))))}}}(),sg=function(){let s;return function(t){let e=$a[t];if(e==null){if(Jn){let i=Za(t),n=Tu(t,"\u017Dg");e=(isNaN(Number(i.lineHeight))?1.2:Number(i.lineHeight))*(n.actualBoundingBoxAscent+n.actualBoundingBoxDescent)}else s||(s=document.createElement("div"),s.innerHTML="M",s.style.minHeight="0",s.style.maxHeight="none",s.style.height="auto",s.style.padding="0",s.style.border="none",s.style.position="absolute",s.style.display="block",s.style.left="-99999px"),s.style.font=t,document.body.appendChild(s),e=s.offsetHeight,document.body.removeChild(s);$a[t]=e}return e}}();function Tu(s,t){return gs||(gs=Lt(1,1)),s!=Ja&&(gs.font=s,Ja=gs.font),gs.measureText(t)}function go(s,t){return Tu(s,t).width}function Qa(s,t,e){if(t in e)return e[t];let i=t.split(` +`).reduce((n,o)=>Math.max(n,go(s,o)),0);return e[t]=i,i}function Ru(s,t){let e=[],i=[],n=[],o=0,a=0,l=0,u=0;for(let d=0,m=t.length;d<=m;d+=2){let x=t[d];if(x===` +`||d===m){o=Math.max(o,a),n.push(a),a=0,l+=u;continue}let E=t[d+1]||s.font,C=go(E,x);e.push(C),a+=C;let T=sg(E);i.push(T),u=Math.max(u,T)}return{width:o,height:l,widths:e,heights:i,lineWidths:n}}function Iu(s,t,e,i,n,o,a,l,u,d,m){s.save(),e!==1&&(s.globalAlpha*=e),t&&s.setTransform.apply(s,t),i.contextInstructions?(s.translate(u,d),s.scale(m[0],m[1]),rg(i,s)):m[0]<0||m[1]<0?(s.translate(u,d),s.scale(m[0],m[1]),s.drawImage(i,n,o,a,l,0,0,a,l)):s.drawImage(i,n,o,a,l,u,d,a*m[0],l*m[1]),s.restore()}function rg(s,t){let e=s.contextInstructions;for(let i=0,n=e.length;i=0;--i)e[i].renderDeclutter(t);e.length=0}},wu=th;var He=class extends Jt{constructor(t,e){super(t),this.layer=e}},eh={LAYERS:"layers"},Qs=class extends $r{constructor(t){t=t||{};let e=Object.assign({},t);delete e.layers;let i=t.layers;super(e),this.on,this.once,this.un,this.layersListenerKeys_=[],this.listenerKeys_={},this.addChangeListener(eh.LAYERS,this.handleLayersChanged_),i?Array.isArray(i)?i=new ce(i.slice(),{unique:!0}):$(typeof i.getArray=="function",43):i=new ce(void 0,{unique:!0}),this.setLayers(i)}handleLayerChange_(){this.changed()}handleLayersChanged_(){this.layersListenerKeys_.forEach(ut),this.layersListenerKeys_.length=0;let t=this.getLayers();this.layersListenerKeys_.push(st(t,$t.ADD,this.handleLayersAdd_,this),st(t,$t.REMOVE,this.handleLayersRemove_,this));for(let i in this.listenerKeys_)this.listenerKeys_[i].forEach(ut);si(this.listenerKeys_);let e=t.getArray();for(let i=0,n=e.length;i{this.clickTimeoutId_=void 0;let i=new li(It.SINGLECLICK,this.map_,t);this.dispatchEvent(i)},250)}updateActivePointers_(t){let e=t,i=e.pointerId;if(e.type==It.POINTERUP||e.type==It.POINTERCANCEL){delete this.trackedTouches_[i];for(let n in this.trackedTouches_)if(this.trackedTouches_[n].target!==e.target){delete this.trackedTouches_[n];break}}else(e.type==It.POINTERDOWN||e.type==It.POINTERMOVE)&&(this.trackedTouches_[i]=e);this.activePointers_=Object.values(this.trackedTouches_)}handlePointerUp_(t){this.updateActivePointers_(t);let e=new li(It.POINTERUP,this.map_,t,void 0,void 0,this.activePointers_);this.dispatchEvent(e),this.emulateClicks_&&!e.defaultPrevented&&!this.dragging_&&this.isMouseActionButton_(t)&&this.emulateClick_(this.down_),this.activePointers_.length===0&&(this.dragListenerKeys_.forEach(ut),this.dragListenerKeys_.length=0,this.dragging_=!1,this.down_=null)}isMouseActionButton_(t){return t.button===0}handlePointerDown_(t){this.emulateClicks_=this.activePointers_.length===0,this.updateActivePointers_(t);let e=new li(It.POINTERDOWN,this.map_,t,void 0,void 0,this.activePointers_);if(this.dispatchEvent(e),this.down_=new PointerEvent(t.type,t),Object.defineProperty(this.down_,"target",{writable:!1,value:t.target}),this.dragListenerKeys_.length===0){let i=this.map_.getOwnerDocument();this.dragListenerKeys_.push(st(i,It.POINTERMOVE,this.handlePointerMove_,this),st(i,It.POINTERUP,this.handlePointerUp_,this),st(this.element_,It.POINTERCANCEL,this.handlePointerUp_,this)),this.element_.getRootNode&&this.element_.getRootNode()!==i&&this.dragListenerKeys_.push(st(this.element_.getRootNode(),It.POINTERUP,this.handlePointerUp_,this))}}handlePointerMove_(t){if(this.isMoving_(t)){this.updateActivePointers_(t),this.dragging_=!0;let e=new li(It.POINTERDRAG,this.map_,t,this.dragging_,void 0,this.activePointers_);this.dispatchEvent(e)}}relayMoveEvent_(t){this.originalPointerMoveEvent_=t;let e=!!(this.down_&&this.isMoving_(t));this.dispatchEvent(new li(It.POINTERMOVE,this.map_,t,e))}handleTouchMove_(t){let e=this.originalPointerMoveEvent_;(!e||e.defaultPrevented)&&(typeof t.cancelable!="boolean"||t.cancelable===!0)&&t.preventDefault()}isMoving_(t){return this.dragging_||Math.abs(t.clientX-this.down_.clientX)>this.moveTolerance_||Math.abs(t.clientY-this.down_.clientY)>this.moveTolerance_}disposeInternal(){this.relayedListenerKey_&&(ut(this.relayedListenerKey_),this.relayedListenerKey_=null),this.element_.removeEventListener(q.TOUCHMOVE,this.boundHandleTouchMove_),this.pointerdownListenerKey_&&(ut(this.pointerdownListenerKey_),this.pointerdownListenerKey_=null),this.dragListenerKeys_.forEach(ut),this.dragListenerKeys_.length=0,this.element_=null,super.disposeInternal()}},bu=sh;var ke={POSTRENDER:"postrender",MOVESTART:"movestart",MOVEEND:"moveend",LOADSTART:"loadstart",LOADEND:"loadend"};var Xt={LAYERGROUP:"layergroup",SIZE:"size",TARGET:"target",VIEW:"view"};var tr=1/0,rh=class{constructor(t,e){this.priorityFunction_=t,this.keyFunction_=e,this.elements_=[],this.priorities_=[],this.queuedElements_={}}clear(){this.elements_.length=0,this.priorities_.length=0,si(this.queuedElements_)}dequeue(){let t=this.elements_,e=this.priorities_,i=t[0];t.length==1?(t.length=0,e.length=0):(t[0]=t.pop(),e[0]=e.pop(),this.siftUp_(0));let n=this.keyFunction_(i);return delete this.queuedElements_[n],i}enqueue(t){$(!(this.keyFunction_(t)in this.queuedElements_),31);let e=this.priorityFunction_(t);return e!=tr?(this.elements_.push(t),this.priorities_.push(e),this.queuedElements_[this.keyFunction_(t)]=!0,this.siftDown_(0,this.elements_.length-1),!0):!1}getCount(){return this.elements_.length}getLeftChildIndex_(t){return t*2+1}getRightChildIndex_(t){return t*2+2}getParentIndex_(t){return t-1>>1}heapify_(){let t;for(t=(this.elements_.length>>1)-1;t>=0;t--)this.siftUp_(t)}isEmpty(){return this.elements_.length===0}isKeyQueued(t){return t in this.queuedElements_}isQueued(t){return this.isKeyQueued(this.keyFunction_(t))}siftUp_(t){let e=this.elements_,i=this.priorities_,n=e.length,o=e[t],a=i[t],l=t;for(;t>1;){let u=this.getLeftChildIndex_(t),d=this.getRightChildIndex_(t),m=dt;){let l=this.getParentIndex_(e);if(n[l]>a)i[e]=i[l],n[e]=n[l],e=l;else break}i[e]=o,n[e]=a}reprioritize(){let t=this.priorityFunction_,e=this.elements_,i=this.priorities_,n=0,o=e.length,a,l,u;for(l=0;l0;)o=this.dequeue()[0],a=o.getKey(),n=o.getState(),n===Q.IDLE&&!(a in this.tilesLoadingKeys_)&&(this.tilesLoadingKeys_[a]=!0,++this.tilesLoading_,++i,o.load())}},Au=oh;function Pu(s,t,e,i,n){if(!s||!(e in s.wantedTiles))return tr;if(!s.wantedTiles[e][t.getKey()])return tr;let o=s.viewState.center,a=i[0]-o[0],l=i[1]-o[1];return 65536*Math.log(n)+Math.sqrt(a*a+l*l)/n}var ah=class extends Nt{constructor(t){super();let e=t.element;e&&!t.target&&!e.style.pointerEvents&&(e.style.pointerEvents="auto"),this.element=e||null,this.target_=null,this.map_=null,this.listenerKeys=[],t.render&&(this.render=t.render),t.target&&this.setTarget(t.target)}disposeInternal(){In(this.element),super.disposeInternal()}getMap(){return this.map_}setMap(t){this.map_&&In(this.element);for(let e=0,i=this.listenerKeys.length;en.getAttributions(t)))),i=!this.getMap().getAllLayers().some(n=>n.getSource()&&n.getSource().getAttributionsCollapsible()===!1);return this.overrideCollapsible_||this.setCollapsible(i),e}updateElement_(t){if(!t){this.renderedVisible_&&(this.element.style.display="none",this.renderedVisible_=!1);return}let e=this.collectSourceAttributions_(t),i=e.length>0;if(this.renderedVisible_!=i&&(this.element.style.display=i?"":"none",this.renderedVisible_=i),!ie(e,this.renderedAttributions_)){mo(this.ulElement_);for(let n=0,o=e.length;n0&&i%(2*Math.PI)!==0?e.animate({rotation:0,duration:this.duration_,easing:ye}):e.setRotation(0))}render(t){let e=t.frameState;if(!e)return;let i=e.viewState.rotation;if(i!=this.rotation_){let n="rotate("+i+"rad)";if(this.autoHide_){let o=this.element.classList.contains($s);!o&&i===0?this.element.classList.add($s):o&&i!==0&&this.element.classList.remove($s)}this.label_.style.transform=n}this.rotation_=i}},Ou=lh;var ch=class extends re{constructor(t){t=t||{},super({element:document.createElement("div"),target:t.target});let e=t.className!==void 0?t.className:"ol-zoom",i=t.delta!==void 0?t.delta:1,n=t.zoomInClassName!==void 0?t.zoomInClassName:e+"-in",o=t.zoomOutClassName!==void 0?t.zoomOutClassName:e+"-out",a=t.zoomInLabel!==void 0?t.zoomInLabel:"+",l=t.zoomOutLabel!==void 0?t.zoomOutLabel:"\u2013",u=t.zoomInTipLabel!==void 0?t.zoomInTipLabel:"Zoom in",d=t.zoomOutTipLabel!==void 0?t.zoomOutTipLabel:"Zoom out",m=document.createElement("button");m.className=n,m.setAttribute("type","button"),m.title=u,m.appendChild(typeof a=="string"?document.createTextNode(a):a),m.addEventListener(q.CLICK,this.handleClick_.bind(this,i),!1);let x=document.createElement("button");x.className=o,x.setAttribute("type","button"),x.title=d,x.appendChild(typeof l=="string"?document.createTextNode(l):l),x.addEventListener(q.CLICK,this.handleClick_.bind(this,-i),!1);let E=e+" "+fe+" "+ri,C=this.element;C.className=E,C.appendChild(m),C.appendChild(x),this.duration_=t.duration!==void 0?t.duration:250}handleClick_(t,e){e.preventDefault(),this.zoomByDelta_(t)}zoomByDelta_(t){let i=this.getMap().getView();if(!i)return;let n=i.getZoom();if(n!==void 0){let o=i.getConstrainedZoom(n+t);this.duration_>0?(i.getAnimating()&&i.cancelAnimations(),i.animate({zoom:o,duration:this.duration_,easing:ye})):i.setZoom(o)}}},Fu=ch;function ir(s){s=s||{};let t=new ce;return(s.zoom!==void 0?s.zoom:!0)&&t.push(new Fu(s.zoomOptions)),(s.rotate!==void 0?s.rotate:!0)&&t.push(new Ou(s.rotateOptions)),(s.attribution!==void 0?s.attribution:!0)&&t.push(new er(s.attributionOptions)),t}var uh={ACTIVE:"active"};var dh=class extends Nt{constructor(t){super(),this.on,this.once,this.un,t&&t.handleEvent&&(this.handleEvent=t.handleEvent),this.map_=null,this.setActive(!0)}getActive(){return this.get(uh.ACTIVE)}getMap(){return this.map_}handleEvent(t){return!0}setActive(t){this.set(uh.ACTIVE,t)}setMap(t){this.map_=t}};function ku(s,t,e){let i=s.getCenterInternal();if(i){let n=[i[0]+t[0],i[1]+t[1]];s.animateInternal({duration:e!==void 0?e:250,easing:qc,center:s.getConstrainedCenter(n)})}}function ps(s,t,e,i){let n=s.getZoom();if(n===void 0)return;let o=s.getConstrainedZoom(n+t),a=s.getResolutionForZoom(o);s.getAnimating()&&s.cancelAnimations(),s.animate({resolution:a,anchor:e,duration:i!==void 0?i:250,easing:ye})}var ci=dh;var fh=class extends ci{constructor(t){super(),t=t||{},this.delta_=t.delta?t.delta:1,this.duration_=t.duration!==void 0?t.duration:250}handleEvent(t){let e=!1;if(t.type==It.DBLCLICK){let i=t.originalEvent,n=t.map,o=t.coordinate,a=i.shiftKey?-this.delta_:this.delta_,l=n.getView();ps(l,a,o,this.duration_),i.preventDefault(),e=!0}return!e}},Nu=fh;var mh=class extends ci{constructor(t){t=t||{},super(t),t.handleDownEvent&&(this.handleDownEvent=t.handleDownEvent),t.handleDragEvent&&(this.handleDragEvent=t.handleDragEvent),t.handleMoveEvent&&(this.handleMoveEvent=t.handleMoveEvent),t.handleUpEvent&&(this.handleUpEvent=t.handleUpEvent),t.stopDown&&(this.stopDown=t.stopDown),this.handlingDownUpSequence=!1,this.targetPointers=[]}getPointerCount(){return this.targetPointers.length}handleDownEvent(t){return!1}handleDragEvent(t){}handleEvent(t){if(!t.originalEvent)return!0;let e=!1;if(this.updateTrackedPointers_(t),this.handlingDownUpSequence){if(t.type==It.POINTERDRAG)this.handleDragEvent(t),t.originalEvent.preventDefault();else if(t.type==It.POINTERUP){let i=this.handleUpEvent(t);this.handlingDownUpSequence=i&&this.targetPointers.length>0}}else if(t.type==It.POINTERDOWN){let i=this.handleDownEvent(t);this.handlingDownUpSequence=i,e=this.stopDown(i)}else t.type==It.POINTERMOVE&&this.handleMoveEvent(t);return!e}handleMoveEvent(t){}handleUpEvent(t){return!1}stopDown(t){return t}updateTrackedPointers_(t){t.activePointers&&(this.targetPointers=t.activePointers)}};function _s(s){let t=s.length,e=0,i=0;for(let n=0;n0&&this.condition_(t)){let i=t.map.getView();return this.lastCentroid=null,i.getAnimating()&&i.cancelAnimations(),this.kinetic_&&this.kinetic_.begin(),this.noKinetic_=this.targetPointers.length>1,!0}return!1}},Wu=gh;var ph=class extends ui{constructor(t){t=t||{},super({stopDown:Si}),this.condition_=t.condition?t.condition:Du,this.lastAngle_=void 0,this.duration_=t.duration!==void 0?t.duration:250}handleDragEvent(t){if(!Mo(t))return;let e=t.map,i=e.getView();if(i.getConstraints().rotation===cs)return;let n=e.getSize(),o=t.pixel,a=Math.atan2(n[1]/2-o[1],o[0]-n[0]/2);if(this.lastAngle_!==void 0){let l=a-this.lastAngle_;i.adjustRotationInternal(-l)}this.lastAngle_=a}handleUpEvent(t){return Mo(t)?(t.map.getView().endInteraction(this.duration_),!1):!0}handleDownEvent(t){return Mo(t)&&yo(t)&&this.condition_(t)?(t.map.getView().beginInteraction(),this.lastAngle_=void 0,!0):!1}},ju=ph;var _h=class extends Kn{constructor(t){super(),this.geometry_=null,this.element_=document.createElement("div"),this.element_.style.position="absolute",this.element_.style.pointerEvents="auto",this.element_.className="ol-box "+t,this.map_=null,this.startPixel_=null,this.endPixel_=null}disposeInternal(){this.setMap(null)}render_(){let t=this.startPixel_,e=this.endPixel_,i="px",n=this.element_.style;n.left=Math.min(t[0],e[0])+i,n.top=Math.min(t[1],e[1])+i,n.width=Math.abs(e[0]-t[0])+i,n.height=Math.abs(e[1]-t[1])+i}setMap(t){if(this.map_){this.map_.getOverlayContainer().removeChild(this.element_);let e=this.element_.style;e.left="inherit",e.top="inherit",e.width="inherit",e.height="inherit"}this.map_=t,this.map_&&this.map_.getOverlayContainer().appendChild(this.element_)}setPixels(t,e){this.startPixel_=t,this.endPixel_=e,this.createOrUpdateGeometry(),this.render_()}createOrUpdateGeometry(){let t=this.startPixel_,e=this.endPixel_,n=[t,[t[0],e[1]],e,[e[0],t[1]]].map(this.map_.getCoordinateFromPixelInternal,this.map_);n[4]=n[0].slice(),this.geometry_?this.geometry_.setCoordinates([n]):this.geometry_=new pu([n])}getGeometry(){return this.geometry_}},Xu=_h;var vo={BOXSTART:"boxstart",BOXDRAG:"boxdrag",BOXEND:"boxend",BOXCANCEL:"boxcancel"},sr=class extends Jt{constructor(t,e,i){super(t),this.coordinate=e,this.mapBrowserEvent=i}},yh=class extends ui{constructor(t){super(),this.on,this.once,this.un,t=t||{},this.box_=new Xu(t.className||"ol-dragbox"),this.minArea_=t.minArea!==void 0?t.minArea:64,t.onBoxEnd&&(this.onBoxEnd=t.onBoxEnd),this.startPixel_=null,this.condition_=t.condition?t.condition:yo,this.boxEndCondition_=t.boxEndCondition?t.boxEndCondition:this.defaultBoxEndCondition}defaultBoxEndCondition(t,e,i){let n=i[0]-e[0],o=i[1]-e[1];return n*n+o*o>=this.minArea_}getGeometry(){return this.box_.getGeometry()}handleDragEvent(t){this.box_.setPixels(this.startPixel_,t.pixel),this.dispatchEvent(new sr(vo.BOXDRAG,t.coordinate,t))}handleUpEvent(t){this.box_.setMap(null);let e=this.boxEndCondition_(t,this.startPixel_,t.pixel);return e&&this.onBoxEnd(t),this.dispatchEvent(new sr(e?vo.BOXEND:vo.BOXCANCEL,t.coordinate,t)),!1}handleDownEvent(t){return this.condition_(t)?(this.startPixel_=t.pixel,this.box_.setMap(t.map),this.box_.setPixels(this.startPixel_,this.startPixel_),this.dispatchEvent(new sr(vo.BOXSTART,t.coordinate,t)),!0):!1}onBoxEnd(t){}},Yu=yh;var xh=class extends Yu{constructor(t){t=t||{};let e=t.condition?t.condition:Uu;super({condition:e,className:t.className||"ol-dragzoom",minArea:t.minArea}),this.duration_=t.duration!==void 0?t.duration:200,this.out_=t.out!==void 0?t.out:!1}onBoxEnd(t){let i=this.getMap().getView(),n=this.getGeometry();if(this.out_){let o=i.rotatedExtentForGeometry(n),a=i.getResolutionForExtentInternal(o),l=i.getResolution()/a;n=n.clone(),n.scale(l*l)}i.fitInternal(n,{duration:this.duration_,easing:ye})}},Ku=xh;var rn={LEFT:"ArrowLeft",UP:"ArrowUp",RIGHT:"ArrowRight",DOWN:"ArrowDown"};var Eh=class extends ci{constructor(t){super(),t=t||{},this.defaultCondition_=function(e){return xo(e)&&Eo(e)},this.condition_=t.condition!==void 0?t.condition:this.defaultCondition_,this.duration_=t.duration!==void 0?t.duration:100,this.pixelDelta_=t.pixelDelta!==void 0?t.pixelDelta:128}handleEvent(t){let e=!1;if(t.type==q.KEYDOWN){let i=t.originalEvent,n=i.key;if(this.condition_(t)&&(n==rn.DOWN||n==rn.LEFT||n==rn.RIGHT||n==rn.UP)){let a=t.map.getView(),l=a.getResolution()*this.pixelDelta_,u=0,d=0;n==rn.DOWN?d=-l:n==rn.LEFT?u=-l:n==rn.RIGHT?u=l:d=l;let m=[u,d];as(m,a.getRotation()),ku(a,m,this.duration_),i.preventDefault(),e=!0}}return!e}},qu=Eh;var Mh=class extends ci{constructor(t){super(),t=t||{},this.condition_=t.condition?t.condition:function(e){return!zu(e)&&Eo(e)},this.delta_=t.delta?t.delta:1,this.duration_=t.duration!==void 0?t.duration:100}handleEvent(t){let e=!1;if(t.type==q.KEYDOWN||t.type==q.KEYPRESS){let i=t.originalEvent,n=i.key;if(this.condition_(t)&&(n==="+"||n==="-")){let o=t.map,a=n==="+"?this.delta_:-this.delta_,l=o.getView();ps(l,a,void 0,this.duration_),i.preventDefault(),e=!0}}return!e}},Vu=Mh;var vh=class{constructor(t,e,i){this.decay_=t,this.minVelocity_=e,this.delay_=i,this.points_=[],this.angle_=0,this.initialVelocity_=0}begin(){this.points_.length=0,this.angle_=0,this.initialVelocity_=0}update(t,e){this.points_.push(t,e,Date.now())}end(){if(this.points_.length<6)return!1;let t=Date.now()-this.delay_,e=this.points_.length-3;if(this.points_[e+2]0&&this.points_[i+2]>t;)i-=3;let n=this.points_[e+2]-this.points_[i+2];if(n<1e3/60)return!1;let o=this.points_[e]-this.points_[i],a=this.points_[e+1]-this.points_[i+1];return this.angle_=Math.atan2(a,o),this.initialVelocity_=Math.sqrt(o*o+a*a)/n,this.initialVelocity_>this.minVelocity_}getDistance(){return(this.minVelocity_-this.initialVelocity_)/this.decay_}getAngle(){return this.angle_}},Hu=vh;var Ch=class extends ci{constructor(t){t=t||{},super(t),this.totalDelta_=0,this.lastDelta_=0,this.maxDelta_=t.maxDelta!==void 0?t.maxDelta:1,this.duration_=t.duration!==void 0?t.duration:250,this.timeout_=t.timeout!==void 0?t.timeout:80,this.useAnchor_=t.useAnchor!==void 0?t.useAnchor:!0,this.constrainResolution_=t.constrainResolution!==void 0?t.constrainResolution:!1;let e=t.condition?t.condition:Gu;this.condition_=t.onFocusOnly?nr(_o,e):e,this.lastAnchor_=null,this.startTime_=void 0,this.timeoutId_,this.mode_=void 0,this.trackpadEventGap_=400,this.trackpadTimeoutId_,this.deltaPerZoom_=300}endInteraction_(){this.trackpadTimeoutId_=void 0;let t=this.getMap();if(!t)return;t.getView().endInteraction(void 0,this.lastDelta_?this.lastDelta_>0?1:-1:0,this.lastAnchor_)}handleEvent(t){if(!this.condition_(t)||t.type!==q.WHEEL)return!0;let i=t.map,n=t.originalEvent;n.preventDefault(),this.useAnchor_&&(this.lastAnchor_=t.coordinate);let o;if(t.type==q.WHEEL&&(o=n.deltaY,gc&&n.deltaMode===WheelEvent.DOM_DELTA_PIXEL&&(o/=Ur),n.deltaMode===WheelEvent.DOM_DELTA_LINE&&(o*=40)),o===0)return!1;this.lastDelta_=o;let a=Date.now();this.startTime_===void 0&&(this.startTime_=a),(!this.mode_||a-this.startTime_>this.trackpadEventGap_)&&(this.mode_=Math.abs(o)<4?"trackpad":"wheel");let l=i.getView();if(this.mode_==="trackpad"&&!(l.getConstrainResolution()||this.constrainResolution_))return this.trackpadTimeoutId_?clearTimeout(this.trackpadTimeoutId_):(l.getAnimating()&&l.cancelAnimations(),l.beginInteraction()),this.trackpadTimeoutId_=setTimeout(this.endInteraction_.bind(this),this.timeout_),l.adjustZoom(-o/this.deltaPerZoom_,this.lastAnchor_),this.startTime_=a,!1;this.totalDelta_+=o;let u=Math.max(this.timeout_-(a-this.startTime_),0);return clearTimeout(this.timeoutId_),this.timeoutId_=setTimeout(this.handleWheelZoom_.bind(this,i),u),!1}handleWheelZoom_(t){let e=t.getView();e.getAnimating()&&e.cancelAnimations();let i=-pt(this.totalDelta_,-this.maxDelta_*this.deltaPerZoom_,this.maxDelta_*this.deltaPerZoom_)/this.deltaPerZoom_;(e.getConstrainResolution()||this.constrainResolution_)&&(i=i?i>0?1:-1:0),ps(e,i,this.lastAnchor_,this.duration_),this.mode_=void 0,this.totalDelta_=0,this.lastAnchor_=null,this.startTime_=void 0,this.timeoutId_=void 0}setMouseAnchor(t){this.useAnchor_=t,t||(this.lastAnchor_=null)}},Zu=Ch;var Sh=class extends ui{constructor(t){t=t||{};let e=t;e.stopDown||(e.stopDown=Si),super(e),this.anchor_=null,this.lastAngle_=void 0,this.rotating_=!1,this.rotationDelta_=0,this.threshold_=t.threshold!==void 0?t.threshold:.3,this.duration_=t.duration!==void 0?t.duration:250}handleDragEvent(t){let e=0,i=this.targetPointers[0],n=this.targetPointers[1],o=Math.atan2(n.clientY-i.clientY,n.clientX-i.clientX);if(this.lastAngle_!==void 0){let u=o-this.lastAngle_;this.rotationDelta_+=u,!this.rotating_&&Math.abs(this.rotationDelta_)>this.threshold_&&(this.rotating_=!0),e=u}this.lastAngle_=o;let a=t.map,l=a.getView();l.getConstraints().rotation!==cs&&(this.anchor_=a.getCoordinateFromPixelInternal(a.getEventPixel(_s(this.targetPointers))),this.rotating_&&(a.render(),l.adjustRotationInternal(e,this.anchor_)))}handleUpEvent(t){return this.targetPointers.length<2?(t.map.getView().endInteraction(this.duration_),!1):!0}handleDownEvent(t){if(this.targetPointers.length>=2){let e=t.map;return this.anchor_=null,this.lastAngle_=void 0,this.rotating_=!1,this.rotationDelta_=0,this.handlingDownUpSequence||e.getView().beginInteraction(),!0}return!1}},Ju=Sh;var Th=class extends ui{constructor(t){t=t||{};let e=t;e.stopDown||(e.stopDown=Si),super(e),this.anchor_=null,this.duration_=t.duration!==void 0?t.duration:400,this.lastDistance_=void 0,this.lastScaleDelta_=1}handleDragEvent(t){let e=1,i=this.targetPointers[0],n=this.targetPointers[1],o=i.clientX-n.clientX,a=i.clientY-n.clientY,l=Math.sqrt(o*o+a*a);this.lastDistance_!==void 0&&(e=this.lastDistance_/l),this.lastDistance_=l;let u=t.map,d=u.getView();e!=1&&(this.lastScaleDelta_=e),this.anchor_=u.getCoordinateFromPixelInternal(u.getEventPixel(_s(this.targetPointers))),u.render(),d.adjustResolutionInternal(e,this.anchor_)}handleUpEvent(t){if(this.targetPointers.length<2){let i=t.map.getView(),n=this.lastScaleDelta_>1?1:-1;return i.endInteraction(this.duration_,n),!1}return!0}handleDownEvent(t){if(this.targetPointers.length>=2){let e=t.map;return this.anchor_=null,this.lastDistance_=void 0,this.lastScaleDelta_=1,this.handlingDownUpSequence||e.getView().beginInteraction(),!0}return!1}},$u=Th;function Co(s){s=s||{};let t=new ce,e=new Hu(-.005,.05,100);return(s.altShiftDragRotate!==void 0?s.altShiftDragRotate:!0)&&t.push(new ju),(s.doubleClickZoom!==void 0?s.doubleClickZoom:!0)&&t.push(new Nu({delta:s.zoomDelta,duration:s.zoomDuration})),(s.dragPan!==void 0?s.dragPan:!0)&&t.push(new Wu({onFocusOnly:s.onFocusOnly,kinetic:e})),(s.pinchRotate!==void 0?s.pinchRotate:!0)&&t.push(new Ju),(s.pinchZoom!==void 0?s.pinchZoom:!0)&&t.push(new $u({duration:s.zoomDuration})),(s.keyboard!==void 0?s.keyboard:!0)&&(t.push(new qu),t.push(new Vu({delta:s.zoomDelta,duration:s.zoomDuration}))),(s.mouseWheelZoom!==void 0?s.mouseWheelZoom:!0)&&t.push(new Zu({onFocusOnly:s.onFocusOnly,duration:s.zoomDuration})),(s.shiftDragZoom!==void 0?s.shiftDragZoom:!0)&&t.push(new Ku({duration:s.zoomDuration})),t}function Rh(s,t,e){return e===void 0&&(e=[0,0]),e[0]=s[0]+2*t,e[1]=s[1]+2*t,e}function Ih(s){return s[0]>0&&s[1]>0}function So(s,t,e){return e===void 0&&(e=[0,0]),e[0]=s[0]*t+.5|0,e[1]=s[1]*t+.5|0,e}function zt(s,t){return Array.isArray(s)?s:(t===void 0?t=[s,s]:(t[0]=s,t[1]=s),t)}function Qu(s){if(s instanceof Tn){s.setMapInternal(null);return}s instanceof hi&&s.getLayers().forEach(Qu)}function td(s,t){if(s instanceof Tn){s.setMapInternal(t);return}if(s instanceof hi){let e=s.getLayers().getArray();for(let i=0,n=e.length;ithis.updateSize()),this.controls=e.controls||ir(),this.interactions=e.interactions||Co({onFocusOnly:!0}),this.overlays_=e.overlays,this.overlayIdIndex_={},this.renderer_=null,this.postRenderFunctions_=[],this.tileQueue_=new Au(this.getTilePriority.bind(this),this.handleTileChange_.bind(this)),this.addChangeListener(Xt.LAYERGROUP,this.handleLayerGroupChanged_),this.addChangeListener(Xt.VIEW,this.handleViewChanged_),this.addChangeListener(Xt.SIZE,this.handleSizeChanged_),this.addChangeListener(Xt.TARGET,this.handleTargetChanged_),this.setProperties(e.values);let i=this;t.view&&!(t.view instanceof Re)&&t.view.then(function(n){i.setView(new Re(n))}),this.controls.addEventListener($t.ADD,n=>{n.element.setMap(this)}),this.controls.addEventListener($t.REMOVE,n=>{n.element.setMap(null)}),this.interactions.addEventListener($t.ADD,n=>{n.element.setMap(this)}),this.interactions.addEventListener($t.REMOVE,n=>{n.element.setMap(null)}),this.overlays_.addEventListener($t.ADD,n=>{this.addOverlayInternal_(n.element)}),this.overlays_.addEventListener($t.REMOVE,n=>{let o=n.element.getId();o!==void 0&&delete this.overlayIdIndex_[o.toString()],n.element.setMap(null)}),this.controls.forEach(n=>{n.setMap(this)}),this.interactions.forEach(n=>{n.setMap(this)}),this.overlays_.forEach(this.addOverlayInternal_.bind(this))}addControl(t){this.getControls().push(t)}addInteraction(t){this.getInteractions().push(t)}addLayer(t){this.getLayerGroup().getLayers().push(t)}handleLayerAdd_(t){td(t.layer,this)}addOverlay(t){this.getOverlays().push(t)}addOverlayInternal_(t){let e=t.getId();e!==void 0&&(this.overlayIdIndex_[e.toString()]=t),t.setMap(this)}disposeInternal(){this.controls.clear(),this.interactions.clear(),this.overlays_.clear(),this.resizeObserver_.disconnect(),this.setTarget(null),super.disposeInternal()}forEachFeatureAtPixel(t,e,i){if(!this.frameState_||!this.renderer_)return;let n=this.getCoordinateFromPixelInternal(t);i=i!==void 0?i:{};let o=i.hitTolerance!==void 0?i.hitTolerance:0,a=i.layerFilter!==void 0?i.layerFilter:Ci,l=i.checkWrapped!==!1;return this.renderer_.forEachFeatureAtCoordinate(n,this.frameState_,o,l,e,null,a,null)}getFeaturesAtPixel(t,e){let i=[];return this.forEachFeatureAtPixel(t,function(n){i.push(n)},e),i}getAllLayers(){let t=[];function e(i){i.forEach(function(n){n instanceof hi?e(n.getLayers()):t.push(n)})}return e(this.getLayers()),t}hasFeatureAtPixel(t,e){if(!this.frameState_||!this.renderer_)return!1;let i=this.getCoordinateFromPixelInternal(t);e=e!==void 0?e:{};let n=e.layerFilter!==void 0?e.layerFilter:Ci,o=e.hitTolerance!==void 0?e.hitTolerance:0,a=e.checkWrapped!==!1;return this.renderer_.hasFeatureAtCoordinate(i,this.frameState_,o,a,n,null)}getEventCoordinate(t){return this.getCoordinateFromPixel(this.getEventPixel(t))}getEventCoordinateInternal(t){return this.getCoordinateFromPixelInternal(this.getEventPixel(t))}getEventPixel(t){let i=this.viewport_.getBoundingClientRect(),n=this.getSize(),o=i.width/n[0],a=i.height/n[1],l="changedTouches"in t?t.changedTouches[0]:t;return[(l.clientX-i.left)/o,(l.clientY-i.top)/a]}getTarget(){return this.get(Xt.TARGET)}getTargetElement(){return this.targetElement_}getCoordinateFromPixel(t){return Hs(this.getCoordinateFromPixelInternal(t),this.getView().getProjection())}getCoordinateFromPixelInternal(t){let e=this.frameState_;return e?Ot(e.pixelToCoordinateTransform,t.slice()):null}getControls(){return this.controls}getOverlays(){return this.overlays_}getOverlayById(t){let e=this.overlayIdIndex_[t.toString()];return e!==void 0?e:null}getInteractions(){return this.interactions}getLayerGroup(){return this.get(Xt.LAYERGROUP)}setLayers(t){let e=this.getLayerGroup();if(t instanceof ce){e.setLayers(t);return}let i=e.getLayers();i.clear(),i.extend(t)}getLayers(){return this.getLayerGroup().getLayers()}getLoadingOrNotReady(){let t=this.getLayerGroup().getLayerStatesArray();for(let e=0,i=t.length;e=0;o--){let a=n[o];if(a.getMap()!==this||!a.getActive()||!this.getTargetElement())continue;if(!a.handleEvent(t)||t.propagationStopped)break}}}handlePostRender(){let t=this.frameState_,e=this.tileQueue_;if(!e.isEmpty()){let n=this.maxTilesLoading_,o=n;if(t){let a=t.viewHints;if(a[Yt.ANIMATING]||a[Yt.INTERACTING]){let l=Date.now()-t.time>8;n=l?0:8,o=l?0:2}}e.getTilesLoading(){this.postRenderTimeoutHandle_=void 0,this.handlePostRender()},0))}setLayerGroup(t){let e=this.getLayerGroup();e&&this.handleLayerRemove_(new He("removelayer",e)),this.set(Xt.LAYERGROUP,t)}setSize(t){this.set(Xt.SIZE,t)}setTarget(t){this.set(Xt.TARGET,t)}setView(t){if(!t||t instanceof Re){this.set(Xt.VIEW,t);return}this.set(Xt.VIEW,new Re);let e=this;t.then(function(i){e.setView(new Re(i))})}updateSize(){let t=this.getTargetElement(),e;if(t){let n=getComputedStyle(t),o=t.offsetWidth-parseFloat(n.borderLeftWidth)-parseFloat(n.paddingLeft)-parseFloat(n.paddingRight)-parseFloat(n.borderRightWidth),a=t.offsetHeight-parseFloat(n.borderTopWidth)-parseFloat(n.paddingTop)-parseFloat(n.paddingBottom)-parseFloat(n.borderBottomWidth);!isNaN(o)&&!isNaN(a)&&(e=[o,a],!Ih(e)&&!!(t.offsetWidth||t.offsetHeight||t.getClientRects().length)&&so("No map visible because the map container's width or height are 0."))}let i=this.getSize();e&&(!i||!ie(e,i))&&(this.setSize(e),this.updateViewportSize_())}updateViewportSize_(){let t=this.getView();if(t){let e,i=getComputedStyle(this.viewport_);i.width&&i.height&&(e=[parseInt(i.width,10),parseInt(i.height,10)]),t.setViewportSize(e)}}};function ag(s){let t=null;s.keyboardEventTarget!==void 0&&(t=typeof s.keyboardEventTarget=="string"?document.getElementById(s.keyboardEventTarget):s.keyboardEventTarget);let e={},i=s.layers&&typeof s.layers.getLayers=="function"?s.layers:new hi({layers:s.layers});e[Xt.LAYERGROUP]=i,e[Xt.TARGET]=s.target,e[Xt.VIEW]=s.view instanceof Re?s.view:new Re;let n;s.controls!==void 0&&(Array.isArray(s.controls)?n=new ce(s.controls.slice()):($(typeof s.controls.getArray=="function",47),n=s.controls));let o;s.interactions!==void 0&&(Array.isArray(s.interactions)?o=new ce(s.interactions.slice()):($(typeof s.interactions.getArray=="function",48),o=s.interactions));let a;return s.overlays!==void 0?Array.isArray(s.overlays)?a=new ce(s.overlays.slice()):($(typeof s.overlays.getArray=="function",49),a=s.overlays):a=new ce,{controls:n,interactions:o,keyboardEventTarget:t,overlays:a,values:e}}var ed=wh;var To=class{constructor(t,e,i,n){this.minX=t,this.maxX=e,this.minY=i,this.maxY=n}contains(t){return this.containsXY(t[1],t[2])}containsTileRange(t){return this.minX<=t.minX&&t.maxX<=this.maxX&&this.minY<=t.minY&&t.maxY<=this.maxY}containsXY(t,e){return this.minX<=t&&t<=this.maxX&&this.minY<=e&&e<=this.maxY}equals(t){return this.minX==t.minX&&this.minY==t.minY&&this.maxX==t.maxX&&this.maxY==t.maxY}extend(t){t.minXthis.maxX&&(this.maxX=t.maxX),t.minYthis.maxY&&(this.maxY=t.maxY)}getHeight(){return this.maxY-this.minY+1}getSize(){return[this.getWidth(),this.getHeight()]}getWidth(){return this.maxX-this.minX+1}intersects(t){return this.minX<=t.maxX&&this.maxX>=t.minX&&this.minY<=t.maxY&&this.maxY>=t.minY}};function Ln(s,t,e,i,n){return n!==void 0?(n.minX=s,n.maxX=t,n.minY=e,n.maxY=i,n):new To(s,t,e,i)}var Ro=To;function bh(s,t,e,i){return i!==void 0?(i[0]=s,i[1]=t,i[2]=e,i):[s,t,e]}function An(s,t,e){return s+"/"+t+"/"+e}function Io(s){return An(s[0],s[1],s[2])}function id(s){return s.split("/").map(Number)}function wo(s){return(s[1]<e||e>t.getMaxZoom())return!1;let o=t.getFullTileRange(e);return o?o.containsXY(i,n):!0}var ys=[0,0,0],on=5,Lh=class{constructor(t){this.minZoom=t.minZoom!==void 0?t.minZoom:0,this.resolutions_=t.resolutions,$(dc(this.resolutions_,function(n,o){return o-n},!0),17);let e;if(!t.origins){for(let n=0,o=this.resolutions_.length-1;n=this.minZoom;){if(this.zoomFactor_===2?(a=Math.floor(a/2),l=Math.floor(l/2),o=Ln(a,a,l,l,i)):o=this.getTileRangeForExtentAndZ(u,d,i),e(d,o))return!0;--d}return!1}getExtent(){return this.extent_}getMaxZoom(){return this.maxZoom}getMinZoom(){return this.minZoom}getOrigin(t){return this.origin_?this.origin_:this.origins_[t]}getResolution(t){return this.resolutions_[t]}getResolutions(){return this.resolutions_}getTileCoordChildTileRange(t,e,i){if(t[0]this.maxZoom||e=u){E=w,C=M,T=v;break}else if(C>=l)break;w=E,M=C,v=T,++x}let I=this.scaleBar_?this.createScaleBar(C,E,m):E.toFixed(T<0?-T:0)+" "+m;this.renderedHTML_!=I&&(this.innerElement_.innerHTML=I,this.renderedHTML_=I),this.renderedWidth_!=C&&(this.innerElement_.style.width=C+"px",this.renderedWidth_=C),this.renderedVisible_||(this.element.style.display="",this.renderedVisible_=!0)}createScaleBar(t,e,i){let n=this.getScaleForResolution(),o=n<1?Math.round(1/n).toLocaleString()+" : 1":"1 : "+Math.round(n).toLocaleString(),a=this.scaleBarSteps_,l=t/a,u=[this.createMarker("absolute")];for(let m=0;m
`+this.createMarker("relative")+(m%2===0||a===2?this.createStepText(m,t,!1,e,i):"")+"")}return u.push(this.createStepText(a,t,!0,e,i)),(this.scaleBarText_?`
`+o+"
":"")+u.join("")}createMarker(t){return`
`}createStepText(t,e,i,n,o){let l=(t===0?0:Math.round(n/this.scaleBarSteps_*t*100)/100)+(t===0?"":" "+o),u=t===0?-3:e/this.scaleBarSteps_*-1,d=t===0?0:e/this.scaleBarSteps_*2;return`
`+l+"
"}getScaleForResolution(){let t=hs(this.viewState_.projection,this.viewState_.resolution,this.viewState_.center,"m"),e=this.dpi_||rr,i=1e3/25.4;return t*i*e}render(t){let e=t.frameState;e?this.viewState_=e.viewState:this.viewState_=null,this.updateElement_()}},zh=Gh;var or={VERTICAL:0,HORIZONTAL:1},Uh=class extends re{constructor(t){t=t||{},super({target:t.target,element:document.createElement("div"),render:t.render}),this.dragListenerKeys_=[],this.currentResolution_=void 0,this.direction_=or.VERTICAL,this.dragging_,this.heightLimit_=0,this.widthLimit_=0,this.startX_,this.startY_,this.thumbSize_=null,this.sliderInitialized_=!1,this.duration_=t.duration!==void 0?t.duration:200;let e=t.className!==void 0?t.className:"ol-zoomslider",i=document.createElement("button");i.setAttribute("type","button"),i.className=e+"-thumb "+fe;let n=this.element;n.className=e+" "+fe+" "+ri,n.appendChild(i),n.addEventListener(Ze.POINTERDOWN,this.handleDraggerStart_.bind(this),!1),n.addEventListener(Ze.POINTERMOVE,this.handleDraggerDrag_.bind(this),!1),n.addEventListener(Ze.POINTERUP,this.handleDraggerEnd_.bind(this),!1),n.addEventListener(q.CLICK,this.handleContainerClick_.bind(this),!1),i.addEventListener(q.CLICK,cc,!1)}setMap(t){super.setMap(t),t&&t.render()}initSlider_(){let t=this.element,e=t.offsetWidth,i=t.offsetHeight;if(e===0&&i===0)return this.sliderInitialized_=!1;let n=getComputedStyle(t);e-=parseFloat(n.paddingRight)+parseFloat(n.paddingLeft),i-=parseFloat(n.paddingTop)+parseFloat(n.paddingBottom);let o=t.firstElementChild,a=getComputedStyle(o),l=o.offsetWidth+parseFloat(a.marginRight)+parseFloat(a.marginLeft),u=o.offsetHeight+parseFloat(a.marginTop)+parseFloat(a.marginBottom);return this.thumbSize_=[l,u],e>i?(this.direction_=or.HORIZONTAL,this.widthLimit_=e-l):(this.direction_=or.VERTICAL,this.heightLimit_=i-u),this.sliderInitialized_=!0}handleContainerClick_(t){let e=this.getMap().getView(),i=this.getRelativePosition_(t.offsetX-this.thumbSize_[0]/2,t.offsetY-this.thumbSize_[1]/2),n=this.getResolutionForPosition_(i),o=e.getConstrainedZoom(e.getZoomForResolution(n));e.animateInternal({zoom:o,duration:this.duration_,easing:ye})}handleDraggerStart_(t){if(!this.dragging_&&t.target===this.element.firstElementChild){let e=this.element.firstElementChild;if(this.getMap().getView().beginInteraction(),this.startX_=t.clientX-parseFloat(e.style.left),this.startY_=t.clientY-parseFloat(e.style.top),this.dragging_=!0,this.dragListenerKeys_.length===0){let i=this.handleDraggerDrag_,n=this.handleDraggerEnd_,o=this.getMap().getOwnerDocument();this.dragListenerKeys_.push(st(o,Ze.POINTERMOVE,i,this),st(o,Ze.POINTERUP,n,this))}}}handleDraggerDrag_(t){if(this.dragging_){let e=t.clientX-this.startX_,i=t.clientY-this.startY_,n=this.getRelativePosition_(e,i);this.currentResolution_=this.getResolutionForPosition_(n),this.getMap().getView().setResolution(this.currentResolution_)}}handleDraggerEnd_(t){this.dragging_&&(this.getMap().getView().endInteraction(),this.dragging_=!1,this.startX_=void 0,this.startY_=void 0,this.dragListenerKeys_.forEach(ut),this.dragListenerKeys_.length=0)}setThumbPosition_(t){let e=this.getPositionForResolution_(t),i=this.element.firstElementChild;this.direction_==or.HORIZONTAL?i.style.left=this.widthLimit_*e+"px":i.style.top=this.heightLimit_*e+"px"}getRelativePosition_(t,e){let i;return this.direction_===or.HORIZONTAL?i=t/this.widthLimit_:i=e/this.heightLimit_,pt(i,0,1)}getResolutionForPosition_(t){return this.getMap().getView().getResolutionForValueFunction()(1-t)}getPositionForResolution_(t){let e=this.getMap().getView().getValueForResolutionFunction();return pt(1-e(t),0,1)}render(t){if(!t.frameState||!this.sliderInitialized_&&!this.initSlider_())return;let e=t.frameState.viewState.resolution;this.currentResolution_=e,this.setThumbPosition_(e)}},Bh=Uh;var Rt={IDLE:0,LOADING:1,LOADED:2,ERROR:3,EMPTY:4};var ar=class{constructor(t){this.opacity_=t.opacity,this.rotateWithView_=t.rotateWithView,this.rotation_=t.rotation,this.scale_=t.scale,this.scaleArray_=zt(t.scale),this.displacement_=t.displacement,this.declutterMode_=t.declutterMode}clone(){let t=this.getScale();return new ar({opacity:this.getOpacity(),scale:Array.isArray(t)?t.slice():t,rotation:this.getRotation(),rotateWithView:this.getRotateWithView(),displacement:this.getDisplacement().slice(),declutterMode:this.getDeclutterMode()})}getOpacity(){return this.opacity_}getRotateWithView(){return this.rotateWithView_}getRotation(){return this.rotation_}getScale(){return this.scale_}getScaleArray(){return this.scaleArray_}getDisplacement(){return this.displacement_}getDeclutterMode(){return this.declutterMode_}getAnchor(){return ft()}getImage(t){return ft()}getHitDetectionImage(){return ft()}getPixelRatio(t){return 1}getImageState(){return ft()}getImageSize(){return ft()}getOrigin(){return ft()}getSize(){return ft()}setDisplacement(t){this.displacement_=t}setOpacity(t){this.opacity_=t}setRotateWithView(t){this.rotateWithView_=t}setRotation(t){this.rotation_=t}setScale(t){this.scale_=t,this.scaleArray_=zt(t)}listenImageChange(t){ft()}load(){ft()}unlistenImageChange(t){ft()}},Ao=ar;function Me(s){return Array.isArray(s)?ua(s):s}var hr=class extends Ao{constructor(t){let e=t.rotateWithView!==void 0?t.rotateWithView:!1;super({opacity:1,rotateWithView:e,rotation:t.rotation!==void 0?t.rotation:0,scale:t.scale!==void 0?t.scale:1,displacement:t.displacement!==void 0?t.displacement:[0,0],declutterMode:t.declutterMode}),this.canvas_=void 0,this.hitDetectionCanvas_=null,this.fill_=t.fill!==void 0?t.fill:null,this.origin_=[0,0],this.points_=t.points,this.radius_=t.radius!==void 0?t.radius:t.radius1,this.radius2_=t.radius2,this.angle_=t.angle!==void 0?t.angle:0,this.stroke_=t.stroke!==void 0?t.stroke:null,this.size_=null,this.renderOptions_=null,this.render()}clone(){let t=this.getScale(),e=new hr({fill:this.getFill()?this.getFill().clone():void 0,points:this.getPoints(),radius:this.getRadius(),radius2:this.getRadius2(),angle:this.getAngle(),stroke:this.getStroke()?this.getStroke().clone():void 0,rotation:this.getRotation(),rotateWithView:this.getRotateWithView(),scale:Array.isArray(t)?t.slice():t,displacement:this.getDisplacement().slice(),declutterMode:this.getDeclutterMode()});return e.setOpacity(this.getOpacity()),e}getAnchor(){let t=this.size_;if(!t)return null;let e=this.getDisplacement(),i=this.getScaleArray();return[t[0]/2-e[0]/i[0],t[1]/2+e[1]/i[1]]}getAngle(){return this.angle_}getFill(){return this.fill_}setFill(t){this.fill_=t,this.render()}getHitDetectionImage(){return this.hitDetectionCanvas_||this.createHitDetectionCanvas_(this.renderOptions_),this.hitDetectionCanvas_}getImage(t){let e=this.canvas_[t];if(!e){let i=this.renderOptions_,n=Lt(i.size*t,i.size*t);this.draw_(i,n,t),e=n.canvas,this.canvas_[t]=e}return e}getPixelRatio(t){return t}getImageSize(){return this.size_}getImageState(){return Rt.LOADED}getOrigin(){return this.origin_}getPoints(){return this.points_}getRadius(){return this.radius_}getRadius2(){return this.radius2_}getSize(){return this.size_}getStroke(){return this.stroke_}setStroke(t){this.stroke_=t,this.render()}listenImageChange(t){}load(){}unlistenImageChange(t){}calculateLineJoinSize_(t,e,i){if(e===0||this.points_===1/0||t!=="bevel"&&t!=="miter")return e;let n=this.radius_,o=this.radius2_===void 0?n:this.radius2_;if(n0,6),$(!((t.width!==void 0||t.height!==void 0)&&t.scale!==void 0),69);let u=t.src!==void 0?Rt.IDLE:Rt.LOADED;if(this.color_=t.color!==void 0?yn(t.color):null,this.iconImage_=gd(a,l,this.imgSize_!==void 0?this.imgSize_:null,this.crossOrigin_,u,this.color_),this.offset_=t.offset!==void 0?t.offset:[0,0],this.offsetOrigin_=t.offsetOrigin!==void 0?t.offsetOrigin:"top-left",this.origin_=null,this.size_=t.size!==void 0?t.size:null,t.width!==void 0||t.height!==void 0){let d,m;if(t.size)[d,m]=t.size;else{let x=this.getImage(1);if(x instanceof HTMLCanvasElement||x.src&&x.complete)d=x.width,m=x.height;else{this.initialOptions_=t;let E=()=>{if(this.unlistenImageChange(E),!this.initialOptions_)return;let C=this.iconImage_.getSize();this.setScale(pd(C[0],C[1],t.width,t.height))};this.listenImageChange(E);return}}d!==void 0&&this.setScale(pd(d,m,t.width,t.height))}}clone(){let t,e,i;return this.initialOptions_?(e=this.initialOptions_.width,i=this.initialOptions_.height):(t=this.getScale(),t=Array.isArray(t)?t.slice():t),new fr({anchor:this.anchor_.slice(),anchorOrigin:this.anchorOrigin_,anchorXUnits:this.anchorXUnits_,anchorYUnits:this.anchorYUnits_,color:this.color_&&this.color_.slice?this.color_.slice():this.color_||void 0,crossOrigin:this.crossOrigin_,imgSize:this.imgSize_,offset:this.offset_.slice(),offsetOrigin:this.offsetOrigin_,opacity:this.getOpacity(),rotateWithView:this.getRotateWithView(),rotation:this.getRotation(),scale:t,width:e,height:i,size:this.size_!==null?this.size_.slice():void 0,src:this.getSrc(),displacement:this.getDisplacement().slice(),declutterMode:this.getDeclutterMode()})}getAnchor(){let t=this.normalizedAnchor_;if(!t){t=this.anchor_;let n=this.getSize();if(this.anchorXUnits_=="fraction"||this.anchorYUnits_=="fraction"){if(!n)return null;t=this.anchor_.slice(),this.anchorXUnits_=="fraction"&&(t[0]*=n[0]),this.anchorYUnits_=="fraction"&&(t[1]*=n[1])}if(this.anchorOrigin_!="top-left"){if(!n)return null;t===this.anchor_&&(t=this.anchor_.slice()),(this.anchorOrigin_=="top-right"||this.anchorOrigin_=="bottom-right")&&(t[0]=-t[0]+n[0]),(this.anchorOrigin_=="bottom-left"||this.anchorOrigin_=="bottom-right")&&(t[1]=-t[1]+n[1])}this.normalizedAnchor_=t}let e=this.getDisplacement(),i=this.getScaleArray();return[t[0]-e[0]/i[0],t[1]+e[1]/i[1]]}setAnchor(t){this.anchor_=t,this.normalizedAnchor_=null}getColor(){return this.color_}getImage(t){return this.iconImage_.getImage(t)}getPixelRatio(t){return this.iconImage_.getPixelRatio(t)}getImageSize(){return this.iconImage_.getSize()}getImageState(){return this.iconImage_.getImageState()}getHitDetectionImage(){return this.iconImage_.getHitDetectionImage()}getOrigin(){if(this.origin_)return this.origin_;let t=this.offset_;if(this.offsetOrigin_!="top-left"){let e=this.getSize(),i=this.iconImage_.getSize();if(!e||!i)return null;t=t.slice(),(this.offsetOrigin_=="top-right"||this.offsetOrigin_=="bottom-right")&&(t[0]=i[0]-e[0]-t[0]),(this.offsetOrigin_=="bottom-left"||this.offsetOrigin_=="bottom-right")&&(t[1]=i[1]-e[1]-t[1])}return this.origin_=t,this.origin_}getSrc(){return this.iconImage_.getSrc()}getSize(){return this.size_?this.size_:this.iconImage_.getSize()}getWidth(){let t=this.getScaleArray();if(this.size_)return this.size_[0]*t[0];if(this.iconImage_.getImageState()==Rt.LOADED)return this.iconImage_.getSize()[0]*t[0]}getHeight(){let t=this.getScaleArray();if(this.size_)return this.size_[1]*t[1];if(this.iconImage_.getImageState()==Rt.LOADED)return this.iconImage_.getSize()[1]*t[1]}setScale(t){delete this.initialOptions_,super.setScale(t)}listenImageChange(t){this.iconImage_.addEventListener(q.CHANGE,t)}load(){this.iconImage_.load()}unlistenImageChange(t){this.iconImage_.removeEventListener(q.CHANGE,t)}},ki=fr;var _d=ta(Kh(),1);var qh=class{constructor(t){this.rbush_=new _d.default(t),this.items_={}}insert(t,e){let i={minX:t[0],minY:t[1],maxX:t[2],maxY:t[3],value:e};this.rbush_.insert(i),this.items_[at(e)]=i}load(t,e){let i=new Array(e.length);for(let n=0,o=e.length;n=200&&l.status<300){let d=t.getType(),m;d=="json"||d=="text"?m=l.responseText:d=="xml"?(m=l.responseXML,m||(m=new DOMParser().parseFromString(l.responseText,"application/xml"))):d=="arraybuffer"&&(m=l.response),m?o(t.readFeatures(m,{extent:e,featureProjection:n}),t.readProjection(m)):a()}else a()},l.onerror=a,l.send()}function Zh(s,t){return function(e,i,n,o,a){let l=this;fg(s,t,e,i,n,function(u,d){l.addFeatures(u),o!==void 0&&o(u)},a||je)}}var fi=class extends Jt{constructor(t,e,i){super(t),this.feature=e,this.features=i}},Jh=class extends Fo{constructor(t){t=t||{},super({attributions:t.attributions,interpolate:!0,projection:void 0,state:"ready",wrapX:t.wrapX!==void 0?t.wrapX:!0}),this.on,this.once,this.un,this.loader_=je,this.format_=t.format,this.overlaps_=t.overlaps===void 0?!0:t.overlaps,this.url_=t.url,t.loader!==void 0?this.loader_=t.loader:this.url_!==void 0&&($(this.format_,7),this.loader_=Zh(this.url_,this.format_)),this.strategy_=t.strategy!==void 0?t.strategy:xd;let e=t.useSpatialIndex!==void 0?t.useSpatialIndex:!0;this.featuresRtree_=e?new Vh:null,this.loadedExtentsRtree_=new Vh,this.loadingExtentsCount_=0,this.nullGeometryFeatures_={},this.idIndex_={},this.uidIndex_={},this.featureChangeKeys_={},this.featuresCollection_=null;let i,n;Array.isArray(t.features)?n=t.features:t.features&&(i=t.features,n=i.getArray()),!e&&i===void 0&&(i=new ce(n)),n!==void 0&&this.addFeaturesInternal(n),i!==void 0&&this.bindFeaturesCollection_(i)}addFeature(t){this.addFeatureInternal(t),this.changed()}addFeatureInternal(t){let e=at(t);if(!this.addToIndex_(e,t)){this.featuresCollection_&&this.featuresCollection_.remove(t);return}this.setupChangeEvents_(e,t);let i=t.getGeometry();if(i){let n=i.getExtent();this.featuresRtree_&&this.featuresRtree_.insert(n,t)}else this.nullGeometryFeatures_[e]=t;this.dispatchEvent(new fi(Ne.ADDFEATURE,t))}setupChangeEvents_(t,e){this.featureChangeKeys_[t]=[st(e,q.CHANGE,this.handleFeatureChange_,this),st(e,We.PROPERTYCHANGE,this.handleFeatureChange_,this)]}addToIndex_(t,e){let i=!0,n=e.getId();return n!==void 0&&(n.toString()in this.idIndex_?i=!1:this.idIndex_[n.toString()]=e),i&&($(!(t in this.uidIndex_),30),this.uidIndex_[t]=e),i}addFeatures(t){this.addFeaturesInternal(t),this.changed()}addFeaturesInternal(t){let e=[],i=[],n=[];for(let o=0,a=t.length;o{e||(e=!0,this.addFeature(i.element),e=!1)}),t.addEventListener($t.REMOVE,i=>{e||(e=!0,this.removeFeature(i.element),e=!1)}),this.featuresCollection_=t}clear(t){if(t){for(let i in this.featureChangeKeys_)this.featureChangeKeys_[i].forEach(ut);this.featuresCollection_||(this.featureChangeKeys_={},this.idIndex_={},this.uidIndex_={})}else if(this.featuresRtree_){let i=n=>{this.removeFeatureInternal(n)};this.featuresRtree_.forEach(i);for(let n in this.nullGeometryFeatures_)this.removeFeatureInternal(this.nullGeometryFeatures_[n])}this.featuresCollection_&&this.featuresCollection_.clear(),this.featuresRtree_&&this.featuresRtree_.clear(),this.nullGeometryFeatures_={};let e=new fi(Ne.CLEAR);this.dispatchEvent(e),this.changed()}forEachFeature(t){if(this.featuresRtree_)return this.featuresRtree_.forEach(t);this.featuresCollection_&&this.featuresCollection_.forEach(t)}forEachFeatureAtCoordinateDirect(t,e){let i=[t[0],t[1],t[0],t[1]];return this.forEachFeatureInExtent(i,function(n){if(n.getGeometry().intersectsCoordinate(t))return e(n)})}forEachFeatureInExtent(t,e){if(this.featuresRtree_)return this.featuresRtree_.forEachInExtent(t,e);this.featuresCollection_&&this.featuresCollection_.forEach(e)}forEachFeatureIntersectingExtent(t,e){return this.forEachFeatureInExtent(t,function(i){if(i.getGeometry().intersectsExtent(t)){let o=e(i);if(o)return o}})}getFeaturesCollection(){return this.featuresCollection_}getFeatures(){let t;return this.featuresCollection_?t=this.featuresCollection_.getArray().slice(0):this.featuresRtree_&&(t=this.featuresRtree_.getAll(),Ti(this.nullGeometryFeatures_)||Nr(t,Object.values(this.nullGeometryFeatures_))),t}getFeaturesAtCoordinate(t){let e=[];return this.forEachFeatureAtCoordinateDirect(t,function(i){e.push(i)}),e}getFeaturesInExtent(t,e){if(this.featuresRtree_){if(!(e&&e.canWrapX()&&this.getWrapX()))return this.featuresRtree_.getInExtent(t);let n=Rc(t,e);return[].concat(...n.map(o=>this.featuresRtree_.getInExtent(o)))}return this.featuresCollection_?this.featuresCollection_.getArray().slice(0):[]}getClosestFeatureToCoordinate(t,e){let i=t[0],n=t[1],o=null,a=[NaN,NaN],l=1/0,u=[-1/0,-1/0,1/0,1/0];return e=e||Ci,this.featuresRtree_.forEachInExtent(u,function(d){if(e(d)){let m=d.getGeometry(),x=l;if(l=m.closestPointXY(i,n,a,l),l{--this.loadingExtentsCount_,this.dispatchEvent(new fi(Ne.FEATURESLOADEND,void 0,m))},()=>{--this.loadingExtentsCount_,this.dispatchEvent(new fi(Ne.FEATURESLOADERROR))}),n.insert(u,{extent:u.slice()}))}this.loading=this.loader_.length<4?!1:this.loadingExtentsCount_>0}refresh(){this.clear(!0),this.loadedExtentsRtree_.clear(),super.refresh()}removeLoadedExtent(t){let e=this.loadedExtentsRtree_,i;e.forEachInExtent(t,function(n){if(Ri(n.extent,t))return i=n,!0}),i&&e.remove(i)}removeFeature(t){if(!t)return;let e=at(t);e in this.nullGeometryFeatures_?delete this.nullGeometryFeatures_[e]:this.featuresRtree_&&this.featuresRtree_.remove(t),this.removeFeatureInternal(t)&&this.changed()}removeFeatureInternal(t){let e=at(t),i=this.featureChangeKeys_[e];if(!i)return;i.forEach(ut),delete this.featureChangeKeys_[e];let n=t.getId();return n!==void 0&&delete this.idIndex_[n.toString()],delete this.uidIndex_[e],this.dispatchEvent(new fi(Ne.REMOVEFEATURE,t)),t}removeFromIdIndex_(t){let e=!1;for(let i in this.idIndex_)if(this.idIndex_[i]===t){delete this.idIndex_[i],e=!0;break}return e}setLoader(t){this.loader_=t}setUrl(t){$(this.format_,7),this.url_=t,this.setLoader(Zh(t,this.format_))}},Es=Jh;var Md=ta(Kh(),1);var mg="#333",mr=class{constructor(t){t=t||{},this.font_=t.font,this.rotation_=t.rotation,this.rotateWithView_=t.rotateWithView,this.scale_=t.scale,this.scaleArray_=zt(t.scale!==void 0?t.scale:1),this.text_=t.text,this.textAlign_=t.textAlign,this.justify_=t.justify,this.repeat_=t.repeat,this.textBaseline_=t.textBaseline,this.fill_=t.fill!==void 0?t.fill:new di({color:mg}),this.maxAngle_=t.maxAngle!==void 0?t.maxAngle:Math.PI/4,this.placement_=t.placement!==void 0?t.placement:"point",this.overflow_=!!t.overflow,this.stroke_=t.stroke!==void 0?t.stroke:null,this.offsetX_=t.offsetX!==void 0?t.offsetX:0,this.offsetY_=t.offsetY!==void 0?t.offsetY:0,this.backgroundFill_=t.backgroundFill?t.backgroundFill:null,this.backgroundStroke_=t.backgroundStroke?t.backgroundStroke:null,this.padding_=t.padding===void 0?null:t.padding}clone(){let t=this.getScale();return new mr({font:this.getFont(),placement:this.getPlacement(),repeat:this.getRepeat(),maxAngle:this.getMaxAngle(),overflow:this.getOverflow(),rotation:this.getRotation(),rotateWithView:this.getRotateWithView(),scale:Array.isArray(t)?t.slice():t,text:this.getText(),textAlign:this.getTextAlign(),justify:this.getJustify(),textBaseline:this.getTextBaseline(),fill:this.getFill()?this.getFill().clone():void 0,stroke:this.getStroke()?this.getStroke().clone():void 0,offsetX:this.getOffsetX(),offsetY:this.getOffsetY(),backgroundFill:this.getBackgroundFill()?this.getBackgroundFill().clone():void 0,backgroundStroke:this.getBackgroundStroke()?this.getBackgroundStroke().clone():void 0,padding:this.getPadding()||void 0})}getOverflow(){return this.overflow_}getFont(){return this.font_}getMaxAngle(){return this.maxAngle_}getPlacement(){return this.placement_}getRepeat(){return this.repeat_}getOffsetX(){return this.offsetX_}getOffsetY(){return this.offsetY_}getFill(){return this.fill_}getRotateWithView(){return this.rotateWithView_}getRotation(){return this.rotation_}getScale(){return this.scale_}getScaleArray(){return this.scaleArray_}getStroke(){return this.stroke_}getText(){return this.text_}getTextAlign(){return this.textAlign_}getJustify(){return this.justify_}getTextBaseline(){return this.textBaseline_}getBackgroundFill(){return this.backgroundFill_}getBackgroundStroke(){return this.backgroundStroke_}getPadding(){return this.padding_}setOverflow(t){this.overflow_=t}setFont(t){this.font_=t}setMaxAngle(t){this.maxAngle_=t}setOffsetX(t){this.offsetX_=t}setOffsetY(t){this.offsetY_=t}setPlacement(t){this.placement_=t}setRepeat(t){this.repeat_=t}setRotateWithView(t){this.rotateWithView_=t}setFill(t){this.fill_=t}setRotation(t){this.rotation_=t}setScale(t){this.scale_=t,this.scaleArray_=zt(t!==void 0?t:1)}setStroke(t){this.stroke_=t}setText(t){this.text_=t}setTextAlign(t){this.textAlign_=t}setJustify(t){this.justify_=t}setTextBaseline(t){this.textBaseline_=t}setBackgroundFill(t){this.backgroundFill_=t}setBackgroundStroke(t){this.backgroundStroke_=t}setPadding(t){this.padding_=t}},gr=mr;function $h(s){return new Je({fill:pr(s,""),stroke:_r(s,""),text:gg(s),image:pg(s)})}function pr(s,t){let e=s[t+"fill-color"];if(!!e)return e==="none"?null:new di({color:e})}function _r(s,t){let e=s[t+"stroke-width"],i=s[t+"stroke-color"];if(!(!e&&!i))return new On({width:e,color:i,lineCap:s[t+"stroke-line-cap"],lineJoin:s[t+"stroke-line-join"],lineDash:s[t+"stroke-line-dash"],lineDashOffset:s[t+"stroke-line-dash-offset"],miterLimit:s[t+"stroke-miter-limit"]})}function gg(s){let t=s["text-value"];return t?new gr({text:t,font:s["text-font"],maxAngle:s["text-max-angle"],offsetX:s["text-offset-x"],offsetY:s["text-offset-y"],overflow:s["text-overflow"],placement:s["text-placement"],repeat:s["text-repeat"],scale:s["text-scale"],rotateWithView:s["text-rotate-with-view"],rotation:s["text-rotation"],textAlign:s["text-align"],justify:s["text-justify"],textBaseline:s["text-baseline"],padding:s["text-padding"],fill:pr(s,"text-"),backgroundFill:pr(s,"text-background-"),stroke:_r(s,"text-"),backgroundStroke:_r(s,"text-background-")}):void 0}function pg(s){let t=s["icon-src"],e=s["icon-img"];if(t||e)return new ki({src:t,img:e,imgSize:s["icon-img-size"],anchor:s["icon-anchor"],anchorOrigin:s["icon-anchor-origin"],anchorXUnits:s["icon-anchor-x-units"],anchorYUnits:s["icon-anchor-y-units"],color:s["icon-color"],crossOrigin:s["icon-cross-origin"],offset:s["icon-offset"],displacement:s["icon-displacement"],opacity:s["icon-opacity"],scale:s["icon-scale"],width:s["icon-width"],height:s["icon-height"],rotation:s["icon-rotation"],rotateWithView:s["icon-rotate-with-view"],size:s["icon-size"],declutterMode:s["icon-declutter-mode"]});let i=s["shape-points"];if(i){let o="shape-";return new Po({points:i,fill:pr(s,o),stroke:_r(s,o),radius:s["shape-radius"],radius1:s["shape-radius1"],radius2:s["shape-radius2"],angle:s["shape-angle"],displacement:s["shape-displacement"],rotation:s["shape-rotation"],rotateWithView:s["shape-rotate-with-view"],scale:s["shape-scale"],declutterMode:s["shape-declutter-mode"]})}let n=s["circle-radius"];if(n){let o="circle-";return new Pn({radius:n,fill:pr(s,o),stroke:_r(s,o),displacement:s["circle-displacement"],scale:s["circle-scale"],rotation:s["circle-rotation"],rotateWithView:s["circle-rotate-with-view"],declutterMode:s["circle-declutter-mode"]})}}var Ed={RENDER_ORDER:"renderOrder"},Qh=class extends Tn{constructor(t){t=t||{};let e=Object.assign({},t);delete e.style,delete e.renderBuffer,delete e.updateWhileAnimating,delete e.updateWhileInteracting,super(e),this.declutter_=t.declutter!==void 0?t.declutter:!1,this.renderBuffer_=t.renderBuffer!==void 0?t.renderBuffer:100,this.style_=null,this.styleFunction_=void 0,this.setStyle(t.style),this.updateWhileAnimating_=t.updateWhileAnimating!==void 0?t.updateWhileAnimating:!1,this.updateWhileInteracting_=t.updateWhileInteracting!==void 0?t.updateWhileInteracting:!1}getDeclutter(){return this.declutter_}getFeatures(t){return super.getFeatures(t)}getRenderBuffer(){return this.renderBuffer_}getRenderOrder(){return this.get(Ed.RENDER_ORDER)}getStyle(){return this.style_}getStyleFunction(){return this.styleFunction_}getUpdateWhileAnimating(){return this.updateWhileAnimating_}getUpdateWhileInteracting(){return this.updateWhileInteracting_}renderDeclutter(t){t.declutterTree||(t.declutterTree=new Md.default(9)),this.getRenderer().renderDeclutter(t)}setRenderOrder(t){this.set(Ed.RENDER_ORDER,t)}setStyle(t){let e;if(t===void 0)e=md;else if(t===null)e=null;else if(typeof t=="function")e=t;else if(t instanceof Je)e=t;else if(Array.isArray(t)){let i=t.length,n=new Array(i);for(let o=0;ol&&(this.instructions.push([et.CUSTOM,l,d,t,i,tn]),this.hitDetectionInstructions.push([et.CUSTOM,l,d,t,n||i,tn]));break;case"Point":u=t.getFlatCoordinates(),this.coordinates.push(u[0],u[1]),d=this.coordinates.length,this.instructions.push([et.CUSTOM,l,d,t,i]),this.hitDetectionInstructions.push([et.CUSTOM,l,d,t,n||i]);break;default:}this.endGeometry(e)}beginGeometry(t,e){this.beginGeometryInstruction1_=[et.BEGIN_GEOMETRY,e,0,t],this.instructions.push(this.beginGeometryInstruction1_),this.beginGeometryInstruction2_=[et.BEGIN_GEOMETRY,e,0,t],this.hitDetectionInstructions.push(this.beginGeometryInstruction2_)}finish(){return{instructions:this.instructions,hitDetectionInstructions:this.hitDetectionInstructions,coordinates:this.coordinates}}reverseHitDetectionInstructions(){let t=this.hitDetectionInstructions;t.reverse();let e,i=t.length,n,o,a=-1;for(e=0;ethis.maxLineWidth&&(this.maxLineWidth=i.lineWidth,this.bufferedMaxExtent_=null)}else i.strokeStyle=void 0,i.lineCap=void 0,i.lineDash=null,i.lineDashOffset=void 0,i.lineJoin=void 0,i.lineWidth=void 0,i.miterLimit=void 0}createFill(t){let e=t.fillStyle,i=[et.SET_FILL_STYLE,e];return typeof e!="string"&&i.push(!0),i}applyStroke(t){this.instructions.push(this.createStroke(t))}createStroke(t){return[et.SET_STROKE_STYLE,t.strokeStyle,t.lineWidth*this.pixelRatio,t.lineCap,t.lineJoin,t.miterLimit,this.applyPixelRatio(t.lineDash),t.lineDashOffset*this.pixelRatio]}updateFillStyle(t,e){let i=t.fillStyle;(typeof i!="string"||t.currentFillStyle!=i)&&(i!==void 0&&this.instructions.push(e.call(this,t)),t.currentFillStyle=i)}updateStrokeStyle(t,e){let i=t.strokeStyle,n=t.lineCap,o=t.lineDash,a=t.lineDashOffset,l=t.lineJoin,u=t.lineWidth,d=t.miterLimit;(t.currentStrokeStyle!=i||t.currentLineCap!=n||o!=t.currentLineDash&&!ie(t.currentLineDash,o)||t.currentLineDashOffset!=a||t.currentLineJoin!=l||t.currentLineWidth!=u||t.currentMiterLimit!=d)&&(i!==void 0&&e.call(this,t),t.currentStrokeStyle=i,t.currentLineCap=n,t.currentLineDash=o,t.currentLineDashOffset=a,t.currentLineJoin=l,t.currentLineWidth=u,t.currentMiterLimit=d)}endGeometry(t){this.beginGeometryInstruction1_[2]=this.instructions.length,this.beginGeometryInstruction1_=null,this.beginGeometryInstruction2_[2]=this.hitDetectionInstructions.length,this.beginGeometryInstruction2_=null;let e=[et.END_GEOMETRY,t];this.instructions.push(e),this.hitDetectionInstructions.push(e)}getBufferedMaxExtent(){if(!this.bufferedMaxExtent_&&(this.bufferedMaxExtent_=Xr(this.maxExtent),this.maxLineWidth>0)){let t=this.resolution*(this.maxLineWidth+1)/2;Xe(this.bufferedMaxExtent_,t,this.bufferedMaxExtent_)}return this.bufferedMaxExtent_}},gi=il;var nl=class extends gi{constructor(t,e,i,n){super(t,e,i,n),this.hitDetectionImage_=null,this.image_=null,this.imagePixelRatio_=void 0,this.anchorX_=void 0,this.anchorY_=void 0,this.height_=void 0,this.opacity_=void 0,this.originX_=void 0,this.originY_=void 0,this.rotateWithView_=void 0,this.rotation_=void 0,this.scale_=void 0,this.width_=void 0,this.declutterMode_=void 0,this.declutterImageWithText_=void 0}drawPoint(t,e){if(!this.image_)return;this.beginGeometry(t,e);let i=t.getFlatCoordinates(),n=t.getStride(),o=this.coordinates.length,a=this.appendFlatPointCoordinates(i,n);this.instructions.push([et.DRAW_IMAGE,o,a,this.image_,this.anchorX_*this.imagePixelRatio_,this.anchorY_*this.imagePixelRatio_,Math.ceil(this.height_*this.imagePixelRatio_),this.opacity_,this.originX_*this.imagePixelRatio_,this.originY_*this.imagePixelRatio_,this.rotateWithView_,this.rotation_,[this.scale_[0]*this.pixelRatio/this.imagePixelRatio_,this.scale_[1]*this.pixelRatio/this.imagePixelRatio_],Math.ceil(this.width_*this.imagePixelRatio_),this.declutterMode_,this.declutterImageWithText_]),this.hitDetectionInstructions.push([et.DRAW_IMAGE,o,a,this.hitDetectionImage_,this.anchorX_,this.anchorY_,this.height_,1,this.originX_,this.originY_,this.rotateWithView_,this.rotation_,this.scale_,this.width_,this.declutterMode_,this.declutterImageWithText_]),this.endGeometry(e)}drawMultiPoint(t,e){if(!this.image_)return;this.beginGeometry(t,e);let i=t.getFlatCoordinates(),n=t.getStride(),o=this.coordinates.length,a=this.appendFlatPointCoordinates(i,n);this.instructions.push([et.DRAW_IMAGE,o,a,this.image_,this.anchorX_*this.imagePixelRatio_,this.anchorY_*this.imagePixelRatio_,Math.ceil(this.height_*this.imagePixelRatio_),this.opacity_,this.originX_*this.imagePixelRatio_,this.originY_*this.imagePixelRatio_,this.rotateWithView_,this.rotation_,[this.scale_[0]*this.pixelRatio/this.imagePixelRatio_,this.scale_[1]*this.pixelRatio/this.imagePixelRatio_],Math.ceil(this.width_*this.imagePixelRatio_),this.declutterMode_,this.declutterImageWithText_]),this.hitDetectionInstructions.push([et.DRAW_IMAGE,o,a,this.hitDetectionImage_,this.anchorX_,this.anchorY_,this.height_,1,this.originX_,this.originY_,this.rotateWithView_,this.rotation_,this.scale_,this.width_,this.declutterMode_,this.declutterImageWithText_]),this.endGeometry(e)}finish(){return this.reverseHitDetectionInstructions(),this.anchorX_=void 0,this.anchorY_=void 0,this.hitDetectionImage_=null,this.image_=null,this.imagePixelRatio_=void 0,this.height_=void 0,this.scale_=void 0,this.opacity_=void 0,this.originX_=void 0,this.originY_=void 0,this.rotateWithView_=void 0,this.rotation_=void 0,this.width_=void 0,super.finish()}setImageStyle(t,e){let i=t.getAnchor(),n=t.getSize(),o=t.getOrigin();this.imagePixelRatio_=t.getPixelRatio(this.pixelRatio),this.anchorX_=i[0],this.anchorY_=i[1],this.hitDetectionImage_=t.getHitDetectionImage(),this.image_=t.getImage(this.pixelRatio),this.height_=n[1],this.opacity_=t.getOpacity(),this.originX_=o[0],this.originY_=o[1],this.rotateWithView_=t.getRotateWithView(),this.rotation_=t.getRotation(),this.scale_=t.getScaleArray(),this.width_=n[0],this.declutterMode_=t.getDeclutterMode(),this.declutterImageWithText_=e}},Cd=nl;var sl=class extends gi{constructor(t,e,i,n){super(t,e,i,n)}drawFlatCoordinates_(t,e,i,n){let o=this.coordinates.length,a=this.appendFlatLineCoordinates(t,e,i,n,!1,!1),l=[et.MOVE_TO_LINE_TO,o,a];return this.instructions.push(l),this.hitDetectionInstructions.push(l),i}drawLineString(t,e){let i=this.state,n=i.strokeStyle,o=i.lineWidth;if(n===void 0||o===void 0)return;this.updateStrokeStyle(i,this.applyStroke),this.beginGeometry(t,e),this.hitDetectionInstructions.push([et.SET_STROKE_STYLE,i.strokeStyle,i.lineWidth,i.lineCap,i.lineJoin,i.miterLimit,xe,Ee],Ni);let a=t.getFlatCoordinates(),l=t.getStride();this.drawFlatCoordinates_(a,0,a.length,l),this.hitDetectionInstructions.push(mi),this.endGeometry(e)}drawMultiLineString(t,e){let i=this.state,n=i.strokeStyle,o=i.lineWidth;if(n===void 0||o===void 0)return;this.updateStrokeStyle(i,this.applyStroke),this.beginGeometry(t,e),this.hitDetectionInstructions.push([et.SET_STROKE_STYLE,i.strokeStyle,i.lineWidth,i.lineCap,i.lineJoin,i.miterLimit,xe,Ee],Ni);let a=t.getEnds(),l=t.getFlatCoordinates(),u=t.getStride(),d=0;for(let m=0,x=a.length;m=s){let T=(s-l+C)/C,w=_e(d,x,T),M=_e(m,E,T);u.push(w,M),o.push(u),u=[w,M],l==s&&(a+=n),l=0}else if(l0&&o.push(u),o}function Rd(s,t,e,i,n){let o=e,a=e,l=0,u=0,d=e,m,x,E,C,T,w,M,v,I,L;for(x=e;xs&&(u>l&&(l=u,o=d,a=x),u=0,d=x-n)),E=C,M=I,v=L),T=b,w=P}return u+=C,u>l?[d,x]:[o,a]}var Er={left:0,center:.5,right:1,top:0,middle:.5,hanging:.2,alphabetic:.8,ideographic:.8,bottom:1},al=class extends gi{constructor(t,e,i,n){super(t,e,i,n),this.labels_=null,this.text_="",this.textOffsetX_=0,this.textOffsetY_=0,this.textRotateWithView_=void 0,this.textRotation_=0,this.textFillState_=null,this.fillStates={},this.fillStates[Kt]={fillStyle:Kt},this.textStrokeState_=null,this.strokeStates={},this.textState_={},this.textStates={},this.textKey_="",this.fillKey_="",this.strokeKey_="",this.declutterImageWithText_=void 0}finish(){let t=super.finish();return t.textStates=this.textStates,t.fillStates=this.fillStates,t.strokeStates=this.strokeStates,t}drawText(t,e){let i=this.textFillState_,n=this.textStrokeState_,o=this.textState_;if(this.text_===""||!o||!i&&!n)return;let a=this.coordinates,l=a.length,u=t.getType(),d=null,m=t.getStride();if(o.placement==="line"&&(u=="LineString"||u=="MultiLineString"||u=="Polygon"||u=="MultiPolygon")){if(!Ft(this.getBufferedMaxExtent(),t.getExtent()))return;let x;if(d=t.getFlatCoordinates(),u=="LineString")x=[d.length];else if(u=="MultiLineString")x=t.getEnds();else if(u=="Polygon")x=t.getEnds().slice(0,1);else if(u=="MultiPolygon"){let w=t.getEndss();x=[];for(let M=0,v=w.length;M{let b=a[(v+L)*2]===d[L*m]&&a[(v+L)*2+1]===d[L*m+1];return b||--v,b})}this.saveTextStates_(),(o.backgroundFill||o.backgroundStroke)&&(this.setFillStrokeStyle(o.backgroundFill,o.backgroundStroke),o.backgroundFill&&this.updateFillStyle(this.state,this.createFill),o.backgroundStroke&&(this.updateStrokeStyle(this.state,this.applyStroke),this.hitDetectionInstructions.push(this.createStroke(this.state)))),this.beginGeometry(t,e);let C=o.padding;if(C!=Oi&&(o.scale[0]<0||o.scale[1]<0)){let v=o.padding[0],I=o.padding[1],L=o.padding[2],b=o.padding[3];o.scale[0]<0&&(I=-I,b=-b),o.scale[1]<0&&(v=-v,L=-L),C=[v,I,L,b]}let T=this.pixelRatio;this.instructions.push([et.DRAW_IMAGE,l,E,null,NaN,NaN,NaN,1,0,0,this.textRotateWithView_,this.textRotation_,[1,1],NaN,void 0,this.declutterImageWithText_,C==Oi?Oi:C.map(function(v){return v*T}),!!o.backgroundFill,!!o.backgroundStroke,this.text_,this.textKey_,this.strokeKey_,this.fillKey_,this.textOffsetX_,this.textOffsetY_,x]);let w=1/T,M=this.state.fillStyle;o.backgroundFill&&(this.state.fillStyle=Kt,this.hitDetectionInstructions.push(this.createFill(this.state))),this.hitDetectionInstructions.push([et.DRAW_IMAGE,l,E,null,NaN,NaN,NaN,1,0,0,this.textRotateWithView_,this.textRotation_,[w,w],NaN,void 0,this.declutterImageWithText_,C,!!o.backgroundFill,!!o.backgroundStroke,this.text_,this.textKey_,this.strokeKey_,this.fillKey_?Kt:this.fillKey_,this.textOffsetX_,this.textOffsetY_,x]),o.backgroundFill&&(this.state.fillStyle=M,this.hitDetectionInstructions.push(this.createFill(this.state))),this.endGeometry(e)}}saveTextStates_(){let t=this.textStrokeState_,e=this.textState_,i=this.textFillState_,n=this.strokeKey_;t&&(n in this.strokeStates||(this.strokeStates[n]={strokeStyle:t.strokeStyle,lineCap:t.lineCap,lineDashOffset:t.lineDashOffset,lineWidth:t.lineWidth,lineJoin:t.lineJoin,miterLimit:t.miterLimit,lineDash:t.lineDash}));let o=this.textKey_;o in this.textStates||(this.textStates[o]={font:e.font,textAlign:e.textAlign||nn,justify:e.justify,textBaseline:e.textBaseline||bn,scale:e.scale});let a=this.fillKey_;i&&(a in this.fillStates||(this.fillStates[a]={fillStyle:i.fillStyle}))}drawChars_(t,e){let i=this.textStrokeState_,n=this.textState_,o=this.strokeKey_,a=this.textKey_,l=this.fillKey_;this.saveTextStates_();let u=this.pixelRatio,d=Er[n.textBaseline],m=this.textOffsetY_*u,x=this.text_,E=i?i.lineWidth*Math.abs(n.scale[0])/2:0;this.instructions.push([et.DRAW_CHARS,t,e,d,n.overflow,l,n.maxAngle,u,m,o,E*u,x,a,1]),this.hitDetectionInstructions.push([et.DRAW_CHARS,t,e,d,n.overflow,l&&Kt,n.maxAngle,1,m,o,E,x,a,1/u])}setTextStyle(t,e){let i,n,o;if(!t)this.text_="";else{let a=t.getFill();a?(n=this.textFillState_,n||(n={},this.textFillState_=n),n.fillStyle=Me(a.getColor()||Kt)):(n=null,this.textFillState_=n);let l=t.getStroke();if(!l)o=null,this.textStrokeState_=o;else{o=this.textStrokeState_,o||(o={},this.textStrokeState_=o);let T=l.getLineDash(),w=l.getLineDashOffset(),M=l.getWidth(),v=l.getMiterLimit();o.lineCap=l.getLineCap()||wn,o.lineDash=T?T.slice():xe,o.lineDashOffset=w===void 0?Ee:w,o.lineJoin=l.getLineJoin()||ai,o.lineWidth=M===void 0?Fi:M,o.miterLimit=v===void 0?Ai:v,o.strokeStyle=Me(l.getColor()||Pi)}i=this.textState_;let u=t.getFont()||po;Su(u);let d=t.getScaleArray();i.overflow=t.getOverflow(),i.font=u,i.maxAngle=t.getMaxAngle(),i.placement=t.getPlacement(),i.textAlign=t.getTextAlign(),i.repeat=t.getRepeat(),i.justify=t.getJustify(),i.textBaseline=t.getTextBaseline()||bn,i.backgroundFill=t.getBackgroundFill(),i.backgroundStroke=t.getBackgroundStroke(),i.padding=t.getPadding()||Oi,i.scale=d===void 0?[1,1]:d;let m=t.getOffsetX(),x=t.getOffsetY(),E=t.getRotateWithView(),C=t.getRotation();this.text_=t.getText()||"",this.textOffsetX_=m===void 0?0:m,this.textOffsetY_=x===void 0?0:x,this.textRotateWithView_=E===void 0?!1:E,this.textRotation_=C===void 0?0:C,this.strokeKey_=o?(typeof o.strokeStyle=="string"?o.strokeStyle:at(o.strokeStyle))+o.lineCap+o.lineDashOffset+"|"+o.lineWidth+o.lineJoin+o.miterLimit+"["+o.lineDash.join()+"]":"",this.textKey_=i.font+i.scale+(i.textAlign||"?")+(i.repeat||"?")+(i.justify||"?")+(i.textBaseline||"?"),this.fillKey_=n?typeof n.fillStyle=="string"?n.fillStyle:"|"+at(n.fillStyle):""}this.declutterImageWithText_=e}},Id=al;var _g={Circle:ol,Default:gi,Image:Cd,LineString:Sd,Polygon:ol,Text:Id},hl=class{constructor(t,e,i,n){this.tolerance_=t,this.maxExtent_=e,this.pixelRatio_=n,this.resolution_=i,this.buildersByZIndex_={}}finish(){let t={};for(let e in this.buildersByZIndex_){t[e]=t[e]||{};let i=this.buildersByZIndex_[e];for(let n in i){let o=i[n].finish();t[e][n]=o}}return t}getBuilder(t,e){let i=t!==void 0?t.toString():"0",n=this.buildersByZIndex_[i];n===void 0&&(n={},this.buildersByZIndex_[i]=n);let o=n[e];if(o===void 0){let a=_g[e];o=new a(this.tolerance_,this.maxExtent_,this.resolution_,this.pixelRatio_),n[e]=o}return o}},ll=hl;var cl=class extends Dr{constructor(t){super(),this.ready=!0,this.boundHandleImageChange_=this.handleImageChange_.bind(this),this.layer_=t,this.declutterExecutorGroup=null}getFeatures(t){return ft()}getData(t){return null}prepareFrame(t){return ft()}renderFrame(t,e){return ft()}loadedTileCallback(t,e,i){t[e]||(t[e]={}),t[e][i.tileCoord.toString()]=i}createLoadedTileFinder(t,e,i){return(n,o)=>{let a=this.loadedTileCallback.bind(this,i,n);return t.forEachLoadedTile(e,n,o,a)}}forEachFeatureAtCoordinate(t,e,i,n,o){}getLayer(){return this.layer_}handleFontsChanged(){}handleImageChange_(t){let e=t.target;(e.getState()===Rt.LOADED||e.getState()===Rt.ERROR)&&this.renderIfReadyAndVisible()}loadImage(t){let e=t.getState();return e!=Rt.LOADED&&e!=Rt.ERROR&&t.addEventListener(q.CHANGE,this.boundHandleImageChange_),e==Rt.IDLE&&(t.load(),e=t.getState()),e==Rt.LOADED}renderIfReadyAndVisible(){let t=this.getLayer();t&&t.getVisible()&&t.getSourceState()==="ready"&&t.changed()}disposeInternal(){delete this.layer_,super.disposeInternal()}},wd=cl;var dl=[],Ms=null;function yg(){Ms=Lt(1,1,void 0,{willReadFrequently:!0})}var ul=class extends wd{constructor(t){super(t),this.container=null,this.renderedResolution,this.tempTransform=ne(),this.pixelTransform=ne(),this.inversePixelTransform=ne(),this.context=null,this.containerReused=!1,this.pixelContext_=null,this.frameState=null}getImageData(t,e,i){Ms||yg(),Ms.clearRect(0,0,1,1);let n;try{Ms.drawImage(t,e,i,1,1,0,0,1,1),n=Ms.getImageData(0,0,1,1).data}catch{return Ms=null,null}return n}getBackground(t){let i=this.getLayer().getBackground();return typeof i=="function"&&(i=i(t.viewState.resolution)),i||void 0}useContainer(t,e,i){let n=this.getLayer().getClassName(),o,a;if(t&&t.className===n&&(!i||t&&t.style.backgroundColor&&ie(yn(t.style.backgroundColor),yn(i)))){let l=t.firstElementChild;l instanceof HTMLCanvasElement&&(a=l.getContext("2d"))}if(a&&a.canvas.style.transform===e?(this.container=t,this.context=a,this.containerReused=!0):this.containerReused?(this.container=null,this.context=null,this.containerReused=!1):this.container&&(this.container.style.backgroundColor=null),!this.container){o=document.createElement("div"),o.className=n;let l=o.style;l.position="absolute",l.width="100%",l.height="100%",a=Lt();let u=a.canvas;o.appendChild(u),l=u.style,l.position="absolute",l.left="0",l.transformOrigin="top left",this.container=o,this.context=a}!this.containerReused&&i&&!this.container.style.backgroundColor&&(this.container.style.backgroundColor=i)}clipUnrotated(t,e,i){let n=Ae(i),o=es(i),a=ts(i),l=Qn(i);Ot(e.coordinateToPixelTransform,n),Ot(e.coordinateToPixelTransform,o),Ot(e.coordinateToPixelTransform,a),Ot(e.coordinateToPixelTransform,l);let u=this.inversePixelTransform;Ot(u,n),Ot(u,o),Ot(u,a),Ot(u,l),t.save(),t.beginPath(),t.moveTo(Math.round(n[0]),Math.round(n[1])),t.lineTo(Math.round(o[0]),Math.round(o[1])),t.lineTo(Math.round(a[0]),Math.round(a[1])),t.lineTo(Math.round(l[0]),Math.round(l[1])),t.clip()}dispatchRenderEvent_(t,e,i){let n=this.getLayer();if(n.hasListener(t)){let o=new fo(t,this.inversePixelTransform,i,e);n.dispatchEvent(o)}}preRender(t,e){this.frameState=e,this.dispatchRenderEvent_(de.PRERENDER,t,e)}postRender(t,e){this.dispatchRenderEvent_(de.POSTRENDER,t,e)}getRenderTransform(t,e,i,n,o,a,l){let u=o/2,d=a/2,m=n/e,x=-m,E=-t[0]+l,C=-t[1];return ue(this.tempTransform,u,d,m,x,-i,E,C)}disposeInternal(){delete this.frameState,super.disposeInternal()}},No=ul;function bd(s,t,e,i,n,o,a,l,u,d,m,x){let E=s[t],C=s[t+1],T=0,w=0,M=0,v=0;function I(){T=E,w=C,t+=i,E=s[t],C=s[t+1],v+=M,M=Math.sqrt((E-T)*(E-T)+(C-w)*(C-w))}do I();while(tV[2]}else Z=b>W;let it=Math.PI,rt=[],Ct=F+i===t;t=F,M=0,v=N,E=s[t],C=s[t+1];let tt;if(Ct){I(),tt=Math.atan2(C-w,E-T),Z&&(tt+=tt>0?-it:it);let V=(W+b)/2,K=(Y+P)/2;return rt[0]=[V,K,(G-o)/2,tt,n],rt}n=n.replace(/\n/g," ");for(let V=0,K=n.length;V0?-it:it),tt!==void 0){let _t=H-tt;if(_t+=_t>it?-2*it:_t<-it?2*it:0,Math.abs(_t)>a)return null}tt=H;let dt=V,lt=0;for(;V0&&s.push(` +`,""),s.push(t,""),s}var ml=class{constructor(t,e,i,n){this.overlaps=i,this.pixelRatio=e,this.resolution=t,this.alignFill_,this.instructions=n.instructions,this.coordinates=n.coordinates,this.coordinateCache_={},this.renderedTransform_=ne(),this.hitDetectionInstructions=n.hitDetectionInstructions,this.pixelCoordinates_=null,this.viewRotation_=0,this.fillStates=n.fillStates||{},this.strokeStates=n.strokeStates||{},this.textStates=n.textStates||{},this.widths_={},this.labels_={}}createLabel(t,e,i,n){let o=t+e+i+n;if(this.labels_[o])return this.labels_[o];let a=n?this.strokeStates[n]:null,l=i?this.fillStates[i]:null,u=this.textStates[e],d=this.pixelRatio,m=[u.scale[0]*d,u.scale[1]*d],x=Array.isArray(t),E=u.justify?Er[u.justify]:fl(Array.isArray(t)?t[0]:t,u.textAlign||nn),C=n&&a.lineWidth?a.lineWidth:0,T=x?t:t.split(` +`).reduce(xg,[]),{width:w,height:M,widths:v,heights:I,lineWidths:L}=Ru(u,T),b=w+C,P=[],F=(b+2)*m[0],N=(M+C)*m[1],G={width:F<0?Math.floor(F):Math.ceil(F),height:N<0?Math.floor(N):Math.ceil(N),contextInstructions:P};(m[0]!=1||m[1]!=1)&&P.push("scale",m),n&&(P.push("strokeStyle",a.strokeStyle),P.push("lineWidth",C),P.push("lineCap",a.lineCap),P.push("lineJoin",a.lineJoin),P.push("miterLimit",a.miterLimit),P.push("setLineDash",[a.lineDash]),P.push("lineDashOffset",a.lineDashOffset)),i&&P.push("fillStyle",l.fillStyle),P.push("textBaseline","middle"),P.push("textAlign","center");let W=.5-E,Y=E*b+W*C,Z=[],it=[],rt=0,Ct=0,tt=0,V=0,K;for(let H=0,dt=T.length;Ht?t-d:o,b=a+m>e?e-m:a,P=T[3]+L*E[0]+T[1],F=T[0]+b*E[1]+T[2],N=v-T[3],G=I-T[0];(w||x!==0)&&(an[0]=N,hn[0]=N,an[1]=G,Di[1]=G,Di[0]=N+P,Gi[0]=Di[0],Gi[1]=G+F,hn[1]=Gi[1]);let W;return x!==0?(W=ue(ne(),i,n,1,1,x,-i,-n),Ot(W,an),Ot(W,Di),Ot(W,Gi),Ot(W,hn),Se(Math.min(an[0],Di[0],Gi[0],hn[0]),Math.min(an[1],Di[1],Gi[1],hn[1]),Math.max(an[0],Di[0],Gi[0],hn[0]),Math.max(an[1],Di[1],Gi[1],hn[1]),vs)):Se(Math.min(N,N+P),Math.min(G,G+F),Math.max(N,N+P),Math.max(G,G+F),vs),C&&(v=Math.round(v),I=Math.round(I)),{drawImageX:v,drawImageY:I,drawImageW:L,drawImageH:b,originX:d,originY:m,declutterBox:{minX:vs[0],minY:vs[1],maxX:vs[2],maxY:vs[3],value:M},canvasTransform:W,scale:E}}replayImageOrLabel_(t,e,i,n,o,a,l){let u=!!(a||l),d=n.declutterBox,m=t.canvas,x=l?l[2]*n.scale[0]/2:0;return d.minX-x<=m.width/e&&d.maxX+x>=0&&d.minY-x<=m.height/e&&d.maxY+x>=0&&(u&&this.replayTextBackground_(t,an,Di,Gi,hn,a,l),Iu(t,n.canvasTransform,o,i,n.originX,n.originY,n.drawImageW,n.drawImageH,n.drawImageX,n.drawImageY,n.scale)),!0}fill_(t){if(this.alignFill_){let e=Ot(this.renderedTransform_,[0,0]),i=512*this.pixelRatio;t.save(),t.translate(e[0]%i,e[1]%i),t.rotate(this.viewRotation_)}t.fill(),this.alignFill_&&t.restore()}setStrokeStyle_(t,e){t.strokeStyle=e[1],t.lineWidth=e[2],t.lineCap=e[3],t.lineJoin=e[4],t.miterLimit=e[5],t.lineDashOffset=e[7],t.setLineDash(e[6])}drawLabelWithPointPlacement_(t,e,i,n){let o=this.textStates[e],a=this.createLabel(t,e,n,i),l=this.strokeStates[i],u=this.pixelRatio,d=fl(Array.isArray(t)?t[0]:t,o.textAlign||nn),m=Er[o.textBaseline||bn],x=l&&l.lineWidth?l.lineWidth:0,E=a.width/u-2*o.scale[0],C=d*E+2*(.5-d)*x,T=m*a.height/u+2*(.5-m)*x;return{label:a,anchorX:C,anchorY:T}}execute_(t,e,i,n,o,a,l,u){let d;this.pixelCoordinates_&&ie(i,this.renderedTransform_)?d=this.pixelCoordinates_:(this.pixelCoordinates_||(this.pixelCoordinates_=[]),d=Fe(this.coordinates,0,this.coordinates.length,2,i,this.pixelCoordinates_),xc(this.renderedTransform_,i));let m=0,x=n.length,E=0,C,T,w,M,v,I,L,b,P,F,N,G,W=0,Y=0,Z=null,it=null,rt=this.coordinateCache_,Ct=this.viewRotation_,tt=Math.round(Math.atan2(-i[1],i[0])*1e12)/1e12,V={context:t,pixelRatio:this.pixelRatio,resolution:this.resolution,rotation:Ct},K=this.instructions!=n||this.overlaps?0:200,H,dt,lt,At;for(;mK&&(this.fill_(t),W=0),Y>K&&(t.stroke(),Y=0),!W&&!Y&&(t.beginPath(),M=NaN,v=NaN),++m;break;case et.CIRCLE:E=U[1];let _t=d[E],Mt=d[E+1],ti=d[E+2],he=d[E+3],Dt=ti-_t,Ie=he-Mt,Ut=Math.sqrt(Dt*Dt+Ie*Ie);t.moveTo(_t+Ut,Mt),t.arc(_t,Mt,Ut,0,2*Math.PI,!0),++m;break;case et.CLOSE_PATH:t.closePath(),++m;break;case et.CUSTOM:E=U[1],C=U[2];let ln=U[3],pi=U[4],zi=U.length==6?U[5]:void 0;V.geometry=ln,V.feature=H,m in rt||(rt[m]=[]);let De=rt[m];zi?zi(d,E,C,2,De):(De[0]=d[E],De[1]=d[E+1],De.length=2),pi(De,V),++m;break;case et.DRAW_IMAGE:E=U[1],C=U[2],b=U[3],T=U[4],w=U[5];let cn=U[6],we=U[7],Nn=U[8],Dn=U[9],Gn=U[10],_i=U[11],ws=U[12],Qt=U[13],me=U[14],ve=U[15];if(!b&&U.length>=20){P=U[19],F=U[20],N=U[21],G=U[22];let bt=this.drawLabelWithPointPlacement_(P,F,N,G);b=bt.label,U[3]=b;let mt=U[23];T=(bt.anchorX-mt)*this.pixelRatio,U[4]=T;let qt=U[24];w=(bt.anchorY-qt)*this.pixelRatio,U[5]=w,cn=b.height,U[6]=cn,Qt=b.width,U[13]=Qt}let Ge;U.length>25&&(Ge=U[25]);let Ce,yi,ei;U.length>17?(Ce=U[16],yi=U[17],ei=U[18]):(Ce=Oi,yi=!1,ei=!1),Gn&&tt?_i+=Ct:!Gn&&!tt&&(_i-=Ct);let Ui=0;for(;E0){if(!a||C!=="Image"&&C!=="Text"||a.includes(P)){let Y=(E[G]-3)/4,Z=n-Y%l,it=n-(Y/l|0),rt=o(P,F,Z*Z+it*it);if(rt)return rt}m.clearRect(0,0,l,l);break}}let w=Object.keys(this.executorsByZIndex_).map(Number);w.sort(ni);let M,v,I,L,b;for(M=w.length-1;M>=0;--M){let P=w[M].toString();for(I=this.executorsByZIndex_[P],v=gl.length-1;v>=0;--v)if(C=gl[v],L=I[C],L!==void 0&&(b=L.executeHitDetection(m,u,i,T,x),b))return b}}getClipCoords(t){let e=this.maxExtent_;if(!e)return null;let i=e[0],n=e[1],o=e[2],a=e[3],l=[i,n,i,a,o,a,o,n];return Fe(l,0,8,2,t,l),l}isEmpty(){return Ti(this.executorsByZIndex_)}execute(t,e,i,n,o,a,l){let u=Object.keys(this.executorsByZIndex_).map(Number);u.sort(ni),this.maxExtent_&&(t.save(),this.clip(t,i)),a=a||gl;let d,m,x,E,C,T;for(l&&u.reverse(),d=0,m=u.length;de)break;let u=i[l];u||(u=[],i[l]=u),u.push(((s+o)*t+(s+a))*4+3),o>0&&u.push(((s-o)*t+(s+a))*4+3),a>0&&(u.push(((s+o)*t+(s-a))*4+3),o>0&&u.push(((s-o)*t+(s-a))*4+3))}let n=[];for(let o=0,a=i.length;ox*this.pixelRatio_),lineDashOffset:(a||Ee)*this.pixelRatio_,lineJoin:l!==void 0?l:ai,lineWidth:(u!==void 0?u:Fi)*this.pixelRatio_,miterLimit:d!==void 0?d:Ai,strokeStyle:Me(i||Pi)}}}setImageStyle(t){let e;if(!t||!(e=t.getSize())){this.image_=null;return}let i=t.getPixelRatio(this.pixelRatio_),n=t.getAnchor(),o=t.getOrigin();this.image_=t.getImage(this.pixelRatio_),this.imageAnchorX_=n[0]*i,this.imageAnchorY_=n[1]*i,this.imageHeight_=e[1]*i,this.imageOpacity_=t.getOpacity(),this.imageOriginX_=o[0],this.imageOriginY_=o[1],this.imageRotateWithView_=t.getRotateWithView(),this.imageRotation_=t.getRotation();let a=t.getScaleArray();this.imageScale_=[a[0]*this.pixelRatio_/i,a[1]*this.pixelRatio_/i],this.imageWidth_=e[0]*i}setTextStyle(t){if(!t)this.text_="";else{let e=t.getFill();if(!e)this.textFillState_=null;else{let C=e.getColor();this.textFillState_={fillStyle:Me(C||Kt)}}let i=t.getStroke();if(!i)this.textStrokeState_=null;else{let C=i.getColor(),T=i.getLineCap(),w=i.getLineDash(),M=i.getLineDashOffset(),v=i.getLineJoin(),I=i.getWidth(),L=i.getMiterLimit();this.textStrokeState_={lineCap:T!==void 0?T:wn,lineDash:w||xe,lineDashOffset:M||Ee,lineJoin:v!==void 0?v:ai,lineWidth:I!==void 0?I:Fi,miterLimit:L!==void 0?L:Ai,strokeStyle:Me(C||Pi)}}let n=t.getFont(),o=t.getOffsetX(),a=t.getOffsetY(),l=t.getRotateWithView(),u=t.getRotation(),d=t.getScaleArray(),m=t.getText(),x=t.getTextAlign(),E=t.getTextBaseline();this.textState_={font:n!==void 0?n:po,textAlign:x!==void 0?x:nn,textBaseline:E!==void 0?E:bn},this.text_=m!==void 0?Array.isArray(m)?m.reduce((C,T,w)=>C+=w%2?" ":T,""):m:"",this.textOffsetX_=o!==void 0?this.pixelRatio_*o:0,this.textOffsetY_=a!==void 0?this.pixelRatio_*a:0,this.textRotateWithView_=l!==void 0?l:!1,this.textRotation_=u!==void 0?u:0,this.textScale_=[this.pixelRatio_*d[0],this.pixelRatio_*d[1]]}}},Fd=xl;var $e=.5;function kd(s,t,e,i,n,o,a){let l=s[0]*$e,u=s[1]*$e,d=Lt(l,u);d.imageSmoothingEnabled=!1;let m=d.canvas,x=new Fd(d,$e,n,null,a),E=e.length,C=Math.floor((256*256*256-1)/E),T={};for(let M=1;M<=E;++M){let v=e[M-1],I=v.getStyleFunction()||i;if(!I)continue;let L=I(v,o);if(!L)continue;Array.isArray(L)||(L=[L]);let P=(M*C).toString(16).padStart(7,"#00000");for(let F=0,N=L.length;F{if(!this.hitDetectionImageData_&&!this.animatingOrInteracting_){let i=[this.context.canvas.width,this.context.canvas.height];Ot(this.pixelTransform,i);let n=this.renderedCenter_,o=this.renderedResolution_,a=this.renderedRotation_,l=this.renderedProjection_,u=this.wrappedRenderedExtent_,d=this.getLayer(),m=[],x=i[0]*$e,E=i[1]*$e;m.push(this.getRenderTransform(n,o,a,$e,x,E,0).slice());let C=d.getSource(),T=l.getExtent();if(C.getWrapX()&&l.canWrapX()&&!Ye(T,u)){let w=u[0],M=gt(T),v=0,I;for(;wT[2];)++v,I=M*v,m.push(this.getRenderTransform(n,o,a,$e,x,E,I).slice()),w-=M}this.hitDetectionImageData_=kd(i,m,this.renderedFeatures_,d.getStyleFunction(),u,o,a)}e(Nd(t,this.renderedFeatures_,this.hitDetectionImageData_))})}forEachFeatureAtCoordinate(t,e,i,n,o){if(!this.replayGroup_)return;let a=e.viewState.resolution,l=e.viewState.rotation,u=this.getLayer(),d={},m=function(C,T,w){let M=at(C),v=d[M];if(v){if(v!==!0&&wx=C.forEachFeatureAtCoordinate(t,a,l,i,m,C===this.declutterExecutorGroup&&e.declutterTree?e.declutterTree.all().map(T=>T.value):null)),x}handleFontsChanged(){let t=this.getLayer();t.getVisible()&&this.replayGroup_&&t.changed()}handleStyleImageChange_(t){this.renderIfReadyAndVisible()}prepareFrame(t){let e=this.getLayer(),i=e.getSource();if(!i)return!1;let n=t.viewHints[Yt.ANIMATING],o=t.viewHints[Yt.INTERACTING],a=e.getUpdateWhileAnimating(),l=e.getUpdateWhileInteracting();if(this.ready&&!a&&n||!l&&o)return this.animatingOrInteracting_=!0,!0;this.animatingOrInteracting_=!1;let u=t.extent,d=t.viewState,m=d.projection,x=d.resolution,E=t.pixelRatio,C=e.getRevision(),T=e.getRenderBuffer(),w=e.getRenderOrder();w===void 0&&(w=Gd);let M=d.center.slice(),v=Xe(u,T*x),I=v.slice(),L=[v.slice()],b=m.getExtent();if(i.getWrapX()&&m.canWrapX()&&!Ye(b,t.extent)){let V=gt(b),K=Math.max(gt(v)/2,V);v[0]=b[0]-K,v[2]=b[2]+K,no(M,m);let H=ca(L[0],m);H[0]b[0]&&H[2]>b[2]&&L.push([H[0]-V,H[1],H[2]-V,H[3]])}if(this.ready&&this.renderedResolution_==x&&this.renderedRevision_==C&&this.renderedRenderOrder_==w&&Ye(this.wrappedRenderedExtent_,v))return ie(this.renderedExtent_,I)||(this.hitDetectionImageData_=null,this.renderedExtent_=I),this.renderedCenter_=M,this.replayGroupChanged=!1,!0;this.replayGroup_=null;let P=new ll(Do(x,E),v,x,E),F;this.getLayer().getDeclutter()&&(F=new ll(Do(x,E),v,x,E));let N=ao(),G;if(N){for(let V=0,K=L.length;V{let K,H=V.getStyleFunction()||e.getStyleFunction();if(H&&(K=H(V,x)),K){let dt=this.renderFeature(V,W,K,P,G,F);Y=Y&&!dt}},it=ls(v,m),rt=i.getFeaturesInExtent(it);w&&rt.sort(w);for(let V=0,K=rt.length;V{this.handleNoGeolocation(i)}):this.handleNoGeolocation({message:"Geolokation er ikke tilg\xE6ngelig."})}};var Xd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD////e7f+T0aD17PT89Pzs5PTf3OTs7Pzk5PT09Pzs7PTc5Pzc5PTk7Py3ub3T3OvU5PzU5PTc7Pzk7PTFxsfK2OLZ4+rS7Pzc7PTn9Pq44fHB7Pzb9PzU7PS58/yhqqrz/PzO0dGcyLSUxKyM1KyUzKyE1KSM3KycxKyMzKWU1Kyb3LSTwaOoyrSM1KSU3KyczKyM3KSE3J2UzKSc1Kym2bWc5rCm5LakwqyLyZqU1KSM1JyU3KSf3Kxli212oH+Fs4+cxKSkzKyczKSc1KSU3JyU1Jyc3KTz/PSYwJyYzJy417qn1KekxKSV1JSd1JyuwK2Yy5SkzKGuzKyU1Izs9OuUzIytzqBbalW41aitvqOpyJO4y6WZmpja29nJ2be1xZq6vbXI1avZ3r3s9Kj0/Jzs9Jz0/KT0/JTc4Jj8/JT8/Jz8/KTp6Zn8/Kzo56b8+7f8/OT8/Oz09OT8/PT09Ox4eHf8+Yz8+sj08azIxqTZ17T89JzZ1Ir07pz076TZ1qv88pTo4IyvqGzHwH/89KT88qzr5bjQx5Pq5cnm15rz7dL79dr755v86aT03JPz3qT03azp5NmfjGTq1an45Lr07Nz89OT52Jz83KS+p4D83azjyJv03LTq17j87NOTjoaFclX01KTYvZbMtpapmIL03Lz55Mj81KT01Kz83LTZxKr8xozLwbbyvIT0zKP81Kz01LT83Lz03MS5qJbYx7bp2cj05NT87NyIgnz89Oyoo57px6j8vIT0vIz8zKT0tIT8vIzqtYz0vZT6xZv0zKz81LT83MTny7bOuamzr6z8tIT8zKz007z03Mz85NT0tIz8vJTpuJjzw6TZzsfzrIP8tIzep4b0vJz8xKTdsJf4zLT81Lzn3Nb8rIPLknT0tJT8vJz01MT83Mzvon/imXnzrIz8tJT0w638rIz5vKT8xKz81MT05N347Of8pIP0s5zypIz8tJ37rJT85N38o4z01Mz43NX81MzyzMT89PT8/Pz09PTp6en///8Cu069AAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAci9JREFUeJyMvXt82+Z9L/wFSBAAAfAGkhIlSpYl27JkJjadxBZzcxWzDtukTXrJ2jRpz9p1a5113ZqjrZedd+/27l3bbWp6zlnbdD09y87aLOvabeklDevQUZwmoWwnpu3QkmVLsi6UKJEESZEAARAk8P4h27HTJHt/n48/pgiAeL74/Z7nd39A3J7GCOuUax6YAICKzcjirWjUrBnCts+k571ge46UkxGqazVz/SlRV42efPNFnol4Krrl6W2B4Ps+Zby+HChIBIO+aWAIQatwXgDq/o0LFSI0sK07x0EEFG75rFADgGBXZpDpBTlRh0iwh55g0dHV9v5k671JvcTywWVyz6Dnl/s++SHx5TUSEchAjZ5Q9RpJAt6uLQdGoyOIXD/GGJw8NP+BAgCWqeU30HDBg9h1ODxvBj/irBlAKmI8PToLt4aJ8wE0wXD7gntYdmGh0Iawu8tiobLwMNUAKSpNCQokz7AzAL+fnZq/UxQVbQO8qfccAkM056dKNd+Ln/RA2Ccvk8x3HdzkAx/zh9fGSQgRyonMZESWMxMTJEnK4E2XHqWiV0YTAYB6VAYCTlGrWFV0n9K0ESePaiR93bidZOY6hkR1GagmoNn3TESDfbMI7LVQ90MB3PsGVVXv9gfo/mFek/PeCuAAOLZxkVRJSCKGwiX+QG9QBDd/YoCglQgetW9X9jfOXHzovx84yTEn+nvxo692/PjzE/q5c+NNMl3nPZCBbLYTwIQ6IUmrgMvl8oxGN7EIEQBZD+SMm9VWKh1gS4pJg0KDvk4IRzxy9XqGeFxAVkxCGNoSs/Q/ecwQXG0LBKfixAnoAuUt1jpYm2NYh1XxwglozfrqaqlwZgNTwAw7vMzagAsFzLTAEPho45uHI19ZftFo3jgkAcu5wQ7iex/BU6qWwjkykZVNsBEg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";var Yd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD////r7OTU5vDp5uf++/3//f/59/n18/Xt6+3d293V09XPzc/Ny83Lycvp5+rl4+bJx8rFw8b9/f/7+/3z8/Xv7/Hb293Nzc/Ly83JycvHx8nDw8W/v8GurrC5ubrq6+3i4+XS09XW2Nr3+Pnf4OHX5fLV5fPV5fHO09fV5/Pq7e/X6PPX5e7S6PXW6vXT5/LV5/HQ4evX5/DO3OTV4+vT3+bK1dvP2d/p8PTR5/LZ6PDa5uzJ0dW+xMe7v8Hy9vjLzc7Jy8zV5+/c6e/EzdHU6fLT5+/c7PPr9fnb4uXCx8nZ3uDj6+6ts7W1u730+/3f5uj6/v79///Nz8/n6OiRkpL9//3Nz83Jy8no7Ofp7+fp+uL5//bz9fLv8e7b3drLzcrDxcLp+9/v+unr9Obr+uLp8OXt+eXr9+Pz/O3o8OPd5df2/fHv/OXq8+Lo7+Hr7+fp7eXt7+vr7enj5eHo8N7m69/r8OPr7+Xp7ePHycT8/vnX2dTr8OHv8evt7+nr7efn6ePp7OHLzcbz9e7j5d7f4drIysLW2NDx8+vv8ent7+fr7eXNzsrz9evx8+nt7+Xr7ePU1dDS087r7eG8vbfKy8XGx8HDxL7q6+Xb3NbAwbrZ2tPQ0crNzsf19u/l5t/h4tvv8Ofx8ufv8OXt7uP19evz8+nz8+vx8ent7eXq6uPx8evv7+nt7ee3t7Oysq729vLy8u7v7+vt7enm5uLi4t7e3trW1tK5ubb+/vv5+fbq6ufZ2dbR0c7Pz8yIiIb///3t7evLy8nJycfAwL69vbuvr63T09KysrGsrKuoqKekpKOgoJ+cnJuYmJfz8env7eXt6+P18+3z8evv7efl493t6+bv7enOy8fv7evx7uz18/Lt6+rl4+Lh397d29rV09LPzczLycjJx8bb2NfFwsL//f39+/vNy8v9/f36+vr29vby8vLu7u7q6urm5ubi4uLe3t7a2trW1tbR0dHPz8/Nzc3Ly8vJycnGxsbCwsK3t7e0tLT////82rDGAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAdTFJREFUeJyMfXlgVEW2969u7/ve6U7IHhISSIAkJCCyKMERcBkV4zIK7uKoY5w3Cbw3D2Jk3nskmRnjqCNuo6BvRiPjjBuogLIoS0gCJBCWpLNAkk5635fbfW99f4QlLPN9X/3V3VW3qn59TtVZ6tS5hAHqrfqeOZpj4qSfc6rzxutwvdIC6IZ1GT0pxnMvxFe2zWtd29gUsiS0g/UXW3z0EOoVilF1rH7SY+vl6jCpRQuAmg1prv/wiF+aJuxnAFj1h51lqPiWf7kJY/fm65F7av9coZ7AeXxzbtmPlqjWjht/Kh95+NH3OdUraYORxJw7D5UdpsuUjLzv10XeOjTqi2i0Kvf44bv7umYRBsDaxvU5UdmIWgi4UnT9YEjtdZDUbDKOJtRchcKYgwNdfm/2yBSiHSE1lxtg/dxzUmZwEpDmoJRE1LUNGgCJUDLyx7zXEh0gijBilhe3jEeFPimhDK2QlpjgPVaWRl3UTF3kwFfTY8F1qFcE0zI+2JLziY1Z3ZQ4s8UtebasWFhqOafztUpXN0XMJfGboVHSrkKbmgFaPmpsVXK+fqFzXDaSxvtUhoh5U1NT81VAapq0fIqylsSKxzIOBTOt1lOEC/S/aLzUwN9SD7vX0aOZ9BBfqSsmtYBAAFAR/miYL+ogBGHA+GLzOMkyTidiAaUMawJ8u59XwcSscN+KOXfGCwiaG0KC4tYPEHzXtRpBZQ4ETl7y5SzxmAUH0j3gK5+AELljg6eNmgQYQHCipWMtb1DkMEEnYxyjSKYkqbmOb2y68K9OMBaCcW4k0qTRKG/oopEugV8jJrEwbJcmrQEVxAyhxkk4mukpepgA9RyHmlDZ4+j9M0IKAMDIC6GxUWOwm1mYHsb53QBOZzwzQMYT858+m8MH234kzbWgCys2mR4Zf5hiw1w87RCM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";var Kd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD////c8v/59/j//f/9+/37+fv18/Xt6+3p5+nX1dfV09XT0dPRz9HPzc/Ny83LycvJx8nHxcfFw8XDwcPBv8G/vb+9u725t7mfnp+cm5y1s7axr7Ld297Z19rk4+Xg3+G3trnr6u3b2t3X1tnDwsX9/f/7+/35+fv39/nV1dfT09XJycu/v8G9vb+7u72zs7Wjo6TKy87m5+nQ0dPd4eXMztDz9PXHyMnFxse1u8Df8f++xszd8f/X4+vBytDCxcfX7PnO4OvBz9je6fC7w8jHz9Ty+v/Y8P7d8//b8PzV6fXf8//S5vHK2+XG1t/h5unr7/G7vb7r7e7b3d7T1dbLzc7AwsPa9P/c8/3e9v+8v8D6/f7d9fvi+f/g+v/9///5+/vV19fR09PJy8vAxMC6vrr6/vr4/PiztrPFyMX9//3X2de9v72mp6bj8OG2vLWyuLH2/fXCyMGgpZ+wta/n7Obe7NvZ5ta4wbbO18zEzcLT39Dm8uPv+uzg6N7S2tDr7+rV2dTW49Lo9uTi797K0cju9ezk6+Lb6tbs+Ojq8+e8wrra4NjHzcXy+PDe5Ny1uLStsKzt8OzT1tLR1NDz/e/X39TY6dHe79fM2MfR3svCzb2/x7vN0cv1+fPI08K/wr3z9vHZ58vKzMjr/NXn99Lf78vj8dHg7s/s+dvj8s7n9dTx/9vm79jr8uD8//XY2dX+/vvQ0M3GxsP///3Dw8G+vbn8+/nc29nIx8XTzMH//Pfd1cnW0szKwrfn3tL++PDi39vw59z68+rz7OPc19HZ0Mbh2M7Oxr3r4tj47+XAurPUzsfIw764tLDKxsLPy8e0sa7MycbEwb/Bvrz8+ffp5uTV09LPzcz//f39/f37+/v5+fn39/f19fXz8/Px8fHu7u7q6urm5ubi4uLe3t7b29vZ2dnX19fV1dXT09PR0dHPz8/Nzc3Ly8vJycnHx8fFxcXDw8PBwcG/v7+9vb27u7u5ubm2traysrKvr6+rq6uhoaGUlJT///9XRU/aAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAbEpJREFUeJyNfXdgFGX6/+edndleUneTzfbNJiG0YKF4ds9DTz275jzPggoKiIICioAiRYkKioKCJ2A7sZ933t2Xs5xdQVFq2vaeZDe72WzfmZ35/RFaEL3f88/OvPvOzPuZ533fp77vkGHZ6R8XDQCASFOvHr9KdMMe4dTAWtWDvTqo3/h8aAtCjvzoKl9JZz2bvfD4EvdV/1cPYJZEqha7lly9keyoBuXbclyNVTbK/6T9OyQkxh6T+LaWsOrWxrs4iXXGvAmO8ZbesfkcKB5AWHLpfgKvTfKjGZJI8YrdLt2S1/dYH33wtf3rKY3qX4qaiTVhP2D3lH4dBzi/vSUwk71SxMIn+6p6CyDuHl3jA5H59eIoHJCjAQA2bxiiQsYXnbLe59spvmLeumOvh6bBMPvhaiZlCwn6ZrZxHcm56Wx5rm2i+luW8nTC1QPAx9j+DcAicpmBYt3EtyFb8tR+6zLZgz+tb6FRbADtb63FMH3Cuz0ZeXVDet1wYzCJcbEn3IDPmh1dQZO+6DHZqBJa82n1yNEWYKVZ1HrBUE0GW+N9i+oWjJR31GDo2se7TVJyXssHdGP3v//U88KSZ6uqhk9bLPK1KjW8BU08AJGN5nxWeGUPAoBbqnVX4qwUmHtf+w5+CgC4hpS/TxD9Xq6SS5y/CkRitUCpleTtlPQhsgUQ15xQQWbqVZ01Gjt9HNaMqBDrhROYsaijpm/2SCFHc6lmYoLCh86VTKh5aGjigLVJGkr+ePMdD8wV8qahIA8AlKjPZvbASi0G0Dsmi3WLn3yne5leCG+WMNThJzhMNUP/V2XoT9XLzK5fxEFN6CzNGux0cDCEZCWgl/l0dIWPUsv+Vh5dpOJMR4/n0/fW6nUVRgDAIpwGPPLILJSAMsXCv5zdWd4qrr9uOMV2+CBav+qClNwx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";var qd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD///+ZZGiFV2FvTVXk4eJ2aG6Ie4JsVmdbTVh+c36Ng42dk52VjJWtpK21rLXVzNXMxMyko6S8tL1aTmdEPFR0bIR0c3yEg4yUlJ2kpK20tL2cnJ68vL7DxM12fJRFTGVNVG1VXHRdZH1lbIRsc408RF49Q1RNVGRma3Y2S3ZGW4RcZHRGTFhsdISGi5UnO16nrLVRa5Q0Q1xkdI1VXGdEVGxUZHx2fIWMk53GzNUrS3U3S2dHW3ZXa4YbOV4bMUwoOlA0QlNnfJZcY2xsc3x8g4wsSGgkRWg5XoVBZ4w8VGxaepw8TFxsiKVEVGRMXGxUZHRcbHxkdISKoLZsfIxMVFzP2uXZ2904WXdKaIVYd5R5kKYsVnguOUKZqbaRnKWwvMZJdZg0VGwrRVlJZHhjhZ9adIc0TFw8VGREXGx4ipeKnqyftcWElJ8bPVJTbHx7nLBifIxrhZYhMjzr8PM0VGQ8XGxchJk8TFREVFxMXGRUZGxcbHRkdHxsfIR0hIxLdYksVmjb5ek0XWw6ZHSDm6SZpKgyTFRjfIQpQklEXWRTbXR7lJuptLe6xMc8XGQ4VFs3R0trhIo0XGRLZGlbdHlVW1zJ1dcsVFrBzM1MdHRTbGxjfHxEVFR0jIxUZGRcbGxkdHR0hIR8jIyElJSMnJxOVFRsdHRGS0t0fHx8hIReZGSirKyEjIyUnJyMlJSzvLxmampDXVxsfXxMXlybtLFMdGw7VExjfHRDXFODnJNTbGJbdGo8RkJzjIB8lIhsfnRMXVNcbGKMnJJHVEtXZFt8jIGirKR4hHpodmqzvLSJlIqbpJuUnZSrtKvDzMO7xLvL1Mt0fXOEjIJVXFLe49l0d2ukpZuMjILMzMOEhIHX19RnZl1+fXOWlYutrKLV1MuenJO2tKvGxLu+vLPp59/VzMiOhICWjIjqzcO1rKnMqJ+vo6DHjoKrkYyonJrFem+qfXl+c3LIu7q+tLPOxMN+fHyWlJTMzMzExMS0tLSsrKyMjIx0dHT///8CMPxvAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAjrdJREFUeJw0vGd4XNX1vr32OWd6731Goxlp1IslW25g3HsHk0ILHWxMhxAIHQKBQMAGEkjov4Tm3jA2NsWWu9W7RqOpmt77nPJ+yP/9tD/va13PWs+997M3+hzscxk4QNWXRRnv1fJgaw0ozuu+b65t4I/kR88DoNUtICIzGXydjyATI1MDNCO7V526/Zqar6G8DNtzAzQAv5pjc14D/xKFLNK8gB+sTOpJkDGIFGeEKMPm5Jkop8gK0UK2ZtYhdlQRzX5vJBY0TsP9DObaXf38EIR//nmUAelE1SIXQKEuVuceM5NDdJYmq6eqQTH3ugLv16+KpM/Wfq2g3b67/qfb4FBFWGqlaWm5LXxoA4k+VVXVH1xfZvcKRtf5bliOLtyrR7F/a6vjLU3xzL9TzEoey8qfzsPzgR7g5iA7NvnD89bmQ4ccAf+cc2iBK8A4n9Wz5CVe2cqaqoYReyQhLoTZZZqmMBYZK0CViOFGeWRhtMA3xSdbHrn8JgiStWlwxpvbO6Vsq+qxv54nc/iXvmEAKS4NmbyLjy1KXBxa3sMp3LY/q82Igp3R37WyoqO9mUBV67l1hKUBAOCYcWp9qMKrJNbDNDAqLCKLl1ZNfXqkbdk65uqOutqbGc/4edqSqGHlh6NrtwrdFcArPJnhnakpig/j0+C2M4Krbgt7tfb4POgOLJBk6QDEc7EqvSXj77P3IihFuUUe5q9Me7z9SrmLgThJJiDPyo2OWx+erIC3emlG2YjJ+dkIizEvPKtYr4VZU2kAQOAwuMzUanfgts1VdpP9XAUKLHw2vh5YJcE4itvsMBYLoWM2GAbzVBsOXC5WPznNkNbLWDKROHQUWq+fOn0ZygDwQXUjm5acw7A8tJi1ka0dUgC2BbvLWtRRQdSuydP+ycL4NJo6Ipmbpkg4pp7zr+8iLn5HJAAb1J4hblxRYfOJHCg+c79K2y+Mjo8OpPlx1lX2SIQPHxS8j519+KTmOvQT0xauXLzusWq3W5CNglMhQwBpfNRNi8ZGM2M/BHr9ZozpkCEOznbsZukdvxwXbbxp3ss/3bpm3Rons+G9+jqKLmlbjT9MM+iHdwFDkSSQtmhxwHj68ECqSvAommhqM2Bzp9guBPlqBQfypclIYTck8WwxOPFdqnHVqrK0PWKwwsjBVnw5mIdvWYj+9fWeK+79+yftGAbeHF7AuVzVqnOSDxssfNwH0bLcI/CTtt4fSuTCsdVnn1fz7UXzd2rlud8WalTa1h4SMWkvo4Q0ZW69dt98WNae0aqaJxS+Cy3J2CJV3zNVGLNHcpxHXptkwhqXHz6b2LGfXfKCOuWqtyE1/eAz+KJ4QmJLcorci/JeStRrraTJMCapG55dtuLBOh4dTNR7UuqBqoIHBbgxXs2B3HIZ/EVTTFQWDs0/cF0u6ce7nO4R2wdL2EpiWFEXq4tMa0kM0YLkrNdm51njw6d+vZNFE8lU4YK85azho6McURObNSw60tE9u3bfJBMb/nUay7VWhSAvlbXLzxk3E1VkPijCsh2JwMJ+azMcuOvBVxmK/0vdoeP6O+f/XGzppMYvhTgKNqp6NyqbNFSxdm1egt+pECndYkEau8wjFfT+60huhVEpzs8NMfFYNUse0sSHWZBRlnoS6bGEAk0O/Pbx31+mh+VFvToHVESrGYeO/9Cdk38QCFE+b0q+sDUgySBBCaso9TMFriehvqY0H9K/Ij8oxnsKltpT0ReETPmTSJfi4MdTXa6cb3qaxvijWAZgvD6tleaKS2evK7JFKTx/Sa1M2JiJ9cmb5q8tJ+d/leDrsYnk9B8w6doNW9bOIAGvemrxGwcP7X5liQlDcoZXBXlob4BQ5dTKWCHcR3ozfsQwtBryUUEBKdkJca1hJco0Ji5/+NXDgml3Th4AfLobhhDVu2fnKzvPrts3rErwQVRthM9Gg7RClBXxaW4JSTI6pP1ojWscX5aecs6I0abQC5xLxTI1pCAGXw1Cdo9BLQ0xLGD3+ACgld2aB2aNcCYPAD5BVoNGLTQ9qx9Cr7F66PttXXJO7+QUsgDVF1mu+gt77kHukzurkHx945Ij6IsyYy2IQJ3D+9IhzIaY9GWTNt9eYY04KK6ID8Gr6IzkLjZiiq4x9jkaMQ+snloutysxxEAAp6nlKt56+nAJykLKLM6x+cRlE07RojwvW+YWgcwP45ChQXVm41h/44WFX1I3S7cHc78MxUUNpu6vZuMgON7DqnAEf1ScZZT8eL2Af/DvXDUc+Ru3blSsm6Q7MF26zr12gtnOuiPgQwDSVpZQs1YdZaoWnD214aUtHfDnsb4uWx6/Q5gVsz0qFg05p6wi1uenhz0gZaRXyaCKAGG2YogLG0z8CsgFao6noxvzbe7c7U+EQnU2UzZTZc7OXjrlOLhKzAJaF5dx8jm2uFTESUQWsQxVoDwU8atdyyt0nhy5TcU9txrLvRKF8W6wXpqY8+bLKR/3utG/b6fKp4YHAfHLqhZOStusA8HtGbO3ZJ9sNSlFpA1/Xs/a19A27l3igYX5eObYK9Vn5Mzl45XPX4v5LOP/F5m/a+1OTCKqKrmqoyU1nWN45uoKdzQFo2kTF3PHAUk5rgCn6fcreQjHSY0ZI1M1dW9Hpl67KJXXD/td8saze37Ez+K/cPDHsnl1XlsCmi3NFAUaAa9IDY7jKjAnQ8xUgroc/uhg5w28INUvO5ZwDsSVrJuPu7r2167sit78zlgl9yYgpSKq0l8KFewTvtMNeqWSL5iEc4AbLI/wA/fn1jP+WN3UgoYYEJWav03j7iD8i7WLL0OW5D3w0R3Za/D7CKZcBg2elHlYVQMaVUjuxJDBjBUDA8C2xA06gUyvypfLjIzIRBNu/OfbqWVrLDk3gVJz1R+qJA9kZTC0Ibq1wItISExQRnkhJahkSJRm2BKamxFF7cOi0UhtV4rNuWIC9o+ueS42zxPrzAGH8KfSWV68VmTop9J5fktJL3NpA5LQByl5wp/jIjRX7flmYtbDQG8eXH6lbjRGlmszXF/f9M0MWb51cvkNcZU42+hd0X5hZiE2jXh5LsgV7GJtx0WbGOijrKRNMoPc+VWTsoqAzXCIoGreGCXMFQRCJeS8868JDYJcv3DZGv6bL+x8ADfPrN5IGEh+pT7QVp+kV6tzQgChoMxTkViRx4jbc1s0TfM+lRUwRj040r5054eXJyOEQ0yzixhOZTNjMCG3hXMA0QN9oWjd+f7BF4LCLAUakslHLxvbIqcEVCB3jRdGoXWqtpA14il/Tf4aOMzCvhGtIG5XLDobm65+BWMzTH1nPSsiaATvLJyksC5bJ7iN3hoQxfO5XIXIA83++8EAlseAaeYNWne/e6eWCmApAWI/A+usG13m3cfK1XomGXykGspLfmRphBk+keMFoKYsY6qw9e344c+P3Ruoq0FjC9FE7YVl1GA/pN3Ud9qKd4T7k2QMDj9sAABlgzEDMfkCqLuWlwCtV8ipaVGP9l48lXcC+EMiY2Gfd5dDyIhwelx9xkz/nQuso80/3vtQHTbr2WUYo9aT5SoduzIEfEsdxy08xFKwbQFTzZp7dja6EEPmw0ufO9bZl1SkkqsBvMx9B/YCmVtII4593fppSR+MX3o6X2Lb7vG7JlHLUZsvQpiTOVR2IBovTTDLOYT4lutlTxChCetYqrmrBLv6dGl56/X4pgHcwgk/IQ8wO/uuJJXKq2mHV8lUfztSXamv1zCmggLYS9rC1bNJ7oJqeVISN787dcxjtW1SnjFGK12FeUk2V+pTXXykmFTOO46RWVJtpdH0RK+vzIGZOdhjsvEmvoZXtl6y5vnkpTBMiU53Qs3k6Gjw6IceeHf3+q3QA4AQZoMUgIxV/q993DteKekY5EGtR9o6ckHEwtnFMMbnVE2yneSuib01Im2R51rLcHTWC53QT+CkO1CUu7gyoii+/0VMVAdRUlFz5dqY5vxy1Ju/0uf1huzZBpt7B3aaPnHlwVtAmjA1wXBDtQ3AbQ6U6D8zNdBc5OIUmCu/RNcjjIFsdvSzI+kD+FHMyW/UV1TodqivJHnAzxe1xETxEHafq7g/CzNjr79x7xhNESAOz1pxZp68YZKdJPIAuwwB5moJpm9nphdXA7D22PwsCmOJhH72dKDjwAB1C2z8+R0R4LTI8dhKQd0FaF15nlsucPiYW19fLkHGEgRABKus/QmCDcNQDUKQmSQhM37RMtw95/Iu9qi/GwxobqwMelizhl8hOXNJ3l++yEARSgCn26+O4ejbUg2sfrxIA+JxXj6qKWPFGcBJNi0SZRiU4w7lxTB5ULlKkBXlXafiO4ivLr8JF1OiFTNzbSAAoCD8FAusM/m76LnlIq+HRXJu4/hdWImTYH6+xt84tPJYboyerHE8MU2xjq6qcalFJgR3cjirppxX+ydnnXRN/jTngVnxJCPVkTUA1viE8BfS6CuCXQyeppY5bPGJ3ZnrrzB9qw1gefn5HVNH11j7ElqeUa3ebjHyE5Ru77Gi0vYkVl8zm/+xjxmI9BStJwAlqIpEyMgEbCYMUEDlWo9QevE6wdEccHwzBWLIEd71DdC1KIgnf5pQkyJeLiQAdAluxJrKoDBu3QA5zjt7hiBf8rg+8igHKy/3OBmtC39/F2GaWoMuTiMelBXARpPXpKyA9oylwVBxzwAA+qUuCta4vOu8OXqlCPoi5muUeMgcWZ/RH2DiyrLwraqbAY4CgmooQenp+1CpmKYqtodP8/flgCjCmGD9qUEtqblqI4VRdurBx8FKC0RUUZTh0sLkZiVzX26wk0ZRt191xz+xldq2kn4G6PMOD4ephGkmaerWUlYTPyvnl9kTpNn/xk7Nd2Up2tHuKCVZV/UTHqZ/5Q8o/9XHA6KciEcIyrfNaYfhpNAbNfeVCxQ0LXps1AtS+G2YH7VaWb0zI+J2KCC1TVAX+pvulpgYlhxO5VTW3HvENQBr/HAINweb4fqLHB6WEWknbxkfNP/xFoyr4lB75ACXnVkSMZwKeosaRyRKldkhHgjzSjkbmcRdbFEbH9OUfnoWemihunph8wV4Vwef5gBckzOyILC9RIiHGE9+eeClz6qeN2GoZMox37GCc4auKJgWWLWSuPjeh7OX0pQ8BkOYBwr41/n0ZYaxElCZ/HyEAUI4KFLPFgquv1N0w4p4PVLnRLzQS0a+J6qY3QtuScBWDWWA3WAMNPIDBoy1p6NZwACMfjK3mPTa2AQT4dcYC1Wfy1pysUxGVISslnab+cl3NynjABUKGFqUv/RQPCRtGAtHj9h5k3SOH0S3PG5WlQXvriJJBkt3eg264M7JIV6+jUahuznZASXOZVK1MMAk3E1XNNJsjfiyXDjaOFjPGKsX1lXCfU+9ktPFFDHKQ7MT3haXlCA5FbXJlaiZ/uruokAA83P6kw+tjZTBU72LyMoXnuwKddFkQA9Jx9goU7n0vv9he7OW8dBH378dHnV6yxjwiaO9ggkAcE6NFhMVMhbAbJV0q69nKpsd55UJPsdsvTsplAtmb/N5IVzYJweurutzuJ3g8atGMOfglkp7Wy1xq7Nm4MIPe/4OD8iHx1CcniUyXiKZ8fHUQCck7ZCIDiDBZBNQzz7kqOVD9vofv/jw3V+nGIolYG6pM6YglYayh4Wih72EwAwOoT734GTKPc3JvUkHk3HPul//ME0G9AFzboLkF6iSUjbdDDAKF027Kclp8WeAJbEwGdE4ulr6WxiYRjQ4KiVATM+Gq5mzH+654IRymR36cDeTh/wWBkSPtd9C1QEHdsofbbZDxT5ibz7xYkDVrwrqDExuxiJo+00hTA+2xf59V7vRflbAkgCNYyC5DHQEx8fJv91odFBRWiduDDy171w0yaXKgdt80BLtygmlBA/745Xi8wa6ztBg+4NkTbg0MfxuYTShbGZdDB1ZA1Vs/dKFnPJi1qR0nGYAQq+aKijUYTEPoRKBJTP8aFI+f4qT4WY5PyxiJ83sLF4ohK8BQ5zsP/vnR05/+yr9xPjD+1vJPAd/Ewusg+ma3PoyybFNeWv0nJa2lRdY7WVCwIz/silSHWc35388KCTw1zeuL+nLblKC6hnZO4aqQGmWP1jzwt0VQY5fYNhwz9cpl/J7DotVBWFWGJIrujcZH3daTys1kw+cKurbAlrfSOM65dNOkEb5dVfR2uq901XQx8UgxyDg+yCA1C9/Nm/Vz4sOIdEMhkljcH7SAp6QAYzKMri83EwplgFSzxHOoNGx9u9e7z66sfZz8/sPEtEmKzxquvmjC4yU7aO3FRGsfU9ZpsgDNZKCNjwBJ8pHo1l2EbR/oKCx/KRpKk+7IZTyXTj++JITDN3hh+KvaFKAAw3IDniEpc8t0SdC6H4aguCNruOXTL6EQzvn0ceFunx3OC1qurT/z66kH+lDvbc9Vr2bDT8SUV5A9/EoN2F7wHJFFYFbx13maXkT5ICI0mmambACA74m4FyBZcDFJeUE5OJ1lcEyS73GjzWdtQo/jVaWZMIq3dJlY/UXfHsC8czV6YHvBl658/24ocz7919TzDfw8Hdzx8QKEbuK/NBvw8MxzRjSj+KS7Nx98I717ByDEgrkQQJYql45jxglKl5Za+nDCHIAlgSk+3o8wD2yMu66uvQdxsTNFWi6TNhb764wzOisqeRp58LA9I5vm31J7pR9nHivdAljvFU3f9ZlO5fHJkCaxART5+I6Z1FgFGwUaaIOgCIql9ngpGQzbKQLjE2DIL3CKJlz9z/PhFDV46dAsFX2ki+8d3C8/NFIAotsEyZ73rq3hakYH922JQFXM+4kWyG1XyK8zhAjIgDMrn0i44dO/8UgqrnzdSMAAKajsI4zLK4lnHWxMXhMI2W08Bsaz3BPurD2o5yNLm8MMELQ5v2WT/dL+UL8GWZXAHYc7FSzKE22mPM/calqck1X4OWI5gzWWAYpSNGe8VwUa8zXeWaP1YYScowzbQLyjA1Fomq1U//xyrnlMgg/ZhrHP/cJVC9Fq9lXR2veSyvfupCRaWDppsNljO2Z+cgZjWd5Tb3TQ8yhj7EszhYOTOaolNt8pTWYVdVcuBNugc+x+rseee5FKyUAAZTz31/QeocXbSIU2yY/648zOH4kHSe/709wPJLCEyIWFLUJnm2NtOqM0sUpvCdNenYA5Mag9sIAQhXs7rC6W0CU2Tm+ZSvAyyzIYW9+fuD4ld4p8IccRRm6QBeMk06nX2dsgzDCAg/MLawm4PHmKSxew1KAnTve37Ttnyzms9H+4Mgo6u+ltz/9ErOfSJdoGgeZ9WDN4+4SBid6ecW+QYCBjh9xYf+FnbARvnuovfER7nM7Gt2MssQ3T3/VG3Tb9u5IzZ5EWUDJosjqwQwfG8AzCZ/TBGCyuLLmmRCcBRI1mKau8ezYfXgqDMVhnsPMYG9aILSMX67kzKq//to6Z8lv9rCxXLHEIhlmCrCMnFNXg8V6qUK5E4IVYDmrGyHG+fR324QMdG91adGaNwCA/HywBl4WcY3MTF/4L/vXNC35hwYBnxJAkMafm+SrCQj4+v/VBxo3oOMyqmDcuW4juwhpEHLz2MwJrksCyZoDKevYxLdODw4a20KFSWZhZmpr/3tzSDG++cCgBHiFXIlvHzL6JFIQZ5baj1Tt3rEO+UChJG1Qzj1+8xvUGWGFBdprrI+N9S2+Kf0SljEYdCInKjBRPvBKNSpljp+uI0JWzmK7naquoqLy1HfZ/Tz53Qx2kFnWS16aIDznYoCxQ2yTIDE0TC9vemp8UkICxi+xp6g6M0HRXP/xgDY5qrOUm8UtQf+6UgpK12eN6AYcHYV3nxjgYPtPGyvTFAWHCRJG/PxYSLHgkUbFLqr7wpbWHzfQ/Bxdqv3rNT2MEhJqVl/XdHm66pEpmCVN+Umnx4wdLn1+y1W7uQKCpwyMQywZGmghqmyTqPVMUFlXjRdEygRFNhf2WgRKhomyaHuhouquOfzRtmFqsdH7lVeMKlek0vq7+pUPf5OUCnOCPhOcwfJPT1ARDEM5Hs2FisdCso8FZntJpr4fBBkJ9kTdkD0DklRJSshwMvqlxOfBBMOWmJyhcW0d7+4wYJ6Abeyne0Urp0X3AAvoaQhYxuE/l6LmJMPUn9m6qKG85TCzZHCpN0pBCsiAb9MPjuGn70fA6i5gbxlN9Hwjhq1Ur1lTkjRiWJDHpwCEsJXzaDal9MXMVdVJAI72PxCiKMdnXvQeQ3tmaXSXLxwFWDKrPd1WVbBaq1sXb3MgfKEHR0yGpSkKDe3UuLLDGyRYrHmCVaLmGpgamhRlJKAERvY0pprbWPdNJTOpapFhkeKidsefwbaXk3bODNwJ+5bh1cS62zm9pHpkZGQ8IgAlU2VhjzK9cBjWNywFlpwTV6u5TMM+RcsiE9hMKsSvcj01KR4YextTOpSpGdEQ/TmVyZVS4kb9Xgw6iqMaNYaTWgAQ3PpWGBFOZP12md9KF/PiPMuP5v4oS7VEdL/jWbtun0hhjPdd7xBToUFAABwm5OVAZPag7fKvzNnNNew6rJVQif4jE1Z/LjS8Ht0DTeB7hgfjwfk1HQFeD7xHWzNxT58LhvniGUrf+0MDzf5h+I3nY0JliDKxzj+5aXEbe3p67+DV/hl7AfLR4j3OZbAfX/XBBCIoNaDGQeWpD99Gz2kGB5vMaXBMUDUEhiTlKk96VMoFzzYociFTBGHXwee2zlnNzLYKi1RqWhl+8fcBze738Nbf59NO2/mljbR73WffzlkMhKiC44w8goWGulWjJRUUBBPGe8lG4BKglUHzoHAxuLIsDZPCCxspffCfhWXzjjW05t6ebe8OqI4I7IVgvyxX6HQaJ127QwvcNKSFE3e9v9ty+q3D01UNVzopwL0JecWEv3l6bvPm6lNm2+lnrvtDRBYncmUCb/wx3MBn+sMsqHWKJsKcyjkJ1BBsXjOLYZP0pJLJjxKXyZ9/b3tWHuR0KHDh0vPxBXZBXlr9xqp/zr3akrBy5Ec0dYpMSYTTrDIS8MvT3v4k4NxgyS176HeP8hgMr/sLg8ILyVCcUGWEsOOrfMeAU0XNyQtSjffNwbiedPo5k5GmFOZ0LjDRRV/J91CVaVtQUrd895Sk8MBhmBedWXVLWuzTqc74C2HWqcGlC92St5qKCfXfOxUlaUrAwi7wQ6FOgatw8gKyJ/T24ZByeO8Lzn/8zSjDeGQfPhbWbHggNbKE+fvusxr5L4PNThSXH6ofYhyj21589M3jltMh6pTm9dzbIjvwhFmMFy2R6JSKVYKgRN8K7C/rOQJ2HQMAEIRiJeps8MHG6fe6ARuvYneItRAFJz9ZyP6OgXJDIpJ0Oe4l2Xn+TfOmW9jXLDdbdoFUuXua6Vsr6C+UcmaAlRtwP7njBdp7a82lSNKSm9OtV/qqIhEMrhqchnXP3v3ofXy+VcTfPHjZk6zvzaqXTcyQaXM6CxNWlZB8H/CVKJs1YmO8AzfHH9iRTgayPycfWLmrxORJgX697v++JsTCvAFwDpmXrYJqnXK2A/dL8nSEj/OjIxhGQ7AGitASbdk5FK69t9lihEtj6ZYGqKhGQlp1oYasEkkop6bnH7DghcRkTh4v5ARzsDXVdZdhqhE/KaJYbO7EtN031Fapf6xSNfO9Yimn/6CXDoo+sTDISZQz58FY7qSM7KnqKaMz91yoeDncRPFMXzqe20wDxdQogm9tn6l+F7qm8JkGp2TNa8/5m9hVAeCBelnv0JJkKye/YSj3FMPBuDgGkEciBECHG4eassAv1ntEJSkb2ScBDQCoZgpKKwtktUeIgLg+HefqoxCpSwVyB5I8SA6U8bAiXyUTvrYGxP4q6Cobe3fv2AFT1u4QD/hxfQ/xY6mVuQc+whEL0YN4TIr5hBv+AGM/aYgZphxhyNzAQI7VyxoyEaTKFv522eZsoeabul6/TNLwX57i33X2dwHCvCyc/POTjVd9wC6NSdncd/HeQU0BRn/UGUzTWmmOZOXZWRy4Ezxg57QHNtU0YfmNbjbwmQpMVqQMAuCUwdUwgUiiZS9GhVeMaKsUmvAUEsb7kGJJDyoppefqd/1TPhriievidQCEB3bvcKm7kbrEnlIPvbWDZdGEHrfjVqQFXtAoEpYZ/YXvG13MAcSmEkWIweB/mWUnsSbuMlXQ1PHhui+Y91Z4hyS1wUArO1grJp862DeIVaeuSPwSl/mCc2g3LUKTQnGHnKYfCc5UZhpiPF6pYsCoBa6h4VJs6rJA5Th/B4baRMDGKVAixABLi9TzjDHzYq4wDjfMO69VeKKvLixd2Vs7NFreWj3+X32dEK/nCMg3Hnt+TsbdtECjJ0gIgEafV8xw2SU2Uarx5VkGTYiayUharRuybqGD42LmPnX6YiWKxYAEDK77yl970JwN5+448/A8Yh3z9NY/7zWbHWOrNdEweVjRcviNfWCI+TOp1wsf3f51371ITI9u3gHzNcOyz3QYbY5yC/kMnkpEjvVf3BX2DQiQa/bNLzxHaVMcBADAMAAg4uhreCcNHIYk7C9hwAhm2M2lec/Lh8YXdnIV+Io6KDbwxBg8ipuwllUrNXrwtAVWr70+L8hLaIYXx/455KtmacJuUUbSKwidWDoaOLhIf1Y0eYpKhhDOBIGOfPd/On6x7efOy50zluMLkeNBXfFbuKwqManvoGbrIyF05+hMu1eP+yXIl4x9xvpnV19ujczj4Hiqd/xo3z+2Ms3LAsHGRSTqP8vJEMyZyDsEG568mOMwOIAMEIBMAah+uRxrJdQJsvtc8YrIFwpjjqUs+CGCn/Lmv1PFm+iaJ1wHth2md37TvYRpOgpTgtv7+Rm1dlCeE5SIGo/hYmdCEIBnPrPff8A468ok7+2SuMnzLTFlxCAJWAI6qBhA36LLEi85NWfql/+zRdKr6fZ733rxIyMKikMVq6MAATwJGfCYUJFFhVDLqsn4HFah2slYS83rG/ieYCFThAw/8QmM5xj/ZitGP/lSXAs4AgAAYCAHbBH6R1O1HSI8/W6V0mCCWIHYzQhqHSGPatMrjfE5nJNCFzw0XVPXLV2DoUGYgg4n3ybTDjXkOLEkdyx1APeVAwCvwyNgWBJZWecbT+DMLUWnEQgoA87p+4rFC4GsTwohCSmj62vc28xLm8B9zh4/QMNL645PWSy2pHgwUfJ1zdCHIc6BVu33siG1lW82HcsD5ghSrISMhVEBRkwyXoehX/gcvBSR3QHAUEqEALFAYJi2e18GzCPMi44u5fv0FzQzZf9+n+CfAUlYMAFA57AdlLW7V+VHCCrCDDhttL+Z7c4eszlH7Ezn6NRyZ5tmxqmkAMy9c5gIOa5aYBqBgpoFo1iChlLu73gNJcMTKJmUIlZcSMqi3rOfbDXKtFtvvnvD1md2597UzK7vGiWyiLjoa/4N2/Coniv7w3DYzLA8uQLFxvYtB+zdOBeTRtxzkK4WIDNbaMg9j/dyKEQAMABCIfhamnbkBXxtR9/+v6KvBT+G90sEAABckgf00m3Jazqaubr3deDXB6OQjxb5QmrjClaOpm3O3GTDFqYevgczVwgFyGh3tqn75eltF/4pxEaezAxBHUYClr+y3JeSlHmQzotQMlkqh7oZpRZU7ScO3Nh6FGceskx8BdQe4gZxW2u+Yrinr77+IWXuqq8ROFxM/6WKRVUMzg72fdwpT5kGIL29cDWy9/agbKYNyogBQAgnAISORka2MbEscLzZfB9mOpNOcyiFkq4YCsQ0v7BrT3AgNF6KbP/0zFXQKvMChl/oKh+swQvZ8Ypdvub9KaiQLz5v+btYBgDwnKeHddl+yHPPJbqxcs40OIjRgOmcx0s4JARsy/oNHWw2JKTlbEinb7iL9VG6h7JSTpz5nS14nXhAj/mrWnyRPqPJxYno5tkWs3CuBwo0btMpIf/BRw9Qo+lxjKjmjaYr4vde/dNhEAMDAAAYZHM516E95U/p0+VUkVAgvP5GGoCWSowgE9uy+e5F3uSxa+2Wj05nG33xqAAX0OW93LWTSoe0iTWYrduB0Pfbn29NPcdWQMZIxT6lIzdMnn6GbkDM9CKS34gBYBysVYZIKBt0BlJn0iBZpgKLJocdqvF7Axv800EboClL8VJofjNoauH6PcBmHZyeGSk1CHFdsWrDRfJ+ZblAV0t9rS9y3qhxIqZJVhJlqSefJVv5bMAZAKiAUCCqrXmDfS0nCHgOojyVJqTXCrAfS41noAXl637o76CbXMR0ce3EuSCjYJPUuX6aWoSOuHS5ZHvj97ugahXa37xF8pxAa8HFB8rZpa6LR14s2ib7WmbqgmmMhuKKPSM0kzClW4yWb96amhXJd7UI++yQk3VK5xhsw/B3UArE5q4wF2vGFY3D/u2VvfGihsDLckxVR55hPns3BzjI7jOA2v/cOEIAWCsItwBqjkEJpwGAxYJcDuj6mCA3JAU+P59ze2fYN/xxYNxJn0HX9uNwcLN2vKW+kQHsC4bHg3iUflXsHPq5c21q8BDlT8PzFvNuK6o9O7rxp62UWzu10YRyVf135umD4786i33XpDDAzCFOAcu2hcyJ+gfPvc2Jzm4Ic5sQaw2AkMUtjfB1eA4gxMykWK3nVu6tbd62+1BxHwwhipfdAMhVNzjDbeACi8DuhVtlQrrJO+Yfa1q1o+Z6pjeVhzyOEACAQEMzDOMvNKFoIUflUdrnSQtP13/bJwP6XYFuLYdvbnPnGCtA/cMM3yG7wPsmQhJuatLLrnDZCDYepr3vnqaaZW+9SFhCx3aPzBPscM8AfH/qHBw480ktBuxiPVA6/rBQkH7l6XXfiZRGvu58FBs6CM7x4llxIxx6vfunX4SDjVtka967Z5A3uxE3c+7NzDX9HKFMNYcIex+vXClCCYyOW4CTwoaMyFAH9skv7fQ1ABw+kP7/Na01iBHyBMWi3zPyk0DIZ/Ll7m9gNgeMgCaxw++i2gfruWiKvvMpV73Fe1LA5yNRpjhbzezvhsaDAKKNgDOu2p+SfEDHmL/d/8cWT723/vR4c+zc0hdfRRgWbRwolENGKYz+kj63oc4wUOAdL0ND1tH7c4Sun8ZPuTeoqhZmVCDoCIvSlTaLpRZhmToOpk3zfFRJ/wWr+GcWUnGAC3i1qkI5wOFvQq/NRpyNqTLBUCTiA4ASVg9gxPYWNS1olA/S40M5YztmiNoXNTiCbjyqWe+6r9FtBs4asmM6SrkzRjElzCWK4O1PMBx4w/3cV0MqBhjt7kYCpgGy+KpTN5Rh8WfQdEbvh3vuEqIo+dMz2gSnHfIjsmkr48IIAwOdJyuMtbZSn8ltfe2h0weNGl9Ulbm3A2cXypJMSnKldKTBSMjTf9v21dvZ3XMO6O7ValIgC35wbyiVGoUAGnuBBrxt1iQbGKAxQoaIqsUDEvbocx2Ez+861XlBHFgs/sEueDP8hXJf12XFyacVBZmG+HkRZ7yZ4CoizKVLfcVrzytrug2+5Jzqa5eHTEzlKtbG2Un+lgvR0wDf/uThQ/6QIOoVB8XqtLyFgPyDItSKADDx8n/NunKtBwFiLkuihaiyhYSa+peNQcv4ULQMN9chkl2WlkpYvPLam1FKK1d/fH/P16U7X9y4F6KUMYbLb6MK+UiAHuI/BdugRJYBGAAMZxgkLB1z6HoIGIKKq3e1a3lU1Y1qRHQEWU5LCpIfmr59VB5IIPWBOYaUFqZzDDMiHRmVhiPgBxswFXjzwYPeIgm5XS435Jd0hp5wd3VHS6f6QSaKa8XBaulFLAZIH4v19ga1bZ9Yriz4ZcbEJJIQaW0wi3iOtmqv6RizK1JpNtTXAAjyrBJHALNZm55HJRO/e+rxw7iYeP6H18m8NlaJVoQEKZDQ0Lz5L8XD30BwhAcAABQCJsthRwm4i7+DLhxIfHbZX+qJwzT+Kw0Aqbh6Sy2RZ6HJ7Dgdq7CLckFL6/uQ0ng8CLKMKXWu33+09StXnksEWBokAsySXsg8OsgoTDm6JoPk0e6yLw0Yu1PNsFEVLxQDsiO6X2W6iMkgKedZdJh9nCM+iaEPHLg2AEyi96qvP0/l8MoegCfZ12El2133Fbaam/XZJ6ExxZWy8oGARaHGgO7f+lcAEMsKAATQOANAFsu4f8VH5d3Z/toZXuaHfi3EKsWbYe7roxgoqpTz8RkacQQ4fomfdWciE3czYqiGApNIQF5X+5Mz8dhboRiyc8/HJPLFtwR6sui725PebzF3p1icnyfNQxhjv8bma8Pi8nzSVXUlQ1rntDBQ1uDoivw6bq2IPx+emyukxuG6hTEO/eR743ECVPUlgk1wOK33d+7CRgKJ9lteoBs8/X2XhmkLW6FsBBzTaRPbwAwsBkjAKEgAkxUaMfQauyztm0GlzqXRKbOMPgzYeT7og2IOu2VNjaTuqpAJr8/z2TIA1oKEcgq4OdmshKzta7rCeZ9TLa/sOwIZcMgnF9fkzfa/5hc5BIYIwzQORcsZD6b8dH5IZfS1p845OhLslv5D0Q4G4fYZILHfKdtOMruxQWtA4JSex/75tGd2DzuaJ/qPoN3bS2DdkXhjctxGDr+xgX2AICoTLiyNQ2RyFYYK8774BtyAAABoAGBAVYRrsAjA7ttu024bD5nMUlPT/TaYuwFyOlyOsBkwP3GN4MQGFpfHY0CwPZWdEloK5qbwlLiRuVK45deNOV2tAYsY8RTvcM/MGx5Sq3UKK4AAXARYQYtM9AruoMlThLZJAIQEA1Ym3Nrf4l/SvH64YdSBfXIu3afdqIYvs2T9EG5obO1A8b0XHGdeWvvup3SV54UZ+fVHgIb/QD1J/LBToBL2jAMMNZ7fWbqGT/4PRQAHOcsArU3n7kJQ9nCmLeM+bZ7PIf6w/tE+J/K/XT8CNUntZfJht9cUIXKksuj9YtovxGZD2vrttodrKgExmxSfywDJhS7Rfd9sc2ygbn15scmh9jSCq8wu17gBm3If/GmtSDdHNAkADJ1VMAD9UkE92zOqnJaMvKnpvSwvnBmvefDxtFrSQTK8aMw5seHY5vMvglI5Zr3Sytsn/K7IDIwcRWUhWwNJPgNDm+AmuAkKAABAAA4AIKeZQR+Cujmmb+ui1XWDE/WKruaptzuaHLzrlTdAAs8ixLrV5KYTVZw81WlMLarvBAaK297Hc7udI/zBMwoBwRVxRH/qvaWh5anYy/SkI+OrHwIlu1wDFgsWtnoOvsPmE5ggkwRgGBGAqsXMarJcIwMjVFbmWmYDTtQATWHHRb4F8TCDQRyqek6meuU2dZoK5MnQav4HbM3yIdQFoOHljdB8oNYJg4gNADSQQAFwAJCfxhmmgfvbB4M4X5jr+vzAk1bP0rwBMA4rdn8plyEXZD6D6tLyqn0B30JfZTJvbYL4fyDnjbKHwgeBFVEBZCrMP+fyrKy/5+vnfNYLQeC7ogAAkEVZjjJ692gO3don6RX5QUgAw5OBZk41UuJlC/bmV9foPQqMvrATmi/3DfkNde1E88Al3WjjV2aPGFKKlhcmkiAf+OvyAZxqauCq1GXXnxyN2pnz5z3/s/CIwQFJ2QtFfb9DJ6Z/7fIfgcjHIgEX/TzFsOZazfgXhWCZe14wvWUY6sK06vBHt4zAUEBV3ATCQc8Irkk/yjjr85zYrW5RxvJJ4uLc0cJncYkPbnNIsya3os8IABbADGsevKvZjf78+vJUS5UiDUkGefrSNveM+DLPiJlhczJczdB75oK13NHSH2VGCsTQxg5+fX9zkvGTYPWOQ0hAGB75HsNG9xAGjBaU7T5xgLk5Wcbhf2KnKBIgOPG78/tWJpouzPz+dwZcSvdAophE4WYo/ovKWwwR32aaz7Uh/feM1Bc/GZORbRdG6SqfUM2Id7A3w65/vKc1ZiCInVTG01235iJGy6M0kgVEKRvLp4CzgG6bLGhZbXNG+0cffGU2COnwZQuqtKC1iTbCtqsKcx5rmaSJTEpyVwuXNM7JQdvGav+2b4Q/1PRO2WZ0TpthkyoHWGTyc+R7vUDzHEnw9I5MboI97ik+iVP/0zrIWW0r4bjorvU+2xihFbTVTBP1hzwo/u2n1URyIAcfb6WpoC4ckRmOnmRfnN8tJkGhNbjn8Mb/DjMgvThMUfjmIFBPUOqkqFVXLWUnbN91++dPlItRqgY8UIcpBGp54dx7/xHOfuu55vO/dAvvdkmb2YY+ZTIzKHC93l/v0l3bkMoiVbzIkZRbIDrhJEYItdalYEAPNru6mGSB1b+rq3/ohpsFMIbNxKGR+u/56z+2AA44DgAUyBhwnauBu8Anmm5tVBymvUqbmFPng7d/09Rev63639R/AGAY8eKHT6azpgEjCVjfmD/zxPjj/n+6GCcOYFswBaon+IkEqr2IxDjM130qZ2Wvw9QbjGUarG7sIqEPZ72u/Klew1H0l/N//kjx0Gw86p8rQxx3DoSCFEVS/WC8w1OagJHne/VMdH9ksL1jnI63QqO2XWwpx5nywcEbR1qZYOF6LDeaFQBdxwvCv93/KwcNQCUAUundf+LWg6V5qO8KbOZAX0HJ8OFgQ/s4Nec3bw2hvRgoM1w1on2eBJP0ZgHEGeaxWmamcUhVGLHUGN7mqD854ykJkctBE/ky/vj8fRs/8qzvPLBQfMXElWCLMEkDF0wAmYxw39jcQkdW4Fg+a06GJ2I1Mtb5QM0jzo5LBx50kuvUPW+1FmYh6jQPdfa4J3MO9lyhQwDc2NUe0qmlTVn+SO6zL+gvarCJLbUwz11GABRgAACJCuhT+SaBMSkc+Sn9p8/L8m0xez4GDavWb7zyXu1KL7e0K0UiQZz2qJUASgvQUgjUWwDlEtVHLxubhZUHsRlQOgU9xYyjHYH2aZ949t922xFuPjnVSfhasR/78L/PkjqKZGc5xjulPTznTPe6jm1L1HJaeMrywT6YcNtZ9S5osQd0h271OM39QQzKek+IBkgqaYFIVGSGmarhCrOCmheqYt16D2Q+mNg0BEPgBpICoIj/dz43znooR/XPku8y/1M7Rxv/0Yz+vQ7CI+473H98s6blcGGZgoeBjMDMV9LpCCPM1vFBWITLuCg7U1w2mMNJgFfbWyfmC06sLuUtnznpHmHby+wdFwWN/EhQhPB363RzXvFdfOS3xdEgYnvLhUrDtRllhV8iC/dUaxsKGtt4tv8m78MUrPtD64tyjenk8rls9qu7Mg1a9MH9+rJPxf+5btCuHJHevkxy6sMflrz49HFxCCZiVINCTGMYQwPgIEM4V5q8O+X7hTQEZIGhWYsTgvSHzvy8lwOOPR3XXcIutPva04piVvylUpIiSCrG4/c3Dvq4D28kvfCvl+dFhKhAbZbgxrOhrw1lPdyL6ctcbevM6qmiuxOFfv8sdvNC8ePiGx9LX58j2oIJU8LrLT3+ZK6tnbu2bhn8J8KpZtVmmr7gfOTgJOaffa5Vd4FTwyHzwennbxy58JyMULTiBTswqW5a92fowe4ob3iFxQJoIHMNZaNUCYAD4AAJhobUrgwaQ3eQdcksK0Sqcw073GpgJm+/ZMTTR/KnVmv4bLaKBW4QcSkkNDGiIbr3i9MiJQZM8QN8LgI2ybTZ4GOZNw+fzXdI8hxB3V4zv+laNDcD76IDK0Aim65ZaII34cWPELbSZQ1fA2+Am7EpFwRS1Tb1JJykJA9Zuff5JYP9xz9zaR5zqAk+/7X+psYmosatZx9OCAbos/Nq64PLjzca2XortfJ8sHZE0kMySQYoGgMAXNbBTQh3j+yj0Xx+KlgZXBY410O7qhjdyfrU7Lo5nxTIcCnHp0o/fuiYNCDvrCuNXK8Ou24Tc8n7Vucvt+4I54Eb3UA/cJ2SLjLnC6LAOWWdT5ZKzT696sIGWLePWN3lkfvL7/82ybz8zLMA8ywx3LXq02vmVp3e6zmlUkl4GvsbHGZVueYQVFJsdI+SeW5CyFKlbxQy9ODH9/QihlvhsJsGxIgBmJmlZg49r/jo/EMXB2/4EJIM8/9cI0XBn49dEQZHk3UWwUz9OJ8ZL/It54uMpj+flmYeZH0+TpcITgpHovIVja9TW1W6ojdzxHmYaPMm0fZbgcqxMi1T1Q/bD6mqPsPoHLZwdNCsiQkGqofmYdQhNjY6eMFH6e4V4Xs9/zYRcC6O22459cvmv05VBQ6FcyPx09F7MLHg+1zv3+SNhgC/t55+roXaoNECImN9895MvLz3NRamwW0taGqqPh/2Hq9TXX/3TRfE89PNSY0UAeAY4IBDEkCXytYImJm8ZWyZoknr7r8ifdUL+rxEE6KyLpqdi2ZZ7OD+hRJzPSr2k10GqkbD3p+0ftR8LncraJuuRWt3L+tyibAgnDvjR2egCQKzDIpU3YCzgAWxV6F80y13XT5F3jDySq1CTIDpJQH8929aLzir5OkaFoKnnFBmJj33jToR+Pn81m1lwlW9Hzkt0Iq2+9cVdAzCa2WAaioDtkBvW67VxUwywIfNB0IzIKP+RyU4LJ5BT8J7gUr2qLNc7r0EEeDA54sRrcFQ0GrPMggAr4yH0peEWHWxTkbMgLVE8u8Mvr+9/U/r/+TRHXomEPrsgprkKbSfNmljjDIKnmhkRASeIms8XECskWeeBXa59aGHDz//TlR6o/mS/NYuruyJU4v//h8LDHFXCKZi/Xl9+zL0b3/miQZOVnB5s+2hlaFsqsxoE7LUyDFT8B0WL1PwTB4Xw4OlImGveDj4MH+oUXQvmpElgCQYAECqaoBEVaV9FMk5NcN+bsQdYCWg+VKeL8j8tIoSFSimXPlqqOxv0BXrwJlFIg1fIhx7pzmL/sXOChe/yzon+GoTb7d7cvkjv8pzwmzTaB0DQ9DoUsjxHI2NwLMk+cyLW72PTPx+z6t3N8ZuPsAtnnpnvmn3A1ifwogEqGbedWvb5xDEpoeE1L5IHh7Z/fD8pEZirbaKzGrQgXexX5BRkJPVy5lg6CpZ/H3Iko98k6/Nfy4KykAqpUkAACZ4cNtVPzKNggK59tBsqCDIq9QheNUk58wGMciL2T//N8RLaUdD3OkYnip4+dLqsfqq5F2jUpqfd9LnwW87P4aY5U4GJyqFEYrNDEEjDFnFiWhQgT1TBvrVt56FZ8HrbfzNveln7/zQ97n3hidtsFxtPxakaAyjKWqOtsIpSvU9103xr7g+rSLoKJvk87kYAzOz23WFOC82PhtRXRu+9EzCzic9Tfwd30Q/88NmFouI/T/BA/FPpdTBgkKgNyPqK+SRyAxDSGPa44WwjAaed/S58okcI2AcHigOeebhDYCi8P7K8ocf5QFePTaeTkKrfvm7ZngP0RMLNHfNsNPmIWgEGBKJJH4MahY2vJxs3QPPAgx5vS7uI9c/8MxTaGKXEx2mmwjse2AUdls6K6dnB27z5awEa/ej79EEU/ZkocKhaRiHogQQyM9zGdCtUIsneE/TI4QAzm/ErTsXfoMZMUT9b7bvmmIAymZjDSETz67VyUoOTzWMjDwT5mVL3CL/qjbW2hcPeeOiIGzcaGl1a/k73r3z7LOWVhqws+WDzFp8ej17BwF9xxzmwLfpAivLmNLABwJAJEaTxhoXogQjz+wZqe9jl9n586ca/3h0h+umM8vE56muX7S30EcXyzhUVQWfLuQauYjuj0lb6Ur+H9OPKeJyRB8rNwuaPZyLdm5pklYTKNB1qbZmZsMK6LqwYE9D/BeWn8YpHIBCUaNywez+5iGnFguylsVj3ccaEDBja08V8zpx6ewJxjvdEgeAPNRdx63CSp5XfvNVead/4/c3wtx/EckJHEjB+6bVgk/VKLstIIYpeXpE0igcaRxzDC1AZeYZ3VsI0lFauHVPH7sML/7GvAG53uB+uojyGPyte4xe0Yp2dk2O5sdilixPVGy0vVWXmvk861LrtnyxYpptkLnXiYdM7kEQs4L2EuOzcVhcnQvKE83PNcf7ZyZUCAcAoKP3PVzYbFbTvJRRJJ/R51gPq6LroVu3z8yXMPNfPVc+Z0kLUVCTk5hVvM3cTMG/+uBHuV1TiU9vUF1ML5N6AjVNm0+Zj9LwEjf/7N8ubdl2EIQlogJgdQFmr/lKmM2M4sj63edZ4MOLzzbxd595167apJ3JYdjxOLAKe6FsFSmS3KoMF3IYfEshbhlDrR2q8ZumysWUaSFAI5ToSKJaO83ka5yf81fK+WUneu6Pwz9gh+YzOAAABQtFk5XiJcezoqeSMJMCR0sjAw8fzI+wQcwVTEM1tKZzxYImj1Kj+2F+0eW74+gb9577ak+u3bU/Lqh8O4pj2Wy+srrl4LbazS/Sv++CYnEixUcsyAAQ1PuhuSHQhCmMFBRWLgAAvrqAX7vbEk1pkn5Mog3Xu3CMuMzCpTngiTNKok/YSnFZU1UzvhsyRxcMcFCQo0/7CbraM9tjJwR1xezcIieOjyEwvBbfg1b1Euh/es8Tox9sJneOdoHEccGCxkQoX38BW/oWB0MYXiW6dSzO1hYhz64jEf5NGGPyHxc9wwBfL/l1njfL886FQBP7eF3k728SW5T8mzPdSwtt3zxcHNDPBBWgwLdKJ1ujc85K4EEeq/D+7xuebX2ZRuiqtSj8VV1GTVvOP/3fNTdlqKIRj5EYwisyVMCYZEWAhSWOoQubKymqXWry5SohDLdkRXxtlt/dwnWclX2gGFantq9d/19tV4nGAABjHvhPp21ZiXi4Mso+hXwEJ3ND2W1gZD5BvobMPyvaSylzJt3oLDOFp9N1afe8rp3eT5c89uYH/QZ6Eho4+Xx2CYcdWrprqatZkiN+9Q3MFTWrsyqJx4hRHDwtTuSx7W23C723fF43KEjvdAtdRvsNoXOJXFTQiD0vHsg07uGGHWWmSJXpErfAZ6cogk76pjv5UU2HV802NTeOF4uYYOyog0tKk7mGCJOr9x2wR6ONH1z+xP9+nPgfkmCVvc15EzUgdja6clKtjJg9Jy2ousyLxBUy4Bw5iIpsUSxdO+Kdm+XSdd+1EbeO42ePzJ8/U2KyIShLqjX15K22Std4kFcZtSuvW2z4hr/38//zR16/3isFbElpVpolcNtjz9wC/vqX9/Q94rdN8/eBWjNPMQM1u58EQLc0zfu+EMEQFHEEkTBPQEH3xPxzB5pvQo3De8vWw2Xii+9z1Te1Ia6Hw4ScyDKSf5KhaXqzdYXcWgD4X/9l7gDbAL8IAtZckSAtQQ+EcbntD0HR4CsjDUpUSxRCOFrawNKdNzBiV+bhEXburT9JAZgquq+aaya6R1V0NtdD0iUdxVI8v/36gTas/slDuPqWRDMAukZsQuq2KgEJUsvWz8DLlxqD2KHXV3Lc43WBxn0SUUbshadf+deElhSUZ1Cs1KjFcoUziISTK/cLT1+beequr8oECcWJH7J/FJDsHINGmfnlMvGP2cPYRO2yXadrvAzOyCCBqF9RuMnLO981YDnbV3f+meUFxEhrtgTowJN0/e+2Rs5TnAUxmVdkAHEO2vSz4Su4kf74nMsQVyjA3XFxhY16vVYjwIHJjM889Z+mHm9Tdfqn2yUjgjgAZqm7fFU8ChyxuLL1LaHXZImNDb3rWpEIKFZbGoYky2eg64Y/vvP6zOtn41yuGZXGpq8UAdT7nG3Luq0pK9742nd/fYGd+Bf3x5U3fJn9W1bGMPN9ccbKvsXR1ORoCQqrafGv1VoMFJB86V/5w08PkRea3/Z0XC4+BAikqZVcBiQf0h5uJGea36YUlS4jf8bPnLvzejjE+gQ8uk4D39sX0FmiCyrwAGTS+CiAuGbF3roex1zlZORm9YkBXgYA6wrVdWZWvM6SabRv08APTuakSxHsTzHiX9ODATi3PqE69prkXbaxmaGEgvdfPu3huL0fX7Z7n8eyIR0zpw9/ScTyS+/Ath+nF3y5LPn3I8kZw/i4xyp0EQzd37fsY+g6JxdCMh6tFxlOf6M7dn74hYJkXMAArYIkrGBUaC5TOrv8WLLKJ9R1RDuuMBmm7v6wGyp9dw9waRwrc1cwWT8zUxn4k17jgbpRYMym5pAmWetpOxceFswdFQPgc4ziq+e3LKMV1Wsd/zo1/M4LL/buXyJ3irU8KZourU6f0/wI/Ifm3/VMYRRLqPfIMSkZL9VWuqOvfqkXVO7e9/r3VlRP6oiPONZDjGdcb1IQM0SNRDD0xO+ipO0Hef/Ft33jSjH66q9fzV42z8sqM8k8pHJRWlP5z0J+Phk+J8moFzuHw21cd0EaaCWddKUzUD87k8x6onrpsiOTkawa5+rOqzbNKPIn6ln+MK2RQoQSiyWjqsmVoqiRo8gAYEx+b2NoU+tsyjWx9a4A/vKv1rbsZ5/qBdFziJkroTxVMyT3dnZ+14cpNEk6nw5KrkK/8MTVF963bs9kmctPP7ldpQsjoG+e0KkqsInA9Inzygl4ybF71zFJuq4FHsmtW2Auw6Ob5NOuSCDFpeoZgUUIWGGxukHO3/AGcxlgfG9LFePVVpGG1Pf3l+53BKCNwtUVL/Av4laHWdfYNDOP41sOVTw+S10PaQAMANIKgusJ6FmjBEAagx/+fI0gOIK8lzMeMfaAeZaTfnzFglpZ3Rqxrc0PhZygVX8639Ew1+OjOfb6dx7BBuaRjHg4L8DmImYEPSWuhSU0Xv7cEQSxFQbh5AhTos8/GvlGtD19cMuBR5/j+w8m6TWYVSWX4k4iVHAaOjqQqV4jWHAkAc72xo5GhG0euHIpmx/HY6GN94W2ozTBB7C/6RjPlNOCcXGB4hbpTOqX2+7FXyoSHkE6CQAAIkCsWlrIbfSATYzFbsCth7eaEOoWrdaMPK0d8NjrhydxqpJsmIRteyiRWEMvJHptxwE++vt1rsSZLU1QqJnfSI7XOlahFZSQgKbKwvznAOc3+Rq+HaEYBMcYqODbbv4/fMuXFDzXdP0WfnPPJSZVwhhHBiR6jLc3HaI7UyokyUMLrkCoFgcxlejLJV193+zOTjc9escu8wXFk6McCfuXlipiqLno8FfZhEdg+9+UWLXOIY27Mi5XJgrimRR90APQk8Z5Do1QTIeav1join7T8Sx6VvLw7SKKrKoIpWZSddk8JIhzpsYbHJ8MKCU96AqpZeZa1NnBrxVCXex7lrZVJVMmi86o2TISVpsZ9qLvlPoomGYxZaHFsXujcGhZB7PYrSOlzcERbVQxFBSjuWyd2svo5HTlbp9hjOPXFmom6BmvRoKTlgn73Ofd4cGd/0AP1mn/E/+gQInvCDxwLfFTaL3KV5lupaXNZdZYRp9LkZQiphiyacoJNQA0BLGYdzT8NBRe/+101gtvRwT2Y6aO6xRmULAjYn1RhuF1+ZAr8UD1n1766tAQMame7uIBobnhLkCUdOXqZWI8eTGTUtOV/vYy8YMufk7U6AUQjxmqZTg8mTsLbGv1oZ5fLvD3d0v9VcdAz1b2S8+d50EE1F6goV5rNXcyGkEGQkioDqj8ox62rP4kvN61n9nxGJMqZZwTq3Wl463hkKBXTTrjrhp1g8PpBpECFLDa5fkftPUA0RLG8CazG1t1a+Mf14P58eL+LXiZxqpDYAIC13v0YeMw0d/iq9gvslB470U1CzEUjV22TNVI2O7GskDAkTVc2LfOUdjcsLrvTgx7vbhejC0iRQUOG52e3fUqSaxYsDB9lg0Sac7mZZc9c8hYUi3MBu0rAMD2OsRI+LGRkSYZBaR0UWRxnm5TL7uzF4eTH7kBYNpIyDvWA8O8p/RIJBFDt4zLNf8/6PQoAABs0AOAG6q0A4EPmr/rUkYW/u7Vhy7+R6OX+i1MliE0HOJqK6dVorn1ms1vi/NBX83I20futYyGRSjVZ5nFFfuZVgK4BV2P4YMt5Miv9Tp+m1Glu9acL8tz4opwoPCaNHLe/t+GzZkgrgQ2n5VKA0SlSleRKtsMZ53XSfWxp6lodcaFk6HWVK0HJGwJZ2cDGxPU+Bm12NEmjglyRFoqZRjbb9z7UWbIzP0pJMiI4qYEpEslDgCAzR0MtgcBI66cu3gu+Kz13J+eFVb6qostwtSwAc4ThaoyTi8dk7DRubXr1uKY90joWHe38Zv+A/tGBmF+IqSYrGAAkJJnFd0bse+yWx1seT4BEFV964hogvwMc6Q2YygA3NaCK/NGcSLCloeioUU2cSAB4ItSxR2MG2C5pVyJcX+toBrOJrtWzAPqsB7sFRpDMzADkhRY9DYbhn6MNiwv+5Wjg2Kt2BzPOm3QXg+GNKShB9qregDQq37lN3/6rb/C0t56XaIOe29slcAaHMrOtWNNNC93KUenWrtklKDKAMUFo7g9qq2bYimVoKP/ncZeQSQF8D0N867QpI3/w+1p6rUdj73XPEByo3r/lGQKoRAzGWpeY9tF17kdYR4zQHHrZsiQhMJ8OWesJAo3Hk5PwKBHTM4JdeWBP12cSD+xs/tCHg6K5revGC6XitwqzzOfYUie+CrkpEg5EoFLYWY5weaEdP2IOA3tPQDQjtdBfjVr4OoXyxNLGqurf813Xpx1wb/1WENUlRdVRmKutP/ofbGyyDZFzpoi56SXG1ISoQKQ4FO15464NGAkyekhdSMec5guZmLuU3N+KV+y18wbxy6dse1BomqRKll5+OH/FrSFa7lOSZ+pvpeM5LSspU7l1L1SilyGPbWsXEHZSmeZq2SxXAb+9IM7f73KpvBDq1ZwX45myVdfefmhlTMl77W2ZdxPN0Ybk+WAAlIJW8LNSYv9YkO0fkBcag/6sBnS7JzCwHT8OhPNnVstBsp/XcuXRmxyNMuMwzTZWCfxMTRDLWiim1tArauaNYtfmsodwy6HD6HxbBh3UngLF2oypKYjdy7el7jjlk0wbXZdDOydD9V1EgaMr/5Xd41MlrOs8ncK0rc7hHgQhhTgz+V4pb1fvLE7NwS2zgEud3QarIFSEHX3kbtOBJ9dCqIgSPgeWAV5SE4RvuAL4Ts+Z2UYNgAYnOl2EKfr037wQ7q9h5yNG9d9uslg4rLiG1e8UPzTGxxPW5G8dPerydpmRVnLLV2kBL77JrORUNYaYFnI5SERKvQmFZHuqdWF63JC51fNIWKmlp/WyLDK8UQBVZePMQSHIyb3larTjCGCVa47+uf73VtrlrdcNTos4YoyN40rQTV54SmMKLLsGiFH6vYruDqoQrXj/EjvI1jb5AeO7yd+q+FC001c+tXSwWSJJv+RLx9uyTEfi6KsSoHi+EvtznRJ7BengaNLBsUVHz62bJy5zpjOp65siHK+CcXdvIRqNeIoeRUcCiA9F0v+ZspSFM4UfKag0sRGCdFADno3/Ponkrlo9w3OMo5/ea1eKBspSnOEJtl+JvzHOojrSWXTtRe4GBlNuybLXwe+G0/MkXCq5nlKHRf1FwpRbFjjuV8colJf9UVBPtkSz+cIBD79FH4j1tG6HD9EzV3Gij+z8e772Pffzipid5PqwlRtuU+zqLl3IRvnpOuj+TSI0+I0iNNJEiuJmwjnwIz68vdnkzscG5hQtWbPouLsSIlDLat8JCHZqSkwNY1bM2SGSaun2AIyLs/5kzU9TfkvernO+vohGmL2OxIV6GEytOz43bNTDVycAoLJceuxZ7bbB8UpGZ1/fc9Wp8VNyMUjq1fvXo89rSTx1FkPAlEZvlirdI3r+vJmbXFoEzqrslcezvP7R+hrx4eqCd5HK7XuvDDJ/mdtmDMF2lzsZOnyPKCFWTEXbD3tPWBIi9OkpGQeN/TgKzrYsg/D9r4OKaLpLaIchxXk67fJX+jcc3gNRe5ReyS62nKFlUxdWhRT+O3RU1c5vppZhJbPksiU6p4u9dApzWy/2V9JUT/KFsslSoFySX9kaRZLeWJXxFxurkT9Ytvf06bNsUhlIlpX1ezzukpl6nGGiJmeuSY0IO0uAkveP70wp7H9Y8mWdf92P6jU9LPmD+yTi86wTcdYEeHT60mZLs1KpPpBp4jLImCDoCwabA9G291ig0RxvuXIQvTpxJAqGijyTwGLvjo5yT7PmGQX71utFqge1eGl8wOpDmUjJsqknnjRiSlDtWOyX0OLVXVVgqvZGVFN6cPmpdOuag33qnNsfn1XhMEA56X4rLHISoHpHcMz5euwUfHm05/1LBlggIIShy1msCxAoaLPUhRE30lFkOOqEuTg9a19Z6D5cCOrCDdWM9gWFP622fT9IsVUfydS1vb36UQgRsBkomCVegD+V5D2HoB2p5LNzff6sIsJ1RhRjJ0mfdbdzgkGCEMA7tp0IpKuBwIRDpZ4kYiAXm5wl/gCILsCuJhBwcTzOmBAgJ1bLvXiqgLBjJE2zHv9swgvFwvsSnmtSmdxvPDniEneOL/FNRfOX8hSgDB+CUdQYgGoWAGQgOoi42OaRigEkJQYjx9QV21YLOBX8WhVs/dcv54cWo9NBY0jcrb7I1ehQGYYQB6rlfYAAPS094C4RwztPRAtZ75Dq/C6fDk9PnADN5+/Me9jnZbEc021v5ma23fNUUUzCKWJOUIJE60psJ5TGmhtiVQkxJHp9GxO8PGfqh3nkOBwkQiesojIC3JDoU5HR3UUAox7JeimO7xe9jPtuVqeOSecvo2gcDLDJpkKxaVxIlVkiiSss8v5nIksZJEbt6jS8dbZtttZcGKwuW4OX3HZk8o2VEI43Taqql3z04CyIuCgwUZIlwHAlmgoRuvFKr84USpVE2S9voIbwqm45r2tDMUeGZKPciIM3jcm6TgU53lP16uwWAKPJTWZUl9kEc5yklnlZInRTK+Pq8JSgeVLE5ZqvjDZRnONQUawwIMJBIhVrFQYsBQZh+HaR347k0QcsK6uW5ESIVkILyMOW5CvlIraNI8FIMgQoSvK+gKXrtPjI5Q6IZkW0NkQfko/Y7wwoAl1NExWdWdoecoC19QEiYYiRNQZg0yYgQTwR9oHouUSB0rtA1GK79Sg1QyodPmm2yO5pRtYZ7ou6drO3bvzV7Loik/U1qZ/jqOOOPdwJqlbRU/XRbDGF1564ZUiF9Za5kcZJGktVeBKBTa0OM0QYlfUHrLMJwXNXnZTicqhHMV/Dt2JP3QGlHlHOMaJYKnp+xDK50WBcRWFcvlTv46B2YT50mxoY3LEeMbty1T/6wpWF2LGM71Wt9AhOTsrIbhxyQ/UA8wyNm0FkHpsTgAASIsh3e4EAEiD2DDQjjGZzNQPfp2Nqfo7nOsKQ/M3N2/Pk8WCVUDgRRyASQ6qBsdw+HUSWFY7xP/8HLTPWad6jbsKahGD4Cqw646NcUJxNk1c5JQFvSOlMXYXcAAvUGOXuu59Zf2FCpZO+AUmXJSk0nPnL+Rram0NJDCgXDIIMibXVKWV2ntLRN2CgqtSHUazDu4usTMJS7AiFvvac4mWl34ouZY1GpTNCKQAxf85eDHYwAlpSAOIYaQ5g00lEkg+vHIE1xagDTz6/cJXj3w8UuAVlLUaLCAbrf50DSoBNTTy6/jJROpvrdJWAAnwP236niEpyuFRBpjLTJDdXM/n5Kumz44TcIKzDioVFgbDgyexD54LZbmKDF9FIGV54+gUwcnz5KXcwqJcXgXY7ZDzaaHThAnbqqtH98VAH2LggbiHOZ9UIimrLq3O+SruHaXNF+dGTo+NpaHHY+ACAIAyDj1iSItBDGIA8UgcR7lcFJveUcj8xVfQjPCdmyfvJTcM8WkoZuQYR1HO1X+9h5X/aZazPs32xG/4Qfn1F7OH7pAtyjfXXFQL51wr111QoWRDzpqgCj5GNTqKwfn5OTYexya+Uk5WXHNFQtxrE/8zE3iCYy9zLogjnDSrAk9g3nLsXC8urMyRZWVMVTIimv9tN7kzzV/1zvFnJ8y+vFxk4CCKCs7CToaG9i7692+qcgWoS2X4GQBIxx08CoAD6YZEmpPmcAzYyHRl9Lybk1v634tQTzXAd9l3y3vIUiRB6kiOLAJmYsfD73zY84DcNwtabnz97jnJ5syxjDY6DEc7vBeYjKVrK4BmrFm77c19AAea9NCYGvnpeBQ8X4gGYjT1mLIUXb/3zolUtYlTODidSVosMvWKuA3B/AuJs+BbxAeY9kwXO3VwkiqV5x57c8vTOc6Y1Bhsx/T4DEgMIzAPHjv9wVmoBjOYgQsA6epasUBpAAOInWkxiNPAxR9nPUqWhSB+5JOqqbzUcPn6Gxfj0f+UaPXplIkFsW+6O4d0KUx8u0pX1mHfFhovh2/ImTszE1WS2l9AqNJzqEIunTAasOt+eWDym2eONblNtJFlcg3wuYqMfvzZH3/PrRIdHTjzcPn/fp3GR0TeSkNHXc/z74+QYR+tTbewje7CRYc+oSesFZ5IWOckf7xQM+JJq9VHljegvnRjcNv8k8Y0ElRHo40AHkgAQDWBFzg/6WSjpYZEQyLN4QAff75CMXkBY7LQzuoM5Oq7SCJz4ga5t8TvbSlz2GytyOTizFhoXwMuU/Ou6S0oeYLyqEBYnSp2XpE2Sgu03CnNzWZ3LZLMA9tX/NEdGpuT7UEakMrYvxoO/c1SfEBzsnq5+1VmYkgXUqvNB0RfqDrvUSX7M2VdUMyOpKctTJ4MmKQEhrJrpL5bV/57NkvJyeqk2ShToz15jccddzfwuRoJBpACQ8aQEUOBm2qukNqyu8GZFhsy6TL+RIhVkscTbbvqghyS6OIVrXzN/LhMqSTzdlZxIl8yXLAiuXe0i1bo+Cz2L5py9LwrGarI7IlcaTnio+L0DPsaNL6zIF/4g9wecL3vhVP5lBpnoGhZ8pm2s1KaZ3uOKxq45oreeYUgxzrn/ZfpIRXaqSKCXxq9VFZqbGO1Hl+L97K3L6r7al69VXzciGbZuWHGUxFIq+fynnNnWrnFUvD8ZM0QBzKQAX+MJvAJI1GQlRO2fLoMHBtWkgFDosITO/xAY/aEQj4D7nFBEU/Qq8Q8rSA+k2lKn/2BryXZojwHiPlNjW14AWABhs/TLPuh5CW7T0SrOfnuWWpxdm097oXR+jcqFcirjDLAN/z6EISU6vryzu03fY6oqg6eRJHkIP9BKfYjDpyEaVQOqTMMso2muQ44Uf3s7Gf1pwXlt+/v/GO1rbbQb6BqGGBAaSkhBB6ApAjAAAYQizJxjjnOOlcygDMt7gZwYt5ChUrm122fyPIHHBNMQqELcx8DAlhdIiAvY7Jyqh4WNJ0oEnxggWVsODWyLy3G7BgziQXzC/zY+KC2PllWzrmY5R3AAO18U9afDciv8Lt/lrbWs6AV49ogFXn3z2NxrXMCPFCC6oJzdirru6qfSWeBH091DNHUQw89DHVBnZ0DpxCwwTv7cBOcpmtBdYIjji2YxRIDMADzXAAwYvCDAUR6/xQRZZ+/YgAxzAcA/BFuWFhaCmKZVC1N2TNWxmV3h64cmcvh8UlBbqS3CfmGfN1K0YnOCo+mMYR+JQz8xLWDZnlhVrqk0o2EM2c3Ssh4MywwBxTyiq0YOZePtw60NcQVrAxBaOaO4QUsOsSYL0jYfswtWme7ZdUffpaFB1LKhIgTYKf1rZ99ae347OONiai9+vatHTSbZAF7oj/Irf16o42NTYVZjWzEIK76qpAPwMmAwZ/hZKBaWEk0ws9iDoAtAZiIFGOwVzkW7ftFR2uqKMzuhbmSV9lVAkJCj1ZtqXPY2I2ATjwAcqAIxo5e14baVkJHQsgeFzWKLsjxwb/eDLyL+5vP/mL9IsdJjlfsUsGYLnzRBIMAYWCq9Gym7ISoZsSXE1c1n1Kqpivg6a9jpohC0EIKoPuGD7aZdsMDfv6IOOYyQYbPgPa0syK6+sTrnxafJbqSPmCAAZFZAQYwAPhBBAD+XkljSCGzZgD22gCjKyxqaaB1tlXXKrDhHJwT0+F6OPcNi5WzrrMDh8uUXAygQoJD8JSBWs3C/PBT5zAZgYPBUYlN1B5HreXD69nbNwFqfuMmTl1R9hmjz9m8FPVc2DxiQT0VX4QMmhzYVQbAmJPCetZ8lZnmcEYBotxOtaCZ3+Us75kxH93tJWSogHlZbBqRb4+S9OQ8z/N38p/MTNQ2CCGTMUkbAfzg/99mAMyi3qnhUDs2CplqZxorclASnC3gDIwgJEYiULN/PNk5svZqlkCvM3JgOIpH90LzlsRUX540+/JiPE9stXnq7PIZvx01IX/L5kr5wI48RWF7b/hCece/PmZIqkAEIuqu85OXPveU9LQMc4/hQy2DxqKXGbu6MTx2iZkvbLtWb14wKrbV1Bk8V/D15XJnRXhu3vZ/PpMvKUuU7iAX4bK0+a/+/3KGHSLIZXQ60kMCABjAD34AAA+IJDeaJy8tVALEx/BHWIVVe4/kfb7cMj6u5vC4ooIEXYXL18hG/Fm7SGpQi5I9CiPSP/97UeO5ex+EmntQqEFTyusKpBQZ6flSfqFC3O7hZTXpy+afczp69RTkY/zYGN81Fv5R8OE7nFKiPNCfSqTpmMpauwHUvNqHC9rTuJQW19AKacyPG/62Qrjo3U0/PowrfivktVUwOZ6hsqSiffctlg87VGFuEcpZUcDsAzBkMraEIWPjB8qcWIEn4osTDT/5YzIVfkdhZfe4zJmz0mLFLC5bSAH7fkCtPr9Y938NIiTlVQQ6y5zdTQcer4SdqzcVwmyWSEq7jYqpssldYs7HNAUMONHJFh8yWZqvFPJ10WZvjsusoWcMaWbF0LWKkmYyw+blUIZQ6gWUTS7g3ZOnynlINgWxGmG2xOf90ssUH2h+mjG/clttXqLni5PNuiEp1J/7negvdKqeAcjosgFOCgAyAAnI2JwZDmfIwgeKU9JMlIaWQhF/9IVvuIsvONF8aS1HjXEZJUU20kKRfvjzzsaQHqsQXIaMwaVw5rrlY7Q7wZGiXIHBxViiwJRlvR44IH9tJwVlekL6s+/SZW41U2w7vlTfXLqizsy0q0rq87MNw7kKlRMo02ypwue/oZGP8e67TnxXrOXHEVM0YFMpbJ2O1kcx8b837poq/B+bchmxX5qHbbxYp1X6+m/ZIk0RQEEItJIUgDllSwBAAgCAxwFhtptJjFatnhqyYZmn8qWA87l555HcWuZwSwmOHRtmYgzTohR2ilRUslQkHVseTd26bi5RwSXAIO9UMQMJMUAhMld7bt253VS1jknOS2FbW00zI5CDFbShu8OBsLmG+ch2By7g084fktMXy+A9237bFa+XumWPgIJiG0B1NbAuXkyxh08Kzlr//GZSlhDkgkmXjmQZCyWBF6N3TGUcACAFEjwAYPZABQAgg9JxAIAsNHrru4acn7cT+HshBwfRN4xhio9n/X5LnM+qiEeHEomQV1SXV7MzorykAvnz2OBPnz7ybxYvrcHdulRRQtNM6r1m/bmTq7hyqTYbqDi6G1rLxzLWXN18jsOZby0ahWYyx/sqevyvbnaNmDdkDmSxlgUZ9fe3dmxeGmy3vzM87r9F8MH8S9f+Zz6hByk6y77p5aDJr49h+Pbw2bB1DquWQ33PIug0ByIyzAcpMHsyNUPlSV7Z45BS1kKmzOk2qTMpZdXi6gv4n9XBUpH3sPW4Z1Gik8mE5rTWjEoC87yLhy9dsia0WTI/vGwmjn4urPlkK8+RoROkCxtSS8Cjuq5cOIMPT17UMijI7kcqQjT60EFmVZgbq4qn5WCLGuVf3v3RHlVFFOORI+5aSojz9aHQlnf/UH9JC9dLa9+s+nQdEdsDbwspfrxq5cds0fdqdwDx+XYqUacvLb2ubt6NYZmEDRkQ0LIUQMpcTHFUPuOk6UKlSNpy5bK9W8LhVI+oxkt42w9Lm+8oVK91mCaDYexAx+TKB27Zz/Y1f7e+z3zkJ4XJ84nd/8Gi2K/6C1o5r4gwbDsz0WqaFGi9WYTjVznprm79O+R3DqTEsAM/Cx8TslmtWZmCgwZ1OK+z85M7sqgiQeGc8PJCGUs2r35h11Rqh6z6VrHX/0Qovphf893p1t+DMJf97NYsvuiO9PwSP5n38ivz5m7YYH1h0pFlZ8qDHdiIOmVOQQrEpRIu4JCiBQpWALJSMHG6TRlecLQK7Vy8LqBFzJHLo4hpYroScxe7D42UGBv/mS176nvQI5KJPtdGzRcyQb2m2sPJNyXJAuNcKCMLPmul8G8PLyGD9XvVA9caWG210+HSPx6XAivExvhxGnEqHHpOiaArRfJhnODKBalHMc75zo1Om4u2hQao1u/gfuytremELEFCF9PLLj85VmXxag2So9XZTVZqLvFMXpOCNICJBMIDAGAGAG+qelhU19MGHgAQZgGE2YxoBLN8YDtunx7D69KGZrN9jQD/PvjAN/saH4cXDtWlOq6TMEyzHWaWzaYHToUQYVOZaR5/fTBBkEbgxZbNrpNlW9wCrDUF1exDqe9lz7DTUp7VClkpF/39izwxOEHSuCC4XJZkID7gZ59vx7I2F4CrMG/l1v8yH1TWRRI4kLbq4MqFVOVPHEz6h5zfV2Wlp+il/fJHpSkmDWCCAOEBM4DBA9CTqvLYbnY1kXFhDCALAFnQZYzYVB2jmaqqW1W/s6OexXzTXrFRv2x7/jlgPlrfJExWCXE01qzHjQgzNLqEWK5CNXPpkRpZAchyVlk1AywZzFrRmGvR5S6aiosBWA4Mp/0WPuCPP8LQUKonSbh05fOEUN6H3TKrDpD7khMYjRrgNHSRd/0qkfAFTT3fHfx0Sd3F8sRSnfi7nokZo2WD+TRIMtex0//vfxiP2ewB8Js9XlTNsm3Q8wYJcLOHwAYAEHOXy+ha9cSzhs4jqxn7HqfNY8aEnGIvDvQthUPYRZ3P4ZicQBVmAQRhmoY6LtjbvgYLMEVRCafwggumlRW+g/wZP1DVWjc6j5vL1FGVmINdZhcd+pb5ZPVULTCU5kMfKNXc8kk39R5sF45UMUgxw/7X57epVknQhLjJ3U4vubz9kzUX6ujD98DuzOK1VtRKeUzxS+O8VBrABGQADH7QB8xkEQrT6gXrPzqenB0bg/kAAEJ3UIswh2bTeKdljQ2d3oo8bFF7vu9BArA7xvyzinN2O4xxyt59CC5FCGMNvo/GaM9haCEqRVFBzpQrQExXRQXIHSb2r3cx4/OATNE9+ybrl8qkSDBN6AeiX/adHx/78kOaorzUmARZx7Zv/2RrzuqXhCD805Mv/2EGPI3U5B4b//CKT+/nt6nrLs6/87Z19SWs8cBwCXt7bxQAQJcEBHq/GQKQTAPtaVv4yfLB0II4e/58iGWg2w2NLg0Gl/u/oo8NnkDcBbwPiyMVz3vel9+OfFKics2lF8DHqSYXbMFmq4xs7jlJIY3vePety6MeogBBiin6YeEhfTDv/oJGo8VB5QyHi0r5Gt7ivhK7jAjKQg3VZvtDx/2+kEYzz8uaAz+u/f6zn15ucBrSwM6/fD8drPOyp6HquYz0zQ/uq9bBGGPld6S5IXR8sbtYvsUj1CcZMcxIwW8eA48eUDrLw5uIkSWdw+uMdaNDEFOUYw4Yi4tOYVN8D/dvdIk9OPPUzOoH4btXZtvtDkFVPsF2rAMuik7py7R1JOg/sSe78t3vqS2pFbvHZZVShZzigF0/Dif74zDHu75XAR6MwCks6Lo+j+dzegZ8JKAUWzAi1ovLISgYU4CKTEW1Jw+MpuK76eSh6bTYQyRx6S7DwP2zBjvrp1pTE+8NqVEWobEN4C138co4QBp0QBo8jWAmQAAxP1Nhy3DzjZ6TwrWLMgoACLLYmvAGfIs6wDvbPq2QZlqvPw9nm1x8cZye75ODOHI6LtPGJwg2Py9zxey1Y94V8i8nTKH5+lRfqZBSBYSV0aA2nE7omNpL6iToG64aWH37NrXclhcKScjMKtUGtENWQ5ZEnJJZ6Gv76rHlS2TXbFv925bKo9J9LuUD5QSVwksnn83/dZYsw07F+iDUU9ELZTEmNv/d245/tbqS5kLZRGMYlpKkUikoi3EoFBKiZDFvi3MlFWkoC3l7rr7huzlYma7xrns0u/2r1oHdDJYJCgbJPPmxOpKMDM6W6ghkV9WCYxrg+9e6bhrDbrQncoM//LCoOJn05qACCKON0L8n4kQiSF2aT525eCMHQFQopdn8HqNbfM4SP2tCiZQ22S2ZF7m1t+mNCcEUOzVz27Hrlh4IMWHg568MCbHbcIqVmD8Sg5wxMgxgsGwc7yHTz7tADCDyEqSHMicBhBBL/79hQkOlmYiLJ6xBa328vT70fj36CxOkjlR5tLd0eXZMVdPmpYMxB6HpZEFwxm4ZpVmC5Pi8c5oIGmSgHtXto3V+nNk8rrWdp2uctrB6qp/JGE0joBaengvXu8euZET3zi/zo1pIEi3XRYwAfJ/JiwrRhZHsYRgScHJimW7m+b//2qEJZ/EyCaX01dHLB4sZ2t5khVSqDYloaS3jedc3IP2P25QRZURSGBKBOemypgEgTcpRNAjQKM6k6r9e7WHkcbYN2egSZu6VZVnS5trC9lUHAR69oa5RGQEIQ2/aIB3Vq8gcyxFzRAaGqhGFToxtbBwz9E5NXjzzNqPZY1clnP3MGCTQfGr0skmhnIZLO7ffuoYlKKmonBpd1ZW8ifgY0ZNjzL8TSA4PIxJyAk3Cib8wwofhrCaH8djshrGWg0WQ2f96zRW9rn0Gg9ZpELzLAIqxSAQZHZAgMkMSrC6AjLy+PssotE1NsbRJPDpvava40oF0dcNyEXYcuJsXzGMnUoAaXVPXPBDGaQiL+86m9o+WHPmXlCWBmPvaeQ59sZw7DzWv42ismnvhzm33HofmyfMspgHfugpD/HlrJE3UHLXz1ijl0AMuyHBYWUhMUFnGm7VTyHtlqqScXO/UiwAvy62pBHT3N3KHuaWYzbKiuS3IUMYtn8M9V6f69JDrcdRpq6Bq3fBP1QAwIyQ8mR6xC1wwNDSG9WJCEFujImUMQIzj0ZZuL87EzdMZrDjGdbUMr2msPHndKMCWwQd2B2ggdS2oa150NA1QlYGHX0jFm6SFFEiwF1siAaXkDvgn+9Ez53sxB8Kb+wcXRE/A1DIr43QiGTA7Ps6FispYGacVc9u1OaWZZOMys7Css52zBcoCVEeA/BB0LX+l6t4bTnYEvkQfz4cQb9XndvipWr94DFrnwvHuFSh4COkZAAACoFEhBbAodIvACzNps8tlBVNzT0w0RBA/dVUtZvyjeQ7WzvvPm7Ybe1jY1du6l5L7VcEwHmxk9EQ94Rkfm9gZm5YHTzgf9+9vEUiYLt4WXPPQtlRxeO6lV2uhifnUXrunWXCMUbqbo2CAH5HIBKkKjsg8m5cmK1+PMgJ8CMVABH0TVUCDrJKAyWO3vovdsp55mnFOnjjqppbxpRuPBl7X+36uwWWeTvjxvKW2/yzAur0sNCgS6QDAY4Z219l4f3ch2xqvO2YFF3gIq9XVWPXxiw03mscvDBowzCD0krv70hyk6X5l8njbDAZnZPvSKQZvCdhBcf4UFmodtBJsHrjmdtD5I09nDZBFpMq6cf88rOv3srH1IyFxOMqAhigEG2dnfHJgYZw0RdGySx83Yr5ChvFJAUDneQloABb65v0fG8d/uP5dbi1DEHXs5AuHecqUOp8I3nobJqKbLkfXzIGXr0aeGHm2SQiNGSD+Z3k9iuYBq+wPiQP9J7RgVWZQElAwnXn2Aejy/jCeu28Gf/w0zcHq5sdkH3bGTqt1IiRQJl9XiQDBF3J0snqeSJDEsAKGdW/ZM+7snsmXvtq04B0O+kWJa/RsYfHDRa5mbct4G0myrb6L59fncx/U+NlsHCt3P0/3pSkxf4Eq1solKnN1gaoEIvOR8ViMkXiblvlilPDYneQ3FS6v7XD/lfu/vOjtU6faLDJvcdNIrfWCjTlrAo4UPKkUULxU3K+Ye2w4urgNyTjAKYuGIhwivPhJtMKz98VnT68ZxPCtPNl0MTY24UDbeTkqzy5Fc5vxso5iZS/gonJlRM+uh1d8jP5Dg2gDgER915cja014i2zONzJHics96GeqmRz9i6p0xpG9G6+/XuVi5yBDMa46JQFWT8k105ofz+gujt1Ji4AfGGIxRQ/r5LqPxhqJyAiE9QxIFZYmuOfFz2kl5AL8kw1LM7duxlTZStMgAiABIAZJcJjgrxd+vkV5joYMuGAIGtPRa0Kwi/YKr+d+nR7F6IYPRE0ju7FLgL4z36+txpJl3LKFM4bBLdm9GeWYlVQNVO6jyYQm++e99X0pgco8AhgMHjsmYaOthSwm0xcsC841R8xILmZ7+L4fRcBOAUNf0AWknHtnNSaZK6M5ybkSYjhlVgxYKQDw7Gjs5yVWpBm4wMB0PGd2CoYdIZEJQzDqsBwF7wO5RJIRNTHgDQBAuxvgTHrpTccPm/8m9TMwBB7gT2Pmqur7yzu2SEVM+D9F/B6ysukS987xzoiG/X12HlgeaSrOTM7wmH+sO6EyjmsjuDxd2k2EJObUr6W4TdowmqtCvVMsM8N88h/Ld17W+E6iInZIQiZ+ac5ma4oQV2hWVSVbvMwk5OpmoCRlKi6vtupHV9B0pv6vQxGmgBPf8Wpz+onCLWNHk0q23XAqFKsLOaylEasqEtdpK78YDTxvlssgKJlTAFOAQ8sE3z/WU33DAbOHrYnyWSiGrxndFWFFpqeLjxB7r8eKhBzdNL7z4nHd3p/pvVaP1wpipoD9I66/8pt5XhgalwZZIqZOCNEli/GNRDN4vQOAAdY/SGt2wwA7pxZpDRyntiaq4Fx/mCMmyAocH7mSuYkeyVWovgFVsT60QuCNVkV0QE+/Z23EkNTiRIkZvd5xourLwbn1sxJ91taGKwW8O9oA+xzzyHNuk3kAE4kBMVLwAAAoQJyd7avnK78eWv2p3D8MwIrOmb/jiQ2bxKtLM2IN8ZQCy2cnEssLSgNc2sjbajUvIaKQB/KhnXs6p8eSQkiXzs6QL1x/FTEOqKwfnhjQINs1Pc55Y1qDUZ0BCUo/VVLKTcsAkIgPcBgQALy8lvQKhF4gVZnoYPhsZ3nR2mU2pg4EU729sEwmUGG7OZUW40am8SKBXa/ThhxUbk6STcrS5mdrFQWWL+oRJAFgEJJgAAAFgMtVZkgBRe+h3l1wJ5h8wVDDS1MH7SeC3nvyim33WecQ5MsP+e++/nt5V/3FOQkqRWoHIHjU7DGaPmo3JtsrgB1oGOEeY4uDM8F6n3fLMbuLN8XYDQ29svPYmwCF6/c+XIlIr1S0AKLvoB3LA6cyYXsxsfEIoNyMJGZQD7RSclrATAfgcr9yMJYWEIln3uxQH4r/Gnb08anuQMU4IpJ5DFda81Xfna5Wbp5u5SVUE6LR6IIMA/7/JR0UQrd1iG81+X29XZ92yG09f4TckSzSx6sx8+N1Jdks/Ia5vGd2JuzratNXstcqi9vPPPU7Qc3lke9NCUH5Qvss5cFHaDIppMpaQFrhatsvXSeiaH5trHWsxBiTOB8t4RMsanjsbB+pnMGvl3KCJG6yn5b/bAjQLCbMtfRV1dJlwkr/9aWb2R/Qg43tfVCl+2UgyGn7mNt/tviSZoTTSwo6ys0HdFLflPPKDcELcycmv7BrK0ozcErw/xIboOW5agMR9WCgKWLI9nn+uPbq6tD00Tbv2ydXVUSzDFwsS37JVtZjQUrRyCmUOvYuBdVM/44Njw12BS+tPT1U2lo832JCdQweBIaFY4/+83dV4ixOz5S4xkPPnT/D/aCOKZUmgG7YE5Vh0pBtojT0mdP6h8w+DiQjQonH5Bsd4ObTzK8LWDFQ8vOBWY1ey2bJ/aNZTuYNwTOqz5PBWnkwj0a3WCj9PXDWGOo40Xs2VM9nADJgBqft/w+NW8caG2G+cWakSr9kG3RIJ8Kspb3HKx9EtOtz1RWMpjfckXEiwIO9kiGL3+p9n0HaqWrArn8ycfiP7A8Cf7kJmplJFrWyadzGxPFb6+bOa744z6p9/IfDm/r2PPmGeOjbiTjGwrRH/7Se1fQINRSJ/u1Q7Uhs7zuydgrqIWSuKyKO7cjLqmn6+xyiy7oWjP7TF7aDyZ40C2YyKrVYuKm5dWHRpasbf/pvxG0b0DJUdeIyDYxI6gHb/7InMaCHamiaGW0yN/BPc8H5BPQqXXHvx/ZTTTdMv/jaDL4596/idJsYCQPEkfBy96Ca8RlZ2fZnPNbOyy1/LXR4kaXZA2lw+W31rOoozaFnlRDXzbm8iFAXr32Kx/eyIoEZ/YKjd32tv/YfEsGVSHggeXmTb+u9GkeLmN9jy1vNeE0dpNY+eTxHajFOsCPXll6r/dKtvp7dtIwXL7FyWJ1NmXgZv3zlNztOf2+h133ST+RsSQ7ACB8SGVvClgB+IcUaYsWHOgZJwr10sVErGG8ic+qWm+0hZE++ZPFiTHDZVctkTl+udq/cloXZCWeMD0Hn+5AZsL27gJ03zg3F8AsSyfWPnFfhbiVdqJ0Sj0p0M7dugHl9x0koGq0kXGsfvwkk6Mq/FUAzSTEU9vXdH0ncz5wdmyNWFKcY3sXK6tMjpX4v4oeafrBOGz2PnAx8A8yZbIGTUTJxIZ8921vCYzPCvA923HfzYgRTAADtAAZwglMoFEJwzHaUFE1JBnKtAkTlssIz/62q3Y7WrW8MsncNAkaXhLU4EerjpzX4V5gvZtRmI3liJ1hB+c0dNHH1zNnRSdjaAHtiNyc5jSWMV0LjM5mQ7vTe3o9LUAIeeV6l5jOLGBCDKPc4X1lAHgBVuXv41Ht3LGkrKXVwppboYnvqwSJGSLCcaLWACAN+HZ4Uhnz7TzNT2KbVGY6afC5a+JzmGO9xT/NN2TwM/k8b/v8tbtA2efVF7NJP9QsWayan/bF3q0H9AAJ3ACOu2VklwH7yhxuG+uONM3tOXFo03uWEmf7Jn7B3104VxdxXJeO1dQw10KP1se+X84Fwwvvsx98bdezBWMm/DV7qnWCgADWYQ4j8wO/qimL7RyJleelKKDRl2HOm54Hag1dKvwJ4LdOLwF4PkVamXHD1e6BCdLM/Z+nO/OMkeyNRIELHyPBleyP22hOq4N3XLRZia0h5ZT5IAQAyGQAbgMWiuDomOrm/kvrwJWblg9SH7zjglm2/2AZMJZ7E+XQJsISZDSPK8e6yA8JHqbD4BMvdm0U7GJiPKG1KIh6EFA0zS+5R7wEZUJzH7oWSDTaDf15+IH5umMjxCH0zjmEYnKNgymn3t80/MzNfZazxctSHyrnYtn9qrmh2o6pVZhgZ44yCVYEtp7H6a0Dw0MjH1jXCifMgMgiN/nT428yRwmtt8/Y6f7P1ZeCZWWkmKf1/z0ScWQAMFs4zrP/7YNmW30C4rl+7zPPk7dPmHxsxgSTJgC2JnnfTF2vpLMw/gMqm4B+937Qo1cMPN9hy/EPwfWGwkmUyILmJkBeYm4bg5hRRH88u/7/Glomai/N6HItkFFaCICPIS6OKc6PNzLfPYRhd07Rr+kgdAADmilcV6OcxvcRiB+XGY5xZtSkw89DqcIms3Yuvr942DPr4DSq6IvCJ4MC6Z7i1i2HZM6ZoQ1ScFv0/fwIAAGZvtDqYvY796LTtHKjtkEYhLCF1NU5isgBYvE/z0Jsoc6S47oK41U4Jt8sN978QXmBsijwS6WT8MDA0LMYAnZEYRhd89xMTKEyW30o9XzqVEhUHnmKcysvGRmOF7s+cnWtHEzTgeGe+WlLuf/HpE2KYYfPARxh7Qg9tHwF5jL90as4Cv4VjvBc7tOr7VTPFqv6ZtbudqvPK6fTmuSdbL60YgG+4j8H4moNp21DVqFwMkv+xIUAPBBvjTPWUbwNH9vCuTgbNfeTth9+eGOMWuXkl5EU5bt6CCIcnZmBkgCOq1omY0NPJnT64OteOvBoYmhKcuM8pnQID1MdEXS8UNM/9BvBnWYuGDQ1x9r+QIJ1o8FRAmkzB5HC9/T+3cNVMJQHDm79uH8K4HoEU0jKV8K/ZjSUMCQCie+Y49Ro4tArW+7XgdG98TcA5D+HCbzg9zWV56o2LnG+IM+K1f/mxJs3IxWlxUvi/O5Eeq093DtUMxnPfW/+/Euz7McoyTwD493mn95bpmZKZlElPIBCKKKGLoYllPRUR2ypiQdFTWU9XdHVFVMqq560FbKeIkgDSo0gahJLeZibTMjWZ3sv73A/3+TM+/hOZGYATANBWCmbwrjAv7XBqZtSFANGHBhXSU7hcX451jyCO+sPjf1oL75uKb2P2Vc995LX3KRHjKkSj/OJ8/pVwcGc6VaBv9KqJyXnUB3lWAe3wOxyLHa8UqhCyIqYOiiiZ9PzwCm5eaCuoQKyxV3Pe34xViVb5uTCgxCTN1vS0HxwyxpkVb+++L81HdtdDLhBJ99tjXK3G9dAT9+20NF5lCiDKj3IBtFoIQmNU4MF5tldbL4l1igCGT9nMO7S/fWxTIkV06ZYvW2bIsEtKNQCM1SOcI7xdoKUmWgBViDlsx1aRcqMrC3P/kc7kMcA5enZCrUlZul44goc8CqVQ8+MdExsp3b5dP4fggfGQq3JkQ0MFwr4C5HyN2fPqghZPx0CX6FlMZHOBcoskFOiacYz8QPdlIUKJ8J/8YOfbX82OYmCNrWD0f9ZwIXXC4NgY0ME/ZTf0UT8fojyggkML4huSKF6Xsy0Xsqu0tQDr7+mr/WUjQos8xwEUv3NB+6hnUbcqiNpCvlMATe3aZdVHIdRYQj30VHwyEEfC5q0UMgoVnw0bRLO2X6TkQjRhAqI0O3VWVlzUvaBh7zIF116W//bJQiFT1AkmsQ6Fc9QMPWsDa4+LVz5eHfAKaoi+8eu0WRMQR1scDfYtHJePbY5kpL+Nd8TW11/ttaE1+nldAzfYrtfe/niD5DFQVZwXI4jyo8DjUvPgFkS0TgwpWcbArKoaJlfunhqpTQW65K9keI+CF9t58xNn9LMrLUb0fTjnuJbLpbLh24cebN9EL+5k4x7+WOitaOppVGJF+bNBIKgTmV6+eU7TOer8jqZhhG+xLdrz5o3pFSz1b3UNmQT7csfaIgkvNlIMVAyA7IfmD3IIoSMkt2X/453pLOgPvX6FgxRfXhz1UaEPlcTf6wjdxx4KhuxKzapKKyW38d8PnyBpVq58cqwEAEMMeELIU/NxgClGzgv0aeQ6kW3Ub/cMx+mo4UfRe+Q29s7tTpKFkoxMijNcQIMw/iKi3n/ZSbu/o7kiGxO9JFtKenVT1XOeLUB6gG6xZRuDHMf1/nqVM1fU2TgrHL6F5qXPm/n22Vmj3zddh1otlSchU+AxAReAJEjaOOsbnAMOJOl2mhdPsmijHTvUyGk4+LqPatdFwsJv06cik7SG3Kz9fr6IRc2jpz4ruYB14OivsfD5gGMAoKQ6tABOjHCcQuo6/fdsR3IdLLtME9huYRx1+at2MXqheY9vSldwZ/OTSWJCSJRzhCc3I9anqtpCsW/iYSxWMTPXSO9+CsGQp5v0zMlZRwKvFPgnJoNxv5hCdFEVhiAsnnAHSVbpsMnGyNbc10oVYQwkFUhKX15aDnOD4nhxbs0eNGmij1e1nPgcwJKXiuxgDug4B97urQo+yS0DmDWxDWsnttPWVGjxjyMVNeliPgwB8JRKAC3kh7Gxc3jASzlsu2ef0X/hCtO6tLpYcjpqz4bda+AhZrBc9/OJc5q/V1AQZSN3s1UlUHVs6uE+QcNBkvGDWpm7NMOzNuy51ThVsnYXUvY38qN8ewoWjc9k515vRrRB7qzMQvaJxZlEXh71zD9Xv/f7JXYJZAoYKDdZhn/byrtrqPMVBEt+N/FCwFj6Dq3184rb1Dd8eX2+mLkvoaWE7ssJLtnrFxli13ds/mwHOh0elCw+m8lmMgxmlhdDbAJgWCGJ2ZqGaquH6pY9/THwnykTT1PCDcY710E859le8CC/3HhxrxGqXmgdRm/UwQN5I9wbwMIvXNeG422Lc+0KH8WR/fxYVt3lTQbcoOkSousxfeA9irEaGRSXe3kNXci5MUe79pQqEyqZ+912JAI1bMFicEA+RZyOFwp3w58ixOlf7fzcYIbSfZRtvtIVzZ+98Ay406EFuzrKQhefd/iobs2zxEdnDqJqffs32WYgIMaLAQBPCAAwzAOtg/DRJ4R3nf0fP+zmGvaRKxZCom5oGYNJC+TeE/Fy1yo2roUpSLN3E2Q+Xziqjkx5ps/V9M3hHvF2XfyPGMPsCN091n/SoOcgCoXcACGxz2PRlMYGqcxeormq8slN86bhBCYcHsPKo6/VKTNKVjPGVoCbcPY3VxjmXh6LQWSgsafO0G1HsJk6AzvxJ/fsYruhwKr9SQi8gxaG47ror6R54442W9I4IK+hEBDjA08DGqEDHODgabVOFJnliOf7VhdArp2+qVmBenmDQ0tbJLJ8zzMFeq56y8JKn49BCGh7iOERqnDl9Efj1bWxxzZitJMbf+WTASepkIjnUNc46+5qUyqKfEI6WSYoXxRds2SUQoLxanaD9EbvdXlsOsC8Ubu/fKpaZYh3T0oNVqgYncNdSPJdqoBhAIIBxLXI9EbLL6t0ZXvHCvszQFMlfgeNc5Sg0RzcNds6HPKR8VWcjue7awFDjCcQCkEDAMB3aCEc5gHvFs6W8oE7p+glZFWyPKZe7tu5Q+gvV738n+u9CVUg9bA6KQZahp4kdNAGjOvMl3p70d4atHOnHfB+npLIANe90imN3vzhOT0AyIsrK3md0NnZ1H+GcD40JxvIE5Rp3s8/h8Y5HJ/yOsdZh5UBqy8Zkpy5ejQCWRf2w9DtsSe2Qh4dxOvKKIBSbwG05SATIpisysiozyHJiA+NccrPcZqXlajGMkKAWDgMToAgOITg4AMMR8TcyhFoc44LDgbDyhB2f6BLOvnWq3C66uCnz+/8aEd2lhWQSjgxAZEZ1H+SoSfLh5cJnNPtmjW6la+knyOPf8fR2KFGAWrqwCauQcERF3Fqd+ykyEKwmjIPj5z8F6bEKDemF7UNq/JS9kIXGjMWzEJqZLLxu1AurgFN0lXeJHx8FmwUaD3Zb8EJaWAHhV1P+ffoF75J6gzPCVzXItrHP9YYfvPgyla3qCwcAwChUwkg1mods3yAWDDPv8IwbXA3P3PomKciUqpqZhHzNHEd7dKljg4Wy3L9ASEhoSQqpcuB6ieOlU+Yq62pdxbop7JcJ7tw7xc+2asFdeReB6Kyx7Tq/ua4HnoKiFZx2xMkVrlywXzymxhDJsK5zPd1ykEc1CRxvCmLSfzTf85XsLGj6uo8a1aC1xvYNaBD6CdikwUVmwVgyztD+e8zkaIZVklfv6QO0A6Qe6GniDgwtm6Iz4vxhKCkAkAY+HyIOQSaOZFVUNy+w3voGkczmwBT9wvoqjJnTwLhBWAwEj9z0m5mIoHblUQVbJy9sK5y5VfQE4GPF3Jio+QzrZ5twtvCwpWEbsjk6A+WMTbKri8Blvj3u6vL+Sa5RHqIKykvz7vUepHPgjkaCK6EQZTjM15BYfDd+CNNd7roYvORadcYBKRtz22wjuE+gT0qK12yjjHVOH/V7ZzrIJpvZDnS7f4RPO9yGyycqNEADwCokAcnxABgKHhVdeVHxkQNth4yV9pC9rmm8vaNrUWggWopAIORyIk4fdCU9nY5CUw9o+FzGww2dRzRnPyKbjeY4djG/LmJZU/pyllvLemNaZfEeANVx3b2zykw080JeP5e5rh6pIwElQcDx+iMc71yXyabBkTJcBKEP/ZOIycVlWcLt3W9aB0FGSXrfHdL64kHp3SQnQzkohlCwa/npb9FRaZ+2IVKzIe0xxrbU0r7bGNYGBbmPRoa5gLAcB509ax1E8ZzBEiv3DQYeN2t6mvhLChA719gcUAWaJIZ3ZTPKU5TsQL9IyWFa68Q7CoOROHLp1/z9OFH0HP7Px+zkNCWO1txGvOjGuzSZrblmshCurQ/PkUQhzlYWUG76Y9BkBvUpCPqkfqqYQI2TRoLTuZZDDjJm6IHVr4KFaUWQ37pnpYTHK0h6S69rIDG5W3Ps3rp0eCykQsf20se8Xxd57C0l0Vapvl2HSDAwiS2qgkYFuRDvHXU/E0IG7qKrIv/UFZNbGhACDK6AJKCJ7f7dEB34NkDrQXKJIeoL6CHN/dpSvlZzx0KVpDngaP/FXRn6To7wiSCtpujbIEDBxd2c6GY0DGXNCAYBHsOA4pmGBnvb+kcyUuB1ksvtyzNXauQni5GsnFc2tdEjHlZ9tEYARff+vhNjsuMH/omf/JZe47wKFpcie6jg2HhtofDX0NJXQGN9BxeR7XwUZgUzUoEkSJlYiIZgaBG5Sx/X7cej/CEyTxtcjnoMLuKlYtX2kuG1ndkgX6+R4u6fW8gNYdD+PlE3aCJ7ufayRL6JA9ls/94+6AO5UCaDUTJwpuXZ28sW/0g89giFbjIqc6Dp07iolrdgrp1SOpxaMsEHzM46FZ6QIRo6t4+PHYkEF4wDiYPZdxCCoJ9BU4ivsxMzP5hBudSfeljB4GyRTFzt7l/+Uw4ys8VhDsIB0ZwBZ6mWhEKx2gX6uKuqyzbYFIQDJaoWOdWgOTHr/0ZepzAy70MQOtZOZI9xvHLTu7mGy9K9cRsGZA1Ik4OrSxGP2yWB7oD+Kmaxx/xS0eRjEBmlgzSTJwvEq9WZqffgMWBVVFjSDoDcZN1+U9XvADiEXlGYziZd2yh/POdlngIN+RvUhAOUwRY44KsIJ/McmbtQ3iRBQ1XUvSRUMEpSKlksEvU0bKYGq/b9w3WLak8foxLtHPYM0+VswD4ffJIUmgrrMLCcII/K4wqRDumi38xT1jK++RIw5W2v1zsUqzxAVGCLuhnpoXJJ9fRBwjgGFcbvfByZwIdfQ51K9x9voo1UcGkZFqPSiaFEXGcCUfv3fdL7B5YVprgyjjS0plg/YC2eGxj6Vq/bEhGAoJAZSFaxd0JnK4IkfYWZcLyDIrO1saN4ExC6IabKqSNFgW4TYECzUWPrEjCrqpfSaJVhy9/xMUGyWN/kVq4NlvxN13VNFZglE2i2SVIu/ehUzIaMMO6+lYfTg9/XzArRCzddIW9ma5puiHSYs8c17bX6TpLplcyMcFVTmwqYWuclX3V6GeDDJOFer9EFB1iELSQ0qPwLHJXw3vZOwF+zr9B3AhRgJ1TK8jioA4J+Ol28I1AFhQEWYBiq954zB1DXdPKwSwDc7IhBp0aEqgs/syfqpAUjCckQTbQJF69u4H9Ie34vNwl7uIFH+TwQMtauWNHlOYBeJyNIUsl3dO80psBy24xZWpwLcspXVOSoB+B6V6ulNRATqVgVWXhnVdNRjA7d+8BSLJbPhoBqo6h39iRZGtJD4FqC9QCeChBn5vDIHzK0jwU9q++h3Jl9+oi7f3XPgnqU5AHmiOQnKEnSXCV6HSP7zv15+Wg26tUm2OGNrqew7wupMkYEoGWLcQZfBuLXSDsnOACOHQQZGzQKLxNGK6bGxB2TpJh+V8Z/f2rDZADqcBTeuhxNQa+gCSVPHktw04pY/bqGjyX2ZU1hp65/f/byxWRHMjp5dCUYcPhCrB2OysBtCQTFrcOD6/yrqvp4EizAW+YwHpGis8NyilsJjMXZSXMxXBznyewZIi3cP12o/H52H9J08JoEvsKxSIueJI3HtzCE5Hj16bd7n0nR+0dhVx1gPphhXLe8up6WhmHzQqPY5cgJeMhOPT00xIMSTtofHaF4lSzNak6ZEhBWVxbH/zgcSf+KoZ3p9h/8By5mAihhrk//S511/10C47x189ZcxP2zM8JuaJYhHtVL2xmK7s1JmNpwFDY3b9HXzDo4Ouvm++re3pEDtmYNpEtQvXjmGZP1n9hPdJnFUNE/2uW/XiJQn5dpfyzfHTZL5dE9KpOBtU4orMW7bmEFvY2NfRSfOGiPFLObkjt/3wSijP37XzaOIVP5QelZ0smE1iddSbfbMZowTG3vhLbQYdsOuTQ2ZZOnZvuXt6/58LBiH7EytuXr6lAL7JmoKjPMJqibphxdjo8TEH7CazrQtvv0B86lguCKFbjhAWzdfpauwaNApDo3SPkQ98MTD13ABM7rCfvioOdV8AIJVAb1AojodOfbrjykPjufFITPpn9212FQVLl1uR9VHTGR4R6P2XTu3w/fOqrYMjs5RXXZ8KAQQhc6/JpaRVUMQwg9WEYtancsbGR6drxJt/Q3+eJJrPUjiUCWG6FERMygpnAw2vfVLmXxTvGEH35HTp8nHZlhu3uT9INozSlHNvUbd5AOHKH/b8fLxhPZB3tQnGXNCSTZavpL2XOiJImo9VoHpE1/yItHW2xHlCcvfGXH2cWw9KFWVmGg5LEdhORBvv3Ck+4grQYa2/o7vobnMYJAmp6OKHIEDcVlPwr7Jx56aWEmssVZRdJrBmHHQOEw3H5EE1yOTty83jbF7caDmK9W8er3KS9UR7lvFw4GWK5rTp3yXIAAxo3AsCDY5lL/Ef3aAkI+vX54zIqA7oi7miIXnHdtFQuTKiTGkhwTOjnO6dHL0jqqX2jZ0TqGhnIHTynV0YybScMFkdPwEL1J75/DZW8v2k7443XAFLm843porCGegFYed7fstnRf0bn/nfctyUlAkGSsohEwyvGpTBd3/BYp4AVM10sOr3mBla5p4rAECv5/1guHZtMhK9c5T0G8DIJtyt6R1Tu/ERihrzF8a8TkLTo7DqiS2ZAYDrWYBjfAzhGf+lDTHLMdxu1Gb+uZ4YdxZV9MmvB4587Hi+jrLvEGi3jzUty3XccvfZr5WQtDZxyeapCR3oUMwsAjo3Q1gS3HDZYN7wDiyqs+xJf7hgN1R8slZ9/+/IhAouBqmmsr6WVduaf8OPDeRQEeVvvnN4x/8B8D39B84WMbcXdOXmK1bmyqJcs+jJEV/jBClbrTI+D7+YTc2Q5WiZXfjueNLJpunVbU7o5JMMC0ouigSmWbhECy1R7480TFZokhzr/abO8auuTJyA/lwIDkcwV8YniIMjnc13xMplJIws19Z2hguu0+NFrMbZ62O+Ul6rKGdU4Y5daE7820OgBPvz2sfHC4d+P7PnggF+7mQZYN3RvZnnRE0jeQ+Oe39qq2QtunSzpDpcFaIsTuXvw+IBHEM/2/yXF5HFX5SyDs5rMXLgmircwXWMKF5JemzuDIWZKspPc4KKslm5iasq6Z9jshZrfD20frsHGoseGjEN1y0yBujMqOZ4Cnb0EA2A0sm7nvoN6MD0hvwzC3DOfZ2ICu3gewqXn77x3mpLJUmNfD2exgD4vkIwrZOxGFhUx2SAvSfpGqZwEPW7fjm2ndMhU2qUkbRHli6+Y2xK25nZU94u4LvbYR7JUIXRiaz5kJRYlFnrlIrDFXDRXDi4lfwzVKtOzOeYfIASU3DjB6wE6p76b7ZTMagHU3fX9JWWURoJZnpbNyhJsaSl5smq4ZsR2nhxATdJ2h1nlgdJjSikoAwVHsgLZolfffPmplnW95Z0Jxg7hyYEKb2w+OMCEhEaVskBtzvOWOiRcDCEmp95fD00pvV/mU+Uo9iwdstka/ZTBag8R1EpM2BnKIXbqyQodCHqJ3ap8L3o3s/eQV7TZNRRuVnmimOPPQZymyUdzcGs1X69UTtmH/xCJkjxuM3PMwQBI/pGcXpZaGteopzWOev7ZsT8y4wMoWpdjy1Q5exWyHmx9A+i1FanE1v30Qe+4pR6Q3aNHmgoohY1SZfzrOb0zsQRXPTmWFXgFuqCq6qFeBwAjSqmtZNQZb9VCXCSXeaU2ZWso6ZehgnTGnv17MpQTTV998OQw1BNZQEZYZGtPty2uwfaeI8SH/emSdMOxXU++nvR66IyBGXumM0KaI5RsUMDiFMK8TXWJwyEnRQDxwfOXqswPzEIcZVPi4K+bqfcBVbIYQv06fvzLMVswg+fIMTj/xzhkX1ZUFx0YgCoVkyIWKAV+SKKFTgsqGwez3rqzXNrlylXkRB4eGveAxC9sRdXxNXU7fD1Z8A4pq6nBII6aT596WPPXu0fJIpm3XX05uptzeI1nsjGB91HfhRHH6kFYdPFgMnr8t4ZI24VmDQFrVQQ/3PsE7xOkrkxG0ogCh10Fxc2Ctt5+2pNgkorqAsQBGiqHwDn6F8GwqRjx2REJxVyxICAl2TglEkX7w7NMu+Pscf9NxDn4tjVvtL14bYppSn0f7vMk6LNUkU0P3uHSBy6aWr4YGX0Vuqsl/GmfN9cQLVZgUynO7KFs1O0gu/t/vYbtLnBNxskZ5aPvbjPO7Wi1LzwlfWYU4L1bjLFt9Bl+GFP30kC+y8UZl91x/n7ANAcs++ch4lc3RLcs/va79OfgtVIQCQoa1TDrXVrreqwd23OyJ/zXQzikgPHfjrhIupJQx5F42pn75vjNVtankQG3y2TS8UV2YXSkZ8ZeUg8H9iYPULW0D9nq+Hh0oTcmTeJEoUK39EvDWnxG89Unj0LrWw3W82OOnD0MKS/Vg2zUFYwv1m9dd3AB3Xbhp7+O9DZ2Tjsmm+Lvm24m7Bdbbmwjf9tfQafnLi+e8Ta4CiI548WQBV4sGX0l26+DYztfQNKxLBBgd8OR2ySvWxdOxDR6KKlDsF5aT3mg5S3aOgheXe350Hw1dFtKJRYbMklNzVAEQZI5euxUfmaIIIrVPsIc0sZDwAVu3NN/EEbWvpB/BqzfsYxBFlepVK7InfLqZCe/3MotMlgJtKASF5lliaSYJ6i6L7PMH+5EQvodUwbrgeqvzPSogkfmOmaeoa5ZWhtf/wUDqS52JoU32ygYgKWEPbMT6XRuPln6ag251k6FujtlWuKL5/92/LF7gEplCJglNV8ENpuBjaZzfLnbVkwfBHH675kACr9REk5TgyCCyoJb11L4au/wQLAo/DJjyKMeUzMKu/ZKwCcPmVoTQ/qrCz0zNKsn13YEQ75tUggyuCacitdGvy9Rn3QMQKK16ZTPawKpD1hOdhBiZLtvyRxh2FtZNNYCiHX0vgFDMGGkpc0DOyFdan5/05qA7KuBpDBhLBkROWl0v8YahjyVOoVHWxLnL+6GPW/sSTLusPwyXU7fAfB/dIMwUySuw1EAAAAASUVORK5CYII=";var Vd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD////S+rGz0v7X0dKrpqfTzc/17fHKxsikm6Kfmp6XkpbX0tbj3eLs5evn4ObDvMPb1dualprf2t/++v769fuSjJSvrbSdnaOamp+Skpelparl5evh4ef19fra2t/6+v7V1tuVlprR0ta70/23zfe20v6yx+i5xtvn7PS20vqyy++60fSy0v6y0fqtw+HI3vu21v65z+q9xtGu1P6y1v631vqvwdax1vq01PW82PTCz9zM1+Gw2v7J3OytucGOkZPY4uiWmpvu8vPa3t+Rlpb5/v71+vrR0tKZn56mrKvV29rR19bl6+rh5+bL1dOeo6LGzcu4wb2ttK/L8dPD78uVmpZrynrh5+J8xIW63b7C4cbL6s6SxpbC7sWRl5Gan5rN0831+/Xa39rS1tLMzcy0tbSen56Njo2mz6OKx4K0zLDFy8SlraPe4t3W2tWRvoSXrpDA1Lq1vLPN+7vm6+TS3s3Z6NL6/vigvpCrv6DO/bLS/rbU/LvO4MLi9Nbu9OqDhoHQ/q7N+q3S/rLS+rbU9LzS+rLW/rbc+sTR/qrS+q7W/rLW6cXR/abW+bbT7LvS+qrW/q7W+rLa/rbc/busravW/qrW+q7a/rLa+rbT8LPW+qrQ8qbL66HU9Kva+rLf/rbO56/C4Zja+67e/rLa9bPJ4qbb8rvm/Mjf+bfb9a3f+bLb+KO604vU7KXE1aTM45uPk4fo/Lfn7NzF15Hb7Ka8xKP2+ezX3b3i493O0rPr7OW+xoTS1MSsraXDxLz9/vOlppf4+N/c3M3b29LMzMS8vLW0tK2fn5mbm5WWlpHm5uHe3tnb29b+/vrW1tK/v736+vns7OukpKOSkpG3tXXU0824tKLx7d2rqaC3rpPn49fz8evHwbK9uK2bkYPk2czUyLrb0cbb1Mzk3dXMxb6zrqnItaPSwbHTzMbgzb7r5eKalpTb1tTm4d/++vmgmpn79fTf2tr+/v709PTm5ubi4uLe3t7a2trW1tbExMS6urqampqWlpb///+maPEqAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAfmBJREFUeJx0fXd8FGX+//uZmZ3ZMlvSE9J7slEQlFPvzn7qqQjYKxZsJAFiJcYoRjDGgC1AAjYsnIoNBPGsX9vZUZCSTUIKIYX0bJvdKTszz++PAHqnv88/MPvKzD7v/Xw+z6c/Q17y6IqDjFQ8QIvs4YE61KMWK5bjCDVVAcCK5TUNANAIZ0J4QhWv4PSMXdHCTYoYi4sju+qP/jVW2lSbI3EcI8uBRqAa9RAVtQytcrKhj8Yjb7BtKTFLDabSYBc/9EbO5wUlbdy0rpvsZvyq+Z+f25DSf5EiXWG5L4XG7FG+SzhpwIHEf/QeiHWcEqQgFRtlC5wIw2y768PyljbBRRTHAfPf0UvfaySPcjSVOu2q//CJ6vBY3YrlNbapVQAAqusB1GLF8kZnP0QOOfzkxPDwmvAjL2X+sMGtiMRBmHDVURyN0GnStJjPePjIB/WobSEWCIcDDY3VK0HdxtCq83Na9hWR9EsMR7/5iXNiDv2KucgAO7R/fE+iMnpt8ebeEjqnMQ6H7QojRv6+e26Oq248MXGGPXBV3BPuT4tSSbjtedu/Ip8FS2huL6selD+ZFJkIs/yB2olox64ATswpnhb3GNeU6kZNjVxdXV1dXR2oAVALLIcTgLVa5QwTcXcH2ZcQaP+bjqCeSMJVxzhihWGHHkoix1iEmpjmsUhOAE3MQ3YOpyV8s46eBwzaF7NMol2NJqdgthsM2UXhYDlR/rX927yl/IV93UWn0Iwm+eaZatu7cslJo28Uj1WcIy1YdxtB0sMN13a68o4z0KEoh/BFLHwQLYQB8IiCVKcjHkqU56LDQauYMCxBAkRM4UATLLFhO8MhhxuIWG9QfOcmBD7ZS6OJFk9wglYfW3Zj9VPZ8qgceew3jjRZUgLjqK6vbZStnD1Sll5kMsQEEOOWGM6b0AI6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";var Hd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAADAFBMVEUAAAD////c8v/Nzc3I8KD85uesm5z98fKyoKKdk5S7p6q2oqarlZykjZXj19utnKKzpaqynqaYh49QTk+klJ22rrTMxczr5Ov++v6clZ3Y0tnOys/SzdV8e3339PtlZGf6+P6PjZTR0dmEhIbf3+G8vL2mpqecnJ1qbIJ3eZGQkqmFhpWkpriChqO1uNCsr8Ocnq7IydCTlZ2Snb3Cyd2tr7Xg5O21t7vFx8vW2Nzm6/SbrMfK1unv9PzW3urY4u+mweHc5/OwzuxpuO6JyfXO0dPm6evD5/3Z8P3e8v6q3/vn9/71+vzf9v7a9v76/v7S1tbKzs7x8vLQ3dLN+86a4ZuV2JWj5qOh2aG05LTK8sre997s+uz0/PT6/vqNtIzH8sWcvprG58TX7NXJ0cjj7+HH28LB0bnP2cq0v63G8qLK9qHO+qWy0pOQon+HlnmxwqHV4snF8ZnQ/qK85ZLS/qax1Y3K8qLO9abD6J3I7qK94Zm32JbT9q/L7Kirx46wzZOkvYrF4qiasITY9bvQ67S/1ajM37l/inTS+qLW/qbO9qLS+qbW/qrV6b+NlITb/qvKy8OpqZ3k5Nfb29X+/vj+9gL79kb9+H/9/O7q1AXOvBS3qCOqoDqUizmgmVbk24l2ck6enZO9vLT59dyysKPPzsn+9cx1dHDX1tKoo5H867z95anDuqPd1sXy2qXu1qLcxpbu16bn0qPz4LXm1rPm2r7az7aclYbt48zt6eD43aTozpvRuo6KfmWgk3rYx6aOhXPy1Jy+pnvJsYarmXmyooXCsZPNxba8qYmzp5Tpx5PfvIyomYeaiHTt0L+um5KmiX3r08m0rqy1kIm2p6WrpKO7tLOVjIuwp6aGeXi+rKvayciahIOjjo20nJyslZW7pKS2oqKkk5OcjIyPgICUhobv29vi0NClnJzNxMTBubnX0NDEvr7OysqjoqL+/v76+vr29vbs7Ozk5OTc3NzW1tbS0tLOzs7KysrExMS0tLSsrKyUlJSMjIz////e5Z6pAAABAHRSTlP///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////8AU/cHJQAAAAlwSFlzAAAOxAAADsQBlSsOGwAAboBJREFUeJyFfXd8FVX6/nPOtNtLctNoCSk3hJBQxC4iWBFRWSvqCrYlrq5uvOtXY8G+sew1q65r2F0VK/aGLiv2hqJ0SEJuEggtpN86t0w55/dHQgmgv/PJH8lk5sw8877vOW8fcssoPZl4rpYCqscRjzbit8btzNH/7C2+m095tmd+0ban+56u8VninrpDT6l1DDB78JADgeAdjwEIiFLkmMsmtjKTV2HSisSU9ogBV0yeuoXbkTSU6AlL7I9/OcBNMdt+XD+0VWMY99LMhK+4afv9ZxEAntLNyajoR6g0pVNuiQCexJTtiStfPsZ40mZQFk8L9OGM6FNLla6o/TdxgKnMU0s76Tcb+fL891KAVdC1ETgCDUq29VAc8N0n1gAIGnba+uC8ignSrK1NbwCr+2XpWHYuWXOZHbCBnEgfUAfTAInY8en2bXK+XZS75YkrTE5ofoQQwqNwFEz0twChUrOyEoTwiMb0qtWysVrPFIv2KOy2VE46LYThyqj1/SOe4rDhE5W9svX+affhts6n1wsSaJrREWeoN+6z5R56oCbi7AUABIHFtqT324qmzvG6ap/XRH9qMVbNfOF1J5Co+uVB1N3f0mGlQAY8yteScxyvRDa4EhInrldWhTi8KtQugfhDZnkPyfqMc3jTpbJ5UncVROdJs8UggMU25EZ9UtEPLkfEFwB+FUuvY9+4ffYSG2c5Rdbswb/XWsSekUQsHBT0ESSyxhP8wClZr0akzXGzYrMdKxJcQBqRUgIkbRH0m3JzZiprE6UeyrXMOOMt4sD8y6pLQ0akX3LnAZO3hmxMCAECI4OMgKDS0pJ+xlpx69rGe1aLALAUQM34nV02Mliw2w5WmzviWQ6OlOJkdK1iXH5pLKe27emAb49vJB8FBm1J38hLiMs9PNsto6XdFzHZXrwF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";var Fn=class extends re{constructor(t){let e=t||{};super({element:document.createElement("div"),target:e.target}),this.visible=typeof e.visible>"u"?!0:e.visible;let i=e.className!==void 0?e.className:"ol-layer-switcher ol-unselectable ol-control",n=e.label!==void 0?e.label:"Skift kort";this.labelNode_=typeof n=="string"?document.createTextNode(n):n,this.button_=document.createElement("button");let o=e.tipLabel?e.tipLabel:"Skift kort";this.button_.setAttribute("type","button"),this.button_.id="layer-switcher-button",this.button_.title=o,this.button_.appendChild(this.labelNode_);let a=this;this.button_.onclick=function(u){u.preventDefault(),a.toggleShow()},this.panel1_=document.createElement("div"),this.panel1_.className="container1",this.panel2_=document.createElement("div"),this.panel2_.className="container2",this.panel1_.appendChild(this.panel2_);let l=this.element;l.className=i,this.visible&&(l.appendChild(this.button_),l.appendChild(this.panel1_))}setMap(t){super.setMap(t),t&&this.renderBackgrounds()}renderBackgrounds(){let t=null;if(!this.getMap())return;let e=this.getMap().getLayers().getArray();for(let n=0,o;n=0;--l){let u=this.geometryFunction(t[l]);u?eo(i,u.getCoordinates()):t.splice(l,1)}io(i,1/t.length);let n=Le(e),o=this.interpolationRatio,a=new Li([i[0]*(1-o)+n[0]*o,i[1]*(1-o)+n[1]*o]);return this.createCustomCluster_?this.createCustomCluster_(a,t):new Ss({geometry:a,features:t})}},Zd=Cl;var Jd="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAjCAMAAACjKNoqAAAACXBIWXMAAAAcAAAAHAAPAbmPAAAA0lBMVEUAAADmSzHqQzXePzEAAAAAAADqRzzePzEAAADePzHqQzXePzHePzHqQzXePzHmQzUAAADePzHqRzzaQy3ePzXqQznqPz/qRzwAAADqRznqQznvRznaPzHqQzXqQzXqQzXePzHeQzHqRzzePzHaQzHePzHWPDHaPzHqSzzePzXePzHmQzXKOS3ePzHqQzXqQzXaPzXePzHmQzW+OSnePzXePzHmQzXqQzXqSzzqSz/qTz/GKSGyHRnqT0OXCQnaOS3SNSnqU0O+JR3GLSXOMSW2IRnQDRqUAAAANnRSTlMACdaUGAmXsgg1ZMbqgO/vEM7WHVNDDuISR0tHT0NLvlMd3r4lLbDGoIBcxpew3nA5P758bGAX/DEaAAABEElEQVR42u39B3bEIAxEAQgb8PYt6enp6ekCvH3L/a8UEO4+w+Aivmf8nsQFgMRO5Ejr68fjfci0N5oup3FsHwfnCWJdszSKZKZGMoJdE6tMsZGOnekCs2bdsuGgxKz3ncGR0lTP1+M5FVp9gPTfxzOrla8vIPC+GWlBmwCQ3msPJ7TBBI7LcFiMb5J46H++cmzr6wiaPq8Wk4n3KbwEuFEVDW2bqTUV7rrmwxLFiKa00ynCzpUf6GnBik/p5N8yiu3sOG57Kezd5Yf0m1gxzBkw36wKWAHCJ1nxD0qKHGyXGfWFzxXoRhhUGbSUCmuwifhVg41+v1GH3y812BjcPxxWqeA/r1zUnJwP6nkhMvYPs65RdNkbMm4AAAAASUVORK5CYII=";function Bg(s){let t={};return e=>{let i=e.get("features")?.length;if(i===1)return new Je({image:new ki({anchor:[.5,1],anchorXUnits:"fraction",anchorYUnits:"fraction",src:s})});let n=t[i];return n||(n=new Je({image:new Pn({radius:10,stroke:new On({color:"#fff"}),fill:new di({color:"#C84A38"})}),text:new gr({text:i.toString(),fill:new di({color:"#fff"})})}),t[i]=n),n}}async function Wg(s){let t="https://dawa.aws.dk/adresser?format=json&struktur=mini&q=",e=new Ss;for(let i in s)e.set(i,s[i]);if(s.lon&&s.lat)e.set("geometry",new Li(Mn([s.lon,s.lat],"EPSG:25832")));else if(s.address){let n=await(await fetch(`${t}${s.address}`)).json();e.set("geometry",new Li(Mn([n[0].x,n[0].y],"EPSG:25832")))}return e}async function jg(s,t){let e={default:[]};Object.keys(t).forEach(i=>{e[i]=[]});for(let i of s){let n=await Wg(i);e[i.type]?e[i.type].push(n):e.default.push(n)}return e}function Xg(s,t){let e=Bg(t),i=new Es({features:s}),n=new Zd({source:i});return new Cs({source:n,style:e})}async function $d(s,t){let e=await jg(s,t),i=[];for(let[n,o]of Object.entries(e)){let a=t[n]?t[n]:Jd;i.push(Xg(o,a))}return i}var Cr={PRELOAD:"preload",USE_INTERIM_TILES_ON_ERROR:"useInterimTilesOnError"};var Sl=class extends Tn{constructor(t){t=t||{};let e=Object.assign({},t);delete e.preload,delete e.useInterimTilesOnError,super(e),this.on,this.once,this.un,this.setPreload(t.preload!==void 0?t.preload:0),this.setUseInterimTilesOnError(t.useInterimTilesOnError!==void 0?t.useInterimTilesOnError:!0)}getPreload(){return this.get(Cr.PRELOAD)}setPreload(t){this.set(Cr.PRELOAD,t)}getUseInterimTilesOnError(){return this.get(Cr.USE_INTERIM_TILES_ON_ERROR)}setUseInterimTilesOnError(t){this.set(Cr.USE_INTERIM_TILES_ON_ERROR,t)}getData(t){return super.getData(t)}},Qd=Sl;var Tl=class extends qi{constructor(t,e,i){super(),i=i||{},this.tileCoord=t,this.state=e,this.interimTile=null,this.key="",this.transition_=i.transition===void 0?250:i.transition,this.transitionStarts_={},this.interpolate=!!i.interpolate}changed(){this.dispatchEvent(q.CHANGE)}release(){this.state===Q.ERROR&&this.setState(Q.EMPTY)}getKey(){return this.key+"/"+this.tileCoord}getInterimTile(){if(!this.interimTile)return this;let t=this.interimTile;do{if(t.getState()==Q.LOADED)return this.transition_=0,t;t=t.interimTile}while(t);return this}refreshInterimChain(){if(!this.interimTile)return;let t=this.interimTile,e=this;do{if(t.getState()==Q.LOADED){t.interimTile=null;break}else t.getState()==Q.LOADING?e=t:t.getState()==Q.IDLE?e.interimTile=t.interimTile:e=t;t=e.interimTile}while(t)}getTileCoord(){return this.tileCoord}getState(){return this.state}setState(t){if(this.state!==Q.ERROR&&this.state>t)throw new Error("Tile load sequence violation");this.state=t,this.changed()}load(){ft()}getAlpha(t,e){if(!this.transition_)return 1;let i=this.transitionStarts_[t];if(!i)i=e,this.transitionStarts_[t]=i;else if(i===-1)return 1;let n=e-i+1e3/60;return n>=this.transition_?1:La(n/this.transition_)}inTransition(t){return this.transition_?this.transitionStarts_[t]!==-1:!1}endTransition(t){this.transition_&&(this.transitionStarts_[t]=-1)}},Go=Tl;var Rl=class extends Go{constructor(t,e,i,n,o,a){super(t,e,a),this.crossOrigin_=n,this.src_=i,this.key=i,this.image_=new Image,n!==null&&(this.image_.crossOrigin=n),this.unlisten_=null,this.tileLoadFunction_=o}getImage(){return this.image_}setImage(t){this.image_=t,this.state=Q.LOADED,this.unlistenImage_(),this.changed()}handleImageError_(){this.state=Q.ERROR,this.unlistenImage_(),this.image_=Yg(),this.changed()}handleImageLoad_(){let t=this.image_;t.naturalWidth&&t.naturalHeight?this.state=Q.LOADED:this.state=Q.EMPTY,this.unlistenImage_(),this.changed()}load(){this.state==Q.ERROR&&(this.state=Q.IDLE,this.image_=new Image,this.crossOrigin_!==null&&(this.image_.crossOrigin=this.crossOrigin_)),this.state==Q.IDLE&&(this.state=Q.LOADING,this.changed(),this.tileLoadFunction_(this,this.src_),this.unlisten_=Oo(this.image_,this.handleImageLoad_.bind(this),this.handleImageError_.bind(this)))}unlistenImage_(){this.unlisten_&&(this.unlisten_(),this.unlisten_=null)}};function Yg(){let s=Lt(1,1);return s.fillStyle="rgba(0,0,0,0)",s.fillRect(0,0,1,1),s.canvas}var zo=Rl;var Kg=10,tf=.25,Il=class{constructor(t,e,i,n,o,a){this.sourceProj_=t,this.targetProj_=e;let l={},u=vn(this.targetProj_,this.sourceProj_);this.transformInv_=function(I){let L=I[0]+"/"+I[1];return l[L]||(l[L]=u(I)),l[L]},this.maxSourceExtent_=n,this.errorThresholdSquared_=o*o,this.triangles_=[],this.wrapsXInSource_=!1,this.canWrapXInSource_=this.sourceProj_.canWrapX()&&!!n&&!!this.sourceProj_.getExtent()&>(n)>=gt(this.sourceProj_.getExtent()),this.sourceWorldWidth_=this.sourceProj_.getExtent()?gt(this.sourceProj_.getExtent()):null,this.targetWorldWidth_=this.targetProj_.getExtent()?gt(this.targetProj_.getExtent()):null;let d=Ae(i),m=es(i),x=ts(i),E=Qn(i),C=this.transformInv_(d),T=this.transformInv_(m),w=this.transformInv_(x),M=this.transformInv_(E),v=Kg+(a?Math.max(0,Math.ceil(Math.log2(Ws(i)/(a*a*256*256)))):0);if(this.addQuad_(d,m,x,E,C,T,w,M,v),this.wrapsXInSource_){let I=1/0;this.triangles_.forEach(function(L,b,P){I=Math.min(I,L.source[0][0],L.source[1][0],L.source[2][0])}),this.triangles_.forEach(L=>{if(Math.max(L.source[0][0],L.source[1][0],L.source[2][0])-I>this.sourceWorldWidth_/2){let b=[[L.source[0][0],L.source[0][1]],[L.source[1][0],L.source[1][1]],[L.source[2][0],L.source[2][1]]];b[0][0]-I>this.sourceWorldWidth_/2&&(b[0][0]-=this.sourceWorldWidth_),b[1][0]-I>this.sourceWorldWidth_/2&&(b[1][0]-=this.sourceWorldWidth_),b[2][0]-I>this.sourceWorldWidth_/2&&(b[2][0]-=this.sourceWorldWidth_);let P=Math.min(b[0][0],b[1][0],b[2][0]);Math.max(b[0][0],b[1][0],b[2][0])-P.5&&x<1,T=!1;if(d>0){if(this.targetProj_.isGlobal()&&this.targetWorldWidth_){let M=Bs([t,e,i,n]);T=gt(M)/this.targetWorldWidth_>tf||T}!C&&this.sourceProj_.isGlobal()&&x&&(T=x>tf||T)}if(!T&&this.maxSourceExtent_&&isFinite(m[0])&&isFinite(m[1])&&isFinite(m[2])&&isFinite(m[3])&&!Ft(m,this.maxSourceExtent_))return;let w=0;if(!T&&(!isFinite(o[0])||!isFinite(o[1])||!isFinite(a[0])||!isFinite(a[1])||!isFinite(l[0])||!isFinite(l[1])||!isFinite(u[0])||!isFinite(u[1]))){if(d>0)T=!0;else if(w=(!isFinite(o[0])||!isFinite(o[1])?8:0)+(!isFinite(a[0])||!isFinite(a[1])?4:0)+(!isFinite(l[0])||!isFinite(l[1])?2:0)+(!isFinite(u[0])||!isFinite(u[1])?1:0),w!=1&&w!=2&&w!=4&&w!=8)return}if(d>0){if(!T){let M=[(t[0]+i[0])/2,(t[1]+i[1])/2],v=this.transformInv_(M),I;C?I=(Pe(o[0],E)+Pe(l[0],E))/2-Pe(v[0],E):I=(o[0]+l[0])/2-v[0];let L=(o[1]+l[1])/2-v[1];T=I*I+L*L>this.errorThresholdSquared_}if(T){if(Math.abs(t[0]-i[0])<=Math.abs(t[1]-i[1])){let M=[(e[0]+i[0])/2,(e[1]+i[1])/2],v=this.transformInv_(M),I=[(n[0]+t[0])/2,(n[1]+t[1])/2],L=this.transformInv_(I);this.addQuad_(t,e,M,I,o,a,v,L,d-1),this.addQuad_(I,M,i,n,L,v,l,u,d-1)}else{let M=[(t[0]+e[0])/2,(t[1]+e[1])/2],v=this.transformInv_(M),I=[(i[0]+n[0])/2,(i[1]+n[1])/2],L=this.transformInv_(I);this.addQuad_(t,M,I,n,o,v,L,u,d-1),this.addQuad_(M,e,i,I,v,a,l,L,d-1)}return}}if(C){if(!this.canWrapXInSource_)return;this.wrapsXInSource_=!0}(w&11)==0&&this.addTriangle_(t,i,n,o,l,u),(w&14)==0&&this.addTriangle_(t,i,e,o,l,a),w&&((w&13)==0&&this.addTriangle_(e,n,t,a,u,o),(w&7)==0&&this.addTriangle_(e,n,i,a,u,l))}calculateSourceExtent(){let t=wt();return this.triangles_.forEach(function(e,i,n){let o=e.source;_n(t,o[0]),_n(t,o[1]),_n(t,o[2])}),t}getTriangles(){return this.triangles_}},ef=Il;var wl,kn=[];function nf(s,t,e,i,n){s.beginPath(),s.moveTo(0,0),s.lineTo(t,e),s.lineTo(i,n),s.closePath(),s.save(),s.clip(),s.fillRect(0,0,Math.max(t,i)+1,Math.max(e,n)),s.restore()}function bl(s,t){return Math.abs(s[t*4]-210)>2||Math.abs(s[t*4+3]-.75*255)>2}function qg(){if(wl===void 0){let s=Lt(6,6,kn);s.globalCompositeOperation="lighter",s.fillStyle="rgba(210, 0, 0, 0.75)",nf(s,4,5,4,0),nf(s,4,5,0,5);let t=s.getImageData(0,0,3,3).data;wl=bl(t,0)||bl(t,4)||bl(t,8),Rn(s),kn.push(s.canvas)}return wl}function Uo(s,t,e,i){let n=Cn(e,t,s),o=hs(t,i,e),a=t.getMetersPerUnit();a!==void 0&&(o*=a);let l=s.getMetersPerUnit();l!==void 0&&(o/=l);let u=s.getExtent();if(!u||Hi(u,n)){let d=hs(s,o,n)/o;isFinite(d)&&d>0&&(o/=d)}return o}function sf(s,t,e,i){let n=Le(e),o=Uo(s,t,n,i);return(!isFinite(o)||o<=0)&&Vr(e,function(a){return o=Uo(s,t,a,i),isFinite(o)&&o>0}),o}function rf(s,t,e,i,n,o,a,l,u,d,m,x){let E=Lt(Math.round(e*s),Math.round(e*t),kn);if(x||(E.imageSmoothingEnabled=!1),u.length===0)return E.canvas;E.scale(e,e);function C(b){return Math.round(b*e)/e}E.globalCompositeOperation="lighter";let T=wt();u.forEach(function(b,P,F){qr(T,b.extent)});let w=gt(T),M=se(T),v=Lt(Math.round(e*w/i),Math.round(e*M/i),kn);x||(v.imageSmoothingEnabled=!1);let I=e/i;u.forEach(function(b,P,F){let N=b.extent[0]-T[0],G=-(b.extent[3]-T[3]),W=gt(b.extent),Y=se(b.extent);b.image.width>0&&b.image.height>0&&v.drawImage(b.image,d,d,b.image.width-2*d,b.image.height-2*d,N*I,G*I,W*I,Y*I)});let L=Ae(a);return l.getTriangles().forEach(function(b,P,F){let N=b.source,G=b.target,W=N[0][0],Y=N[0][1],Z=N[1][0],it=N[1][1],rt=N[2][0],Ct=N[2][1],tt=C((G[0][0]-L[0])/o),V=C(-(G[0][1]-L[1])/o),K=C((G[1][0]-L[0])/o),H=C(-(G[1][1]-L[1])/o),dt=C((G[2][0]-L[0])/o),lt=C(-(G[2][1]-L[1])/o),At=W,U=Y;W=0,Y=0,Z-=At,it-=U,rt-=At,Ct-=U;let ae=[[Z,it,0,0,K-tt],[rt,Ct,0,0,dt-tt],[0,0,Z,it,H-V],[0,0,rt,Ct,lt-V]],_t=wc(ae);if(!!_t){if(E.save(),E.beginPath(),qg()||!x){E.moveTo(K,H);let Mt=4,ti=tt-K,he=V-H;for(let Dt=0;Dt{e&&e.getState()==Q.LOADED&&t.push({extent:this.sourceTileGrid_.getTileCoordExtent(e.tileCoord),image:e.getImage()})}),this.sourceTiles_.length=0,t.length===0)this.state=Q.ERROR;else{let e=this.wrappedTileCoord_[0],i=this.targetTileGrid_.getTileSize(e),n=typeof i=="number"?i:i[0],o=typeof i=="number"?i:i[1],a=this.targetTileGrid_.getResolution(e),l=this.sourceTileGrid_.getResolution(this.sourceZ_),u=this.targetTileGrid_.getTileCoordExtent(this.wrappedTileCoord_);this.canvas_=rf(n,o,this.pixelRatio_,l,this.sourceTileGrid_.getExtent(),a,u,this.triangulation_,t,this.gutter_,this.renderEdges_,this.interpolate),this.state=Q.LOADED}this.changed()}load(){if(this.state==Q.IDLE){this.state=Q.LOADING,this.changed();let t=0;this.sourcesListenerKeys_=[],this.sourceTiles_.forEach(e=>{let i=e.getState();if(i==Q.IDLE||i==Q.LOADING){t++;let n=st(e,q.CHANGE,function(o){let a=e.getState();(a==Q.LOADED||a==Q.ERROR||a==Q.EMPTY)&&(ut(n),t--,t===0&&(this.unlistenSources_(),this.reproject_()))},this);this.sourcesListenerKeys_.push(n)}}),t===0?setTimeout(this.reproject_.bind(this),0):this.sourceTiles_.forEach(function(e,i,n){e.getState()==Q.IDLE&&e.load()})}}unlistenSources_(){this.sourcesListenerKeys_.forEach(ut),this.sourcesListenerKeys_=null}release(){this.canvas_&&(Rn(this.canvas_.getContext("2d")),kn.push(this.canvas_),this.canvas_=null),super.release()}},Sr=Ll;var Al=class extends No{constructor(t){super(t),this.extentChanged=!0,this.renderedExtent_=null,this.renderedPixelRatio,this.renderedProjection=null,this.renderedRevision,this.renderedTiles=[],this.newTiles_=!1,this.tmpExtent=wt(),this.tmpTileRange_=new Ro(0,0,0,0)}isDrawableTile(t){let e=this.getLayer(),i=t.getState(),n=e.getUseInterimTilesOnError();return i==Q.LOADED||i==Q.EMPTY||i==Q.ERROR&&!n}getTile(t,e,i,n){let o=n.pixelRatio,a=n.viewState.projection,l=this.getLayer(),d=l.getSource().getTile(t,e,i,o,a);return d.getState()==Q.ERROR&&l.getUseInterimTilesOnError()&&l.getPreload()>0&&(this.newTiles_=!0),this.isDrawableTile(d)||(d=d.getInterimTile()),d}getData(t){let e=this.frameState;if(!e)return null;let i=this.getLayer(),n=Ot(e.pixelToCoordinateTransform,t.slice()),o=i.getExtent();if(o&&!Hi(o,n))return null;let a=e.pixelRatio,l=e.viewState.projection,u=e.viewState,d=i.getRenderSource(),m=d.getTileGridForProjection(u.projection),x=d.getTilePixelRatio(e.pixelRatio);for(let E=m.getZForResolution(u.resolution);E>=m.getMinZoom();--E){let C=m.getTileCoordForCoordAndZ(n,E),T=d.getTile(E,C[1],C[2],a,l);if(!(T instanceof zo||T instanceof Sr)||T instanceof Sr&&T.getState()===Q.EMPTY)return null;if(T.getState()!==Q.LOADED)continue;let w=m.getOrigin(E),M=zt(m.getTileSize(E)),v=m.getResolution(E),I=Math.floor(x*((n[0]-w[0])/v-C[1]*M[0])),L=Math.floor(x*((w[1]-n[1])/v-C[2]*M[1])),b=Math.round(x*d.getGutterForProjection(u.projection));return this.getImageData(T.getImage(),I+b,L+b)}return null}loadedTileCallback(t,e,i){return this.isDrawableTile(i)?super.loadedTileCallback(t,e,i):!1}prepareFrame(t){return!!this.getLayer().getSource()}renderFrame(t,e){let i=t.layerStatesArray[t.layerIndex],n=t.viewState,o=n.projection,a=n.resolution,l=n.center,u=n.rotation,d=t.pixelRatio,m=this.getLayer(),x=m.getSource(),E=x.getRevision(),C=x.getTileGridForProjection(o),T=C.getZForResolution(a,x.zDirection),w=C.getResolution(T),M=t.extent,v=t.viewState.resolution,I=x.getTilePixelRatio(d),L=Math.round(gt(M)/v*d),b=Math.round(se(M)/v*d),P=i.extent&&Ve(i.extent,o);P&&(M=Zi(M,Ve(i.extent,o)));let F=w*L/2/I,N=w*b/2/I,G=[l[0]-F,l[1]-N,l[0]+F,l[1]+N],W=C.getTileRangeForExtentAndZ(M,T),Y={};Y[T]={};let Z=this.createLoadedTileFinder(x,o,Y),it=this.tmpExtent,rt=this.tmpTileRange_;this.newTiles_=!1;let Ct=u?Hr(n.center,v,u,t.size):void 0;for(let ae=W.minX;ae<=W.maxX;++ae)for(let _t=W.minY;_t<=W.maxY;++_t){if(u&&!C.tileCoordIntersectsViewport([T,ae,_t],Ct))continue;let Mt=this.getTile(T,ae,_t,t);if(this.isDrawableTile(Mt)){let Dt=at(this);if(Mt.getState()==Q.LOADED){Y[T][Mt.tileCoord.toString()]=Mt;let Ie=Mt.inTransition(Dt);Ie&&i.opacity!==1&&(Mt.endTransition(Dt),Ie=!1),!this.newTiles_&&(Ie||!this.renderedTiles.includes(Mt))&&(this.newTiles_=!0)}if(Mt.getAlpha(Dt,t.time)===1)continue}let ti=C.getTileCoordChildTileRange(Mt.tileCoord,rt,it),he=!1;ti&&(he=Z(T+1,ti)),he||C.forEachTileCoordParentTileRange(Mt.tileCoord,Z,rt,it)}let tt=w/a*d/I;ue(this.pixelTransform,t.size[0]/2,t.size[1]/2,1/d,1/d,u,-L/2,-b/2);let V=Wr(this.pixelTransform);this.useContainer(e,V,this.getBackground(t));let K=this.context,H=K.canvas;$n(this.inversePixelTransform,this.pixelTransform),ue(this.tempTransform,L/2,b/2,tt,tt,0,-L/2,-b/2),H.width!=L||H.height!=b?(H.width=L,H.height=b):this.containerReused||K.clearRect(0,0,L,b),P&&this.clipUnrotated(K,t,P),x.getInterpolate()||(K.imageSmoothingEnabled=!1),this.preRender(K,t),this.renderedTiles.length=0;let dt=Object.keys(Y).map(Number);dt.sort(ni);let lt,At,U;i.opacity===1&&(!this.containerReused||x.getOpaque(t.viewState.projection))?dt=dt.reverse():(lt=[],At=[]);for(let ae=dt.length-1;ae>=0;--ae){let _t=dt[ae],Mt=x.getTilePixelSize(_t,d,o),he=C.getResolution(_t)/w,Dt=Mt[0]*he*tt,Ie=Mt[1]*he*tt,Ut=C.getTileCoordForCoordAndZ(Ae(G),_t),ln=C.getTileCoordExtent(Ut),pi=Ot(this.tempTransform,[I*(ln[0]-G[0])/w,I*(G[3]-ln[3])/w]),zi=I*x.getGutterForProjection(o),De=Y[_t];for(let cn in De){let we=De[cn],Nn=we.tileCoord,Dn=Ut[1]-Nn[1],Gn=Math.round(pi[0]-(Dn-1)*Dt),_i=Ut[2]-Nn[2],ws=Math.round(pi[1]-(_i-1)*Ie),Qt=Math.round(pi[0]-Dn*Dt),me=Math.round(pi[1]-_i*Ie),ve=Gn-Qt,Ge=ws-me,Ce=T===_t,yi=Ce&&we.getAlpha(at(this),t.time)!==1,ei=!1;if(!yi)if(lt){U=[Qt,me,Qt+ve,me,Qt+ve,me+Ge,Qt,me+Ge];for(let Ui=0,xi=lt.length;Ui0&&this.getCount()>this.highWaterMark}expireCache(t){for(;this.canExpireCache();)this.pop()}clear(){this.count_=0,this.entries_={},this.oldest_=null,this.newest_=null}containsKey(t){return this.entries_.hasOwnProperty(t)}forEach(t){let e=this.oldest_;for(;e;)t(e.value_,e.key_,this),e=e.newer}get(t,e){let i=this.entries_[t];return $(i!==void 0,15),i===this.newest_||(i===this.oldest_?(this.oldest_=this.oldest_.newer,this.oldest_.older=null):(i.newer.older=i.older,i.older.newer=i.newer),i.newer=null,i.older=this.newest_,this.newest_.newer=i,this.newest_=i),i.value_}remove(t){let e=this.entries_[t];return $(e!==void 0,15),e===this.newest_?(this.newest_=e.older,this.newest_&&(this.newest_.newer=null)):e===this.oldest_?(this.oldest_=e.newer,this.oldest_&&(this.oldest_.older=null)):(e.newer.older=e.older,e.older.newer=e.newer),delete this.entries_[t],--this.count_,e.value_}getCount(){return this.count_}getKeys(){let t=new Array(this.count_),e=0,i;for(i=this.newest_;i;i=i.older)t[e++]=i.key_;return t}getValues(){let t=new Array(this.count_),e=0,i;for(i=this.newest_;i;i=i.older)t[e++]=i.value_;return t}peekLast(){return this.oldest_.value_}peekLastKey(){return this.oldest_.key_}peekFirstKey(){return this.newest_.key_}peek(t){if(!!this.containsKey(t))return this.entries_[t].value_}pop(){let t=this.oldest_;return delete this.entries_[t.key_],t.newer&&(t.newer.older=null),this.oldest_=t.newer,this.oldest_||(this.newest_=null),--this.count_,t.value_}replace(t,e){this.get(t),this.entries_[t].value_=e}set(t,e){$(!(t in this.entries_),16);let i={key_:t,newer:null,older:this.newest_,value_:e};this.newest_?this.newest_.newer=i:this.oldest_=i,this.newest_=i,this.entries_[t]=i,++this.count_}setSize(t){this.highWaterMark=t}},hf=Ol;var Fl=class extends hf{clear(){for(;this.getCount()>0;)this.pop().release();super.clear()}expireCache(t){for(;this.canExpireCache()&&!(this.peekLast().getKey()in t);)this.pop().release()}pruneExceptNewestZ(){if(this.getCount()===0)return;let t=this.peekFirstKey(),i=id(t)[0];this.forEach(n=>{n.tileCoord[0]!==i&&(this.remove(Io(n.tileCoord)),n.release())})}},Bo=Fl;var Wo={TILELOADSTART:"tileloadstart",TILELOADEND:"tileloadend",TILELOADERROR:"tileloaderror"};function jo(s){let t=s.getDefaultTileGrid();return t||(t=Zg(s),s.setDefaultTileGrid(t)),t}function lf(s,t,e){let i=t[0],n=s.getTileCoordCenter(t),o=cf(e);if(!Hi(o,n)){let a=gt(o),l=Math.ceil((o[0]-n[0])/a);return n[0]+=a*l,s.getTileCoordForCoordAndZ(n,i)}return t}function Vg(s,t,e,i){i=i!==void 0?i:"top-left";let n=Hg(s,t,e);return new bo({extent:s,origin:vc(s,i),resolutions:n,tileSize:e})}function Hg(s,t,e,i){t=t!==void 0?t:42,e=zt(e!==void 0?e:256);let n=se(s),o=gt(s);i=i>0?i:Math.max(o/e[0],n/e[1]);let a=t+1,l=new Array(a);for(let u=0;ui.highWaterMark&&(i.highWaterMark=t)}useTile(t,e,i,n){}},Xo=class extends Jt{constructor(t,e){super(t),this.tile=e}},uf=kl;function Jg(s,t){let e=/\{z\}/g,i=/\{x\}/g,n=/\{y\}/g,o=/\{-y\}/g;return function(a,l,u){if(!!a)return s.replace(e,a[0].toString()).replace(i,a[1].toString()).replace(n,a[2].toString()).replace(o,function(){let d=a[0],m=t.getFullTileRange(d);return $(m,55),(m.getHeight()-a[2]-1).toString()})}}function df(s,t){let e=s.length,i=new Array(e);for(let n=0;nthis.getTileInternal(M,v,I,L,a),this.reprojectionErrorThreshold_,this.renderReprojectionEdges_,this.getInterpolate());return w.key=x,d?(w.interimTile=d,w.refreshInterimChain(),l.replace(m,w)):l.set(m,w),w}getTileInternal(t,e,i,n,o){let a=null,l=An(t,e,i),u=this.getKey();if(!this.tileCache.containsKey(l))a=this.createTile_(t,e,i,n,o,u),this.tileCache.set(l,a);else if(a=this.tileCache.get(l),a.key!=u){let d=a;a=this.createTile_(t,e,i,n,o,u),d.getState()==Q.IDLE?a.interimTile=d.interimTile:a.interimTile=d,a.refreshInterimChain(),this.tileCache.replace(l,a)}return a}setRenderReprojectionEdges(t){if(this.renderReprojectionEdges_!=t){this.renderReprojectionEdges_=t;for(let e in this.tileCacheForProjection)this.tileCacheForProjection[e].clear();this.changed()}}setTileGridForProjection(t,e){let i=Tt(t);if(i){let n=at(i);n in this.tileGridForProjection||(this.tileGridForProjection[n]=e)}}clear(){super.clear();for(let t in this.tileCacheForProjection)this.tileCacheForProjection[t].clear()}};function $g(s,t){s.getImage().src=t}var qo=Nl;function Ts(s,t){let e=[];Object.keys(t).forEach(function(n){t[n]!==null&&t[n]!==void 0&&e.push(n+"="+encodeURIComponent(t[n]))});let i=e.join("&");return s=s.replace(/[?&]$/,""),s+=s.includes("?")?"&":"?",s+i}var Dl=class extends qo{constructor(t){let e=t.requestEncoding!==void 0?t.requestEncoding:"KVP",i=t.tileGrid,n=t.urls;n===void 0&&t.url!==void 0&&(n=Ko(t.url)),super({attributions:t.attributions,attributionsCollapsible:t.attributionsCollapsible,cacheSize:t.cacheSize,crossOrigin:t.crossOrigin,interpolate:t.interpolate,projection:t.projection,reprojectionErrorThreshold:t.reprojectionErrorThreshold,tileClass:t.tileClass,tileGrid:i,tileLoadFunction:t.tileLoadFunction,tilePixelRatio:t.tilePixelRatio,urls:n,wrapX:t.wrapX!==void 0?t.wrapX:!1,transition:t.transition,zDirection:t.zDirection}),this.version_=t.version!==void 0?t.version:"1.0.0",this.format_=t.format!==void 0?t.format:"image/jpeg",this.dimensions_=t.dimensions!==void 0?t.dimensions:{},this.layer_=t.layer,this.matrixSet_=t.matrixSet,this.style_=t.style,this.requestEncoding_=e,this.setKey(this.getKeyForDimensions_()),n&&n.length>0&&(this.tileUrlFunction=Yo(n.map(this.createFromWMTSTemplate.bind(this))))}setUrls(t){this.urls=t;let e=t.join(` +`);this.setTileUrlFunction(Yo(t.map(this.createFromWMTSTemplate.bind(this))),e)}getDimensions(){return this.dimensions_}getFormat(){return this.format_}getLayer(){return this.layer_}getMatrixSet(){return this.matrixSet_}getRequestEncoding(){return this.requestEncoding_}getStyle(){return this.style_}getVersion(){return this.version_}getKeyForDimensions_(){let t=this.urls?this.urls.slice(0):[];for(let e in this.dimensions_)t.push(e+"-"+this.dimensions_[e]);return t.join("/")}updateDimensions(t){Object.assign(this.dimensions_,t),this.setKey(this.getKeyForDimensions_())}createFromWMTSTemplate(t){let e=this.requestEncoding_,i={layer:this.layer_,style:this.style_,tilematrixset:this.matrixSet_};e=="KVP"&&Object.assign(i,{Service:"WMTS",Request:"GetTile",Version:this.version_,Format:this.format_}),t=e=="KVP"?Ts(t,i):t.replace(/\{(\w+?)\}/g,function(a,l){return l.toLowerCase()in i?i[l.toLowerCase()]:a});let n=this.tileGrid,o=this.dimensions_;return function(a,l,u){if(!a)return;let d={TileMatrix:n.getMatrixId(a[0]),TileCol:a[1],TileRow:a[2]};Object.assign(d,o);let m=t;return e=="KVP"?m=Ts(m,d):m=m.replace(/\{(\w+?)\}/g,function(x,E){return d[E]}),m}}},mf=Dl;var Rr="1.3.0";var Gl=class extends qo{constructor(t){t=t||{};let e=Object.assign({},t.params),i="TRANSPARENT"in e?e.TRANSPARENT:!0;super({attributions:t.attributions,attributionsCollapsible:t.attributionsCollapsible,cacheSize:t.cacheSize,crossOrigin:t.crossOrigin,interpolate:t.interpolate,opaque:!i,projection:t.projection,reprojectionErrorThreshold:t.reprojectionErrorThreshold,tileClass:t.tileClass,tileGrid:t.tileGrid,tileLoadFunction:t.tileLoadFunction,url:t.url,urls:t.urls,wrapX:t.wrapX!==void 0?t.wrapX:!0,transition:t.transition,zDirection:t.zDirection}),this.gutter_=t.gutter!==void 0?t.gutter:0,this.params_=e,this.v13_=!0,this.serverType_=t.serverType,this.hidpi_=t.hidpi!==void 0?t.hidpi:!0,this.tmpExtent_=wt(),this.updateV13_(),this.setKey(this.getKeyForParams_())}getFeatureInfoUrl(t,e,i,n){let o=Tt(i),a=this.getProjection(),l=this.getTileGrid();l||(l=this.getTileGridForProjection(o));let u=l.getZForResolution(e,this.zDirection),d=l.getTileCoordForCoordAndZ(t,u);if(l.getResolutions().length<=d[0])return;let m=l.getResolution(d[0]),x=l.getTileCoordExtent(d,this.tmpExtent_),E=zt(l.getTileSize(d[0]),this.tmpSize),C=this.gutter_;C!==0&&(E=Rh(E,C,this.tmpSize),x=Xe(x,m*C,x)),a&&a!==o&&(m=Uo(a,o,t,m),x=Vs(x,o,a),t=Cn(t,o,a));let T={SERVICE:"WMS",VERSION:Rr,REQUEST:"GetFeatureInfo",FORMAT:"image/png",TRANSPARENT:!0,QUERY_LAYERS:this.params_.LAYERS};Object.assign(T,this.params_,n);let w=Math.floor((t[0]-x[0])/m),M=Math.floor((x[3]-t[1])/m);return T[this.v13_?"I":"X"]=w,T[this.v13_?"J":"Y"]=M,this.getRequestUrl_(d,E,x,1,a||o,T)}getLegendUrl(t,e){if(this.urls[0]===void 0)return;let i={SERVICE:"WMS",VERSION:Rr,REQUEST:"GetLegendGraphic",FORMAT:"image/png"};if(e===void 0||e.LAYER===void 0){let n=this.params_.LAYERS;if(!(!Array.isArray(n)||n.length===1))return;i.LAYER=n}if(t!==void 0){let n=this.getProjection()?this.getProjection().getMetersPerUnit():1,o=28e-5;i.SCALE=t*n/o}return Object.assign(i,e),Ts(this.urls[0],i)}getGutter(){return this.gutter_}getParams(){return this.params_}getRequestUrl_(t,e,i,n,o,a){let l=this.urls;if(!l)return;if(a.WIDTH=e[0],a.HEIGHT=e[1],a[this.v13_?"CRS":"SRS"]=o.getCode(),"STYLES"in this.params_||(a.STYLES=""),n!=1)switch(this.serverType_){case"geoserver":let x=90*n+.5|0;"FORMAT_OPTIONS"in a?a.FORMAT_OPTIONS+=";dpi:"+x:a.FORMAT_OPTIONS="dpi:"+x;break;case"mapserver":a.MAP_RESOLUTION=90*n;break;case"carmentaserver":case"qgis":a.DPI=90*n;break;default:$(!1,52);break}let u=o.getAxisOrientation(),d=i;if(this.v13_&&u.substr(0,2)=="ne"){let x;x=i[0],d[0]=i[1],d[1]=x,x=i[2],d[2]=i[3],d[3]=x}a.BBOX=d.join(",");let m;if(l.length==1)m=l[0];else{let x=Pe(wo(t),l.length);m=l[x]}return Ts(m,a)}getTilePixelRatio(t){return!this.hidpi_||this.serverType_===void 0?1:t}getKeyForParams_(){let t=0,e=[];for(let i in this.params_)e[t++]=i+"-"+this.params_[i];return e.join("/")}updateParams(t){Object.assign(this.params_,t),this.updateV13_(),this.setKey(this.getKeyForParams_())}updateV13_(){let t=this.params_.VERSION||Rr;this.v13_=Nc(t,"1.3")>=0}tileUrlFunction(t,e,i){let n=this.getTileGrid();if(n||(n=this.getTileGridForProjection(i)),n.getResolutions().length<=t[0])return;e!=1&&(!this.hidpi_||this.serverType_===void 0)&&(e=1);let o=n.getResolution(t[0]),a=n.getTileCoordExtent(t,this.tmpExtent_),l=zt(n.getTileSize(t[0]),this.tmpSize),u=this.gutter_;u!==0&&(l=Rh(l,u,this.tmpSize),a=Xe(a,o*u,a)),e!=1&&(l=So(l,e,this.tmpSize));let d={SERVICE:"WMS",VERSION:Rr,REQUEST:"GetMap",FORMAT:"image/png",TRANSPARENT:!0};return Object.assign(d,this.params_),this.getRequestUrl_(t,l,a,e,i,d)}},gf=Gl;var zl=[10.61010906,56.15950977],Rs=[12e4,59e5,1e6,65e5],Vo=[1638.4,819.2,409.6,204.8,102.4,51.2,25.6,12.8,6.4,3.2,1.6,.8,.4,.2],pf=["00","01","02","03","04","05","06","07","08","09","10","11","12","13"],_f=[256,256];var Qg=function(){return navigator.userAgent.match(/Android/i)&&navigator.userAgent.match(/Mobile/i)},tp=function(){return navigator.userAgent.match(/BlackBerry/i)},ep=function(){return navigator.userAgent.match(/iPhone|iPod/i)},ip=function(){return navigator.userAgent.match(/Opera Mini/i)},np=function(){return navigator.userAgent.match(/IEMobile/i)},yf=function(){return Qg()||tp()||ep()||ip()||np()};var Ef=yf()?"SDFI":"Styrelsen for Dataforsyning og Infrastruktur",sp="https://download.dataforsyningen.dk/content/vilk%C3%A5r-og-betingelser",rp='© '+Ef+"",op="https://datafordeler.dk/vejledning/brugervilkaar/sdfi-geografiske-data/",ap='© '+Ef+"",xf=function(s,t){return t.source==="kf"?"https://api.dataforsyningen.dk/"+s+"?token="+t.token:t.source==="df"?"https://services.datafordeler.dk/"+s+"?username="+t.username+"&password="+t.password:(console.error('Unknown source: "'+t.source+'"'),null)},Qe=function(s){let t=s.name||"",e=s.type||"",i=s.title||t,n="white",o=!!s.visible,a=s.auth,l=s.service||"",u=s.layer||"",d=s.style||"default",m=s.version||"1.1.1",x=s.matrixSet,E=s.format||"",C=s.tileGrid,T=s.auth.source==="kf"?rp:s.auth.source==="df"?ap:s.attribution,w=null;if(e==="WMTS")w=new mf({attributions:T,crossOrigin:"Anonymous",url:xf(l,a),layer:u,matrixSet:x,format:E,tileGrid:C,style:d,size:_f});else if(e==="WMS")w=new gf({attributions:T,crossOrigin:"Anonymous",url:xf(l,a),params:{LAYERS:u,VERSION:m,TRANSPARENT:"true",FORMAT:E,STYLES:d}});else return console.error('Unknown service type: "'+e+'"'),null;return new af({opacity:1,title:i,name:t,color:n,type:"base",visible:o,source:w,preload:1/0})};function Ul(s,t){let e=document.getElementById(s.target),i=document.createElement("div"),n=document.createElement("a"),o=document.createElement("div"),a=document.createElement("div"),l=document.createElement("div");a.className="title",l.className="description",i.className="ol-popup",e.appendChild(i),t?(i.appendChild(t),n=t.getElementsByClassName("closer")[0]):(n.className="ol-popup-closer",o.className="ol-popup-content",i.appendChild(n),i.appendChild(o),o.appendChild(a),o.appendChild(l)),s.olMap.getOverlays().clear();let u=new ud({element:i,autoPan:!0,autoPanAnimation:{duration:250}});s.olMap.addOverlay(u),n&&(n.onclick=function(){return u.setPosition(void 0),n.blur(),!1}),s.olMap.on("singleclick",function(d){let m=s.olMap.forEachFeatureAtPixel(d.pixel,function(E){return E});if(!m)return;let x=m.get("features");if(x.length>1){let E=Bs(x.map(C=>C.getGeometry().getCoordinates()));s.olMap.getView().fit(E,{duration:1e3,padding:[50,50,50,50]})}else{let E=x[0];t?t.childNodes.forEach(function(C){let T=E.get(C.className);T&&(C.innerHTML=T)}):(a.innerHTML=E.get("title")||"",l.innerHTML=E.get("description")||""),u.setPosition(E.getGeometry().getCoordinates())}}),s.olMap.on("pointermove",function(d){s.olMap.getTargetElement().style.cursor=s.olMap.hasFeatureAtPixel(d.pixel)?"pointer":""})}var Is=class{markers=[];icons={};markerLayerGroup;markerLayers;popup;showPopup;set markers(t){this.setMarkers(t)}constructor(t){this.icons=t.icons||{};let e=t.background||"",i=typeof t.zoomSlider>"u"?!0:t.zoomSlider,n=typeof t.scaleLine>"u"?!0:t.scaleLine,o=t.layerSwitcher||!1,a=typeof t.myLocation>"u"?!0:t.myLocation,l=t.view,u=l&&l.center==="auto",d=l&&typeof l.center!="string"?l.center||zl:zl,m=l&&l.zoom==="auto",x=typeof t.mouseWheelZoom>"u"?!0:t.mouseWheelZoom,E=t.extent||!1;this.zoom=l&&l.zoom||2;let C=typeof t.fullScreen>"u"?!0:t.fullScreen;this.popup=t.popup||null,this.showPopup=typeof t.showPopup>"u"?!0:t.showPopup,this._target=t.target||"map",this._source=t.source||"kf",this._token=t.token||"",this._username=t.username||"",this._password=t.password||"",this.autocenter=u,this.autoZoom=m,Bl.default.defs("EPSG:25832","+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs"),rd(Bl.default);let T=Tt("EPSG:25832");T.setExtent(Rs);let w=new Lo({extent:Rs,resolutions:Vo,matrixIds:pf}),M=new Lo({extent:Rs,resolutions:Vo,matrixIds:["L00","L01","L02","L03","L04","L05","L06","L07","L08","L09","L10","L11","L12","L13"]}),v=new Lo({extent:Rs,resolutions:Vo,matrixIds:["00","01","02","03","04","05","06","07","08","09","10","11","12","13"]}),I={source:"kf",token:this._token},L={source:"df",username:this._username,password:this._password},b=[];this._username&&this._password?(b.push(Qe({name:"dtk_skaermkort",type:"WMTS",title:"Sk\xE6rmkort",visible:e==="dtk_skaermkort",service:"DKskaermkort/topo_skaermkort_wmts/1.0.0/Wmts",layer:"topo_skaermkort",matrixSet:"View1",format:"image/jpeg",tileGrid:v,auth:L})),b.push(Qe({name:"dtk_skaermkort_daempet",type:"WMTS",title:"Sk\xE6rmkort d\xE6mpet",visible:e!=="orto_foraar"&&e!=="forvaltning"&&e!=="dtk_skaermkort",service:"DKskaermkort/topo_skaermkort_daempet/1.0.0/Wmts",layer:"topo_skaermkort_daempet",matrixSet:"View1",format:"image/jpeg",tileGrid:v,auth:L})),b.push(Qe({name:"orto_foraar",type:"WMTS",title:"Ortofoto",color:"white",visible:e==="orto_foraar",service:"GeoDanmarkOrto/orto_foraar_wmts/1.0.0/Wmts",layer:"orto_foraar_wmts",matrixSet:"KortforsyningTilingDK",format:"image/jpeg",tileGrid:v,auth:L}))):this._token&&(b.push(Qe({name:"dtk_skaermkort",type:"WMTS",title:"Sk\xE6rmkort",visible:e==="dtk_skaermkort",service:"topo_skaermkort_wmts_DAF",layer:"topo_skaermkort",matrixSet:"View1",format:"image/jpeg",tileGrid:w,auth:I})),b.push(Qe({name:"dtk_skaermkort_daempet",type:"WMTS",title:"Sk\xE6rmkort d\xE6mpet",visible:e!=="orto_foraar"&&e!=="forvaltning"&&e!=="dtk_skaermkort",service:"topo_skaermkort_daempet_DAF",layer:"topo_skaermkort_daempet",matrixSet:"View1",format:"image/jpeg",tileGrid:w,auth:I})),b.push(Qe({name:"orto_foraar",type:"WMTS",title:"Ortofoto",color:"white",visible:e==="orto_foraar",service:"orto_foraar_wmts_DAF",layer:"orto_foraar_wmts",matrixSet:"KortforsyningTilingDK",format:"image/jpeg",tileGrid:w,auth:I}))),this._token&&(b.push(Qe({name:"forvaltning",type:"WMS",title:"Basiskort",visible:e==="forvaltning",service:"forvaltning2",layer:"basis_kort",format:"image/png",auth:I})),b.push(Qe({name:"kommunikation",type:"WMS",title:"Kommunikation",visible:e==="kommunikation",service:"kommunikation",layer:"Kommunikationskort",format:"image/png",auth:I})),b.push(Qe({name:"natur_friluftskort",type:"WMTS",title:"Natur og Friluftskort",visible:e==="natur_friluftskort",service:"natur_friluftskort",layer:"nfkort",matrixSet:"View1",format:"image/jpeg",tileGrid:M,auth:I})));let P=[];t.overlays&&t.overlays.forEach(function(F){F.source==="kf"?(F.auth=I,F.tileGrid=w):F.source==="df"&&(F.auth=L,F.tileGrid=v),P.push(Qe(F))}),this._map=new ed({target:this._target,layers:[new hi({title:"Base maps",layers:b}),new hi({title:"Kort",layers:P}),new hi({title:"Hidden",layers:[]})],controls:ir({attribution:!1,zoom:i}),interactions:Co({mouseWheelZoom:x}),view:new Re({center:Mn(d,"EPSG:25832"),zoom:this.zoom,resolutions:w.getResolutions(),projection:T,extent:E||Rs})}),this._map.addControl(new er({collapsible:!1})),n&&this._map.addControl(new zh),i&&this._map.addControl(new Bh),C&&this._map.addControl(new kh),a&&this._map.addControl(new vr({zoomSlider:i})),this._layerSwitcher=new Fn({visible:o}),this._map.addControl(this._layerSwitcher),this.setMarkers(t.markers),this._map.on("click",function(F){document.activeElement.blur()}),i&&this.adjustControlsCss(),this._map.on("change:size",()=>{this.adjustControlsCss()})}async setMarkers(t){!t||(this.markerLayers=await $d(t,this.icons),this._map.removeLayer(this.markerLayerGroup),this.markerLayerGroup=new hi({layers:this.markerLayers}),this._map.addLayer(this.markerLayerGroup),this.autoCenter(),this.showPopup&&Ul(this,this.popup))}addVectorLayer(t,e,i){this._map.addLayer(new Cs({name:i,visible:!1,source:t,style:e}))}getVectorLayer(t){return this._map.getLayers().getArray().find(function(e){return e.get("name")===t})}autoCenter(){if(!this.autocenter||!this.markerLayers[0])return;let t=wt();this.markerLayers.forEach(function(e){qr(t,e.getSource().getSource().getExtent())}),t[0]!==1/0&&(this._map.getView().fit(t),this._map.getView().setZoom(Math.floor(this._map.getView().getZoom())),this.autoZoom||this._map.getView().setZoom(this.zoom),this._map.updateSize())}toggleBackground(t){this._layerSwitcher.toggleBackground(t)}toggleLayer(t,e){let i=this._map.getLayers().getArray(),n=i.find(function(a){return a.get("name")===t});if(n){n.setVisible(e);return}i.find(function(a){return a.get("title")==="Kort"}).get("layers").getArray().forEach(function(a,l,u){a.get("name")===t&&a.setVisible(e)})}adjustControlsCss(){let t=a=>Array.from(a).find(u=>!!u.closest("#"+this.target)),e=t(document.getElementsByClassName("ol-zoomslider")),i=t(document.getElementsByClassName("ol-zoom-out")),n=t(document.getElementsByClassName("ol-my-location")),o=document.getElementById(this.target).offsetHeight;if(o<300)e&&(e.style.display=ho),n&&(n.style.bottom="97px");else if(i){let a=Math.floor(o*.25)+6+"px";i.style.marginTop=a}}addOnFeatureClickFunction(t){let e=this._map;e.on("singleclick",function(i){let n=e.forEachFeatureAtPixel(i.pixel,function(o){return o});t(n)})}get olMap(){return this._map}get target(){return this._target}};function Mf(){let s=document.querySelectorAll("span.geomarker"),t=[];return s.forEach(function(e){let i=e.dataset,n={};for(let o in i)o==="lat"||o==="lon"?n[o]=Number(i[o]):n[o]=i[o];t.push(n)}),t}function hp(s,t){let e=document.querySelectorAll("div.geomap"),i=[];return e.forEach(function(n){let o=n.dataset,a=typeof o.type>"u"?[""]:o.type.split(","),l=vf(t,a),u=typeof o.overlays>"u"?[""]:o.overlays.split(","),d=s.overlays?s.overlays.filter(function(x){return x.name?x.name.indexOf(u)>-1:!0}):[],m=lp({element:n,filtered_overlays:d,filtered_markers:l,opt:s});i.push(m)}),i}function vf(s,t){return s.filter(function(e){return e.type?e.type.indexOf(t)>-1:!0})}function lp(s){let t=s.element.dataset,e=t.centerLon?[Number(t.centerLon),Number(t.centerLat)]:"auto";return new Is({target:s.element.id,token:t.token,username:t.username,password:t.password,background:t.background,icons:s.opt.icons,overlays:s.filtered_overlays,markers:s.filtered_markers,popup:s.opt.popup,showPopup:t.showPopup!=="false",zoomSlider:t.zoomslider==="true",mouseWheelZoom:t.mousewheelzoom!=="false",fullScreen:t.fullscreen==="true",myLocation:t.mylocation==="true",scaleLine:t.scaleline==="true",layerSwitcher:t.layerswitcher==="true",extent:t.extent?JSON.parse(t.extent):null,view:{center:t.center==="auto"?"auto":e,zoom:t.zoom}})}var Wl=class{maps=[];constructor(t){this.init(t)}init(t){this.maps=hp(t,Mf())}refresh(){let t=Mf();this.maps.forEach(function(e){let i=e.olMap.getTargetElement().dataset.type,n=typeof i>"u"?[""]:i.split(","),o=vf(t,n);e.setMarkers(o)})}},cp=Wl;export{cp as Initialize,Is as Map}; /*! The MIT License (MIT) diff --git a/dist/index.js.map b/dist/index.js.map index 6587011..416434b 100644 --- a/dist/index.js.map +++ b/dist/index.js.map @@ -1,7 +1,7 @@ { "version": 3, - "sources": ["../node_modules/proj4/dist/proj4.js", "../node_modules/rbush/rbush.min.js", "../node_modules/ol/events/Event.js", "../node_modules/ol/ObjectEventType.js", "../node_modules/ol/Disposable.js", "../node_modules/ol/array.js", "../node_modules/ol/functions.js", "../node_modules/ol/obj.js", "../node_modules/ol/events/Target.js", "../node_modules/ol/events/EventType.js", "../node_modules/ol/events.js", "../node_modules/ol/Observable.js", "../node_modules/ol/util.js", "../node_modules/ol/Object.js", "../node_modules/ol/AssertionError.js", "../node_modules/ol/CollectionEventType.js", "../node_modules/ol/Collection.js", "../node_modules/ol/has.js", "../node_modules/ol/asserts.js", "../node_modules/ol/transform.js", "../node_modules/ol/extent/Relationship.js", "../node_modules/ol/extent.js", "../node_modules/ol/math.js", "../node_modules/ol/color.js", "../node_modules/ol/style/IconImageCache.js", "../node_modules/ol/layer/Property.js", "../node_modules/ol/layer/Base.js", "../node_modules/ol/render/EventType.js", "../node_modules/ol/ViewHint.js", "../node_modules/ol/ViewProperty.js", "../node_modules/ol/proj/Units.js", "../node_modules/ol/proj/Projection.js", "../node_modules/ol/proj/epsg3857.js", "../node_modules/ol/proj/epsg4326.js", "../node_modules/ol/proj/projections.js", "../node_modules/ol/proj/transforms.js", "../node_modules/ol/string.js", "../node_modules/ol/coordinate.js", "../node_modules/ol/sphere.js", "../node_modules/ol/console.js", "../node_modules/ol/proj.js", "../node_modules/ol/centerconstraint.js", "../node_modules/ol/resolutionconstraint.js", "../node_modules/ol/rotationconstraint.js", "../node_modules/ol/easing.js", "../node_modules/ol/geom/flat/transform.js", "../node_modules/ol/geom/Geometry.js", "../node_modules/ol/geom/SimpleGeometry.js", "../node_modules/ol/geom/flat/closest.js", "../node_modules/ol/geom/flat/deflate.js", "../node_modules/ol/geom/flat/simplify.js", "../node_modules/ol/geom/flat/inflate.js", "../node_modules/ol/geom/flat/area.js", "../node_modules/ol/geom/LinearRing.js", "../node_modules/ol/geom/Point.js", "../node_modules/ol/geom/flat/contains.js", "../node_modules/ol/geom/flat/interiorpoint.js", "../node_modules/ol/geom/flat/segments.js", "../node_modules/ol/geom/flat/intersectsextent.js", "../node_modules/ol/geom/flat/reverse.js", "../node_modules/ol/geom/flat/orient.js", "../node_modules/ol/geom/Polygon.js", "../node_modules/ol/View.js", "../node_modules/ol/layer/Layer.js", "../node_modules/ol/renderer/Map.js", "../node_modules/ol/render/Event.js", "../node_modules/ol/css.js", "../node_modules/ol/dom.js", "../node_modules/ol/render/canvas.js", "../node_modules/ol/renderer/Composite.js", "../node_modules/ol/layer/Group.js", "../node_modules/ol/MapEvent.js", "../node_modules/ol/MapBrowserEvent.js", "../node_modules/ol/MapBrowserEventType.js", "../node_modules/ol/pointer/EventType.js", "../node_modules/ol/MapBrowserEventHandler.js", "../node_modules/ol/MapEventType.js", "../node_modules/ol/MapProperty.js", "../node_modules/ol/structs/PriorityQueue.js", "../node_modules/ol/TileState.js", "../node_modules/ol/TileQueue.js", "../node_modules/ol/control/Control.js", "../node_modules/ol/control/Attribution.js", "../node_modules/ol/control/Rotate.js", "../node_modules/ol/control/Zoom.js", "../node_modules/ol/control/defaults.js", "../node_modules/ol/interaction/Property.js", "../node_modules/ol/interaction/Interaction.js", "../node_modules/ol/interaction/DoubleClickZoom.js", "../node_modules/ol/interaction/Pointer.js", "../node_modules/ol/events/condition.js", "../node_modules/ol/interaction/DragPan.js", "../node_modules/ol/interaction/DragRotate.js", "../node_modules/ol/render/Box.js", "../node_modules/ol/interaction/DragBox.js", "../node_modules/ol/interaction/DragZoom.js", "../node_modules/ol/events/Key.js", "../node_modules/ol/interaction/KeyboardPan.js", "../node_modules/ol/interaction/KeyboardZoom.js", "../node_modules/ol/Kinetic.js", "../node_modules/ol/interaction/MouseWheelZoom.js", "../node_modules/ol/interaction/PinchRotate.js", "../node_modules/ol/interaction/PinchZoom.js", "../node_modules/ol/interaction/defaults.js", "../node_modules/ol/size.js", "../node_modules/ol/Map.js", "../node_modules/ol/TileRange.js", "../node_modules/ol/tilecoord.js", "../node_modules/ol/tilegrid/TileGrid.js", "../node_modules/ol/tilegrid/WMTS.js", "../src/Map.js", "../node_modules/ol/proj/proj4.js", "../node_modules/ol/control/FullScreen.js", "../node_modules/ol/Overlay.js", "../node_modules/ol/control/ScaleLine.js", "../node_modules/ol/control/ZoomSlider.js", "../node_modules/ol/ImageState.js", "../node_modules/ol/style/Image.js", "../node_modules/ol/colorlike.js", "../node_modules/ol/style/RegularShape.js", "../node_modules/ol/style/Circle.js", "../node_modules/ol/style/Fill.js", "../node_modules/ol/style/Stroke.js", "../node_modules/ol/style/Style.js", "../node_modules/ol/Image.js", "../node_modules/ol/style/IconImage.js", "../node_modules/ol/style/Icon.js", "../node_modules/ol/structs/RBush.js", "../node_modules/ol/source/Source.js", "../node_modules/ol/source/VectorEventType.js", "../node_modules/ol/loadingstrategy.js", "../node_modules/ol/featureloader.js", "../node_modules/ol/source/Vector.js", "../node_modules/ol/layer/BaseVector.js", "../node_modules/ol/style/Text.js", "../node_modules/ol/style/flat.js", "../node_modules/ol/render/canvas/Instruction.js", "../node_modules/ol/render/VectorContext.js", "../node_modules/ol/render/canvas/Builder.js", "../node_modules/ol/render/canvas/ImageBuilder.js", "../node_modules/ol/render/canvas/LineStringBuilder.js", "../node_modules/ol/render/canvas/PolygonBuilder.js", "../node_modules/ol/geom/flat/linechunk.js", "../node_modules/ol/geom/flat/straightchunk.js", "../node_modules/ol/render/canvas/TextBuilder.js", "../node_modules/ol/render/canvas/BuilderGroup.js", "../node_modules/ol/renderer/Layer.js", "../node_modules/ol/renderer/canvas/Layer.js", "../node_modules/ol/geom/flat/textpath.js", "../node_modules/ol/geom/flat/length.js", "../node_modules/ol/render/canvas/Executor.js", "../node_modules/ol/render/canvas/ExecutorGroup.js", "../node_modules/ol/render/canvas/Immediate.js", "../node_modules/ol/render/canvas/hitdetect.js", "../node_modules/ol/renderer/vector.js", "../node_modules/ol/renderer/canvas/VectorLayer.js", "../node_modules/ol/layer/Vector.js", "../node_modules/ol/Feature.js", "../src/control/MyLocation.js", "../src/control/LayerSwitcher.js", "../src/control/markers/CreateMarkers.js", "../node_modules/ol/layer/TileProperty.js", "../node_modules/ol/layer/BaseTile.js", "../node_modules/ol/Tile.js", "../node_modules/ol/ImageTile.js", "../node_modules/ol/reproj/Triangulation.js", "../node_modules/ol/reproj.js", "../node_modules/ol/reproj/Tile.js", "../node_modules/ol/renderer/canvas/TileLayer.js", "../node_modules/ol/layer/Tile.js", "../node_modules/ol/structs/LRUCache.js", "../node_modules/ol/TileCache.js", "../node_modules/ol/source/TileEventType.js", "../node_modules/ol/tilegrid.js", "../node_modules/ol/source/Tile.js", "../node_modules/ol/tileurlfunction.js", "../node_modules/ol/source/UrlTile.js", "../node_modules/ol/source/TileImage.js", "../node_modules/ol/uri.js", "../node_modules/ol/source/WMTS.js", "../node_modules/ol/source/wms.js", "../node_modules/ol/source/TileWMS.js", "../src/constants.js", "../src/utility/IsMobile.js", "../src/CreateLayer.js", "../src/control/markers/CreateMarkerTooltip.js", "../src/Initialize.js"], - "sourcesContent": ["!function(t,s){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=s():\"function\"==typeof define&&define.amd?define(s):t.proj4=s()}(this,function(){\"use strict\";function t(t,s){if(t[s])return t[s];for(var i,a=Object.keys(t),h=s.toLowerCase().replace(Ot,\"\"),e=-1;++e0?90:-90)):(t.lat0=n(t.lat1>0?90:-90),t.lat_ts=t.lat1)}function o(t){var s=this;if(2===arguments.length){var i=arguments[1];\"string\"==typeof i?\"+\"===i.charAt(0)?o[t]=kt(arguments[1]):o[t]=zt(arguments[1]):o[t]=i}else if(1===arguments.length){if(Array.isArray(t))return t.map(function(t){Array.isArray(t)?o.apply(s,t):o(t)});if(\"string\"==typeof t){if(t in o)return o[t]}else\"EPSG\"in t?o[\"EPSG:\"+t.EPSG]=t:\"ESRI\"in t?o[\"ESRI:\"+t.ESRI]=t:\"IAU2000\"in t?o[\"IAU2000:\"+t.IAU2000]=t:console.log(t);return}}function l(t){return\"string\"==typeof t}function u(t){return t in o}function c(t){return Ft.some(function(s){return t.indexOf(s)>-1})}function M(s){var i=t(s,\"authority\");if(i){var a=t(i,\"epsg\");return a&&Dt.indexOf(a)>-1}}function f(s){var i=t(s,\"extension\");if(i)return t(i,\"proj4\")}function d(t){return\"+\"===t[0]}function p(t){if(!l(t))return t;if(u(t))return o[t];if(c(t)){var s=zt(t);if(M(s))return o[\"EPSG:3857\"];var i=f(s);return i?kt(i):s}return d(t)?kt(t):void 0}function m(t){return t}function _(t,s){var i=Zt.length;return t.names?(Zt[i]=t,t.names.forEach(function(t){Vt[t.toLowerCase()]=i}),this):(console.log(s),!0)}function y(t,s,i,a){var h=t*t,e=s*s,n=(h-e)/h,r=0;return a?(h=(t*=1-n*(gt+n*(vt+n*bt)))*t,n=0):r=Math.sqrt(n),{es:n,e:r,ep2:(h-e)/e}}function x(s,i,a,h,e){if(!s){var n=t($t,h);n||(n=ts),s=n.a,i=n.b,a=n.rf}return a&&!i&&(i=(1-1/a)*s),(0===a||Math.abs(s-i)3&&(0===r.datum_params[3]&&0===r.datum_params[4]&&0===r.datum_params[5]&&0===r.datum_params[6]||(r.datum_type=dt,r.datum_params[3]*=yt,r.datum_params[4]*=yt,r.datum_params[5]*=yt,r.datum_params[6]=r.datum_params[6]/1e6+1))),n&&(r.datum_type=pt,r.grids=n),r.a=i,r.b=a,r.es=h,r.ep2=e,r}function v(t){return void 0===t?null:t.split(\",\").map(b)}function b(t){if(0===t.length)return null;var s=\"@\"===t[0];return s&&(t=t.slice(1)),\"null\"===t?{name:\"null\",mandatory:!s,grid:null,isNull:!0}:{name:t,mandatory:!s,grid:is[t]||null,isNull:!1}}function w(t){return t/3600*Math.PI/180}function N(t){var s=t.getInt32(8,!1);return 11!==s&&(11!==(s=t.getInt32(8,!0))&&console.warn(\"Failed to detect nadgrid endian-ness, defaulting to little-endian\"),!0)}function A(t,s){return{nFields:t.getInt32(8,s),nSubgridFields:t.getInt32(24,s),nSubgrids:t.getInt32(40,s),shiftType:E(t,56,64).trim(),fromSemiMajorAxis:t.getFloat64(120,s),fromSemiMinorAxis:t.getFloat64(136,s),toSemiMajorAxis:t.getFloat64(152,s),toSemiMinorAxis:t.getFloat64(168,s)}}function E(t,s,i){return String.fromCharCode.apply(null,new Uint8Array(t.buffer.slice(s,i)))}function C(t,s,i){for(var a=176,h=[],e=0;e5e-11)&&(t.datum_type===ft?t.datum_params[0]===s.datum_params[0]&&t.datum_params[1]===s.datum_params[1]&&t.datum_params[2]===s.datum_params[2]:t.datum_type!==dt||t.datum_params[0]===s.datum_params[0]&&t.datum_params[1]===s.datum_params[1]&&t.datum_params[2]===s.datum_params[2]&&t.datum_params[3]===s.datum_params[3]&&t.datum_params[4]===s.datum_params[4]&&t.datum_params[5]===s.datum_params[5]&&t.datum_params[6]===s.datum_params[6]))}function k(t,s,i){var a,h,e,n,r=t.x,o=t.y,l=t.z?t.z:0;if(o<-xt&&o>-1.001*xt)o=-xt;else if(o>xt&&o<1.001*xt)o=xt;else{if(o<-xt)return{x:-1/0,y:-1/0,z:t.z};if(o>xt)return{x:1/0,y:1/0,z:t.z}}return r>Math.PI&&(r-=2*Math.PI),h=Math.sin(o),n=Math.cos(o),e=h*h,a=i/Math.sqrt(1-s*e),{x:(a+l)*n*Math.cos(r),y:(a+l)*n*Math.sin(r),z:(a*(1-s)+l)*h}}function q(t,s,i,a){var h,e,n,r,o,l,u,c,M,f,d,p,m,_,y,x,g=t.x,v=t.y,b=t.z?t.z:0;if(h=Math.sqrt(g*g+v*v),e=Math.sqrt(g*g+v*v+b*b),h/i<1e-12){if(_=0,e/i<1e-12)return y=xt,x=-a,{x:t.x,y:t.y,z:t.z}}else _=Math.atan2(v,g);n=b/e,c=(r=h/e)*(1-s)*(o=1/Math.sqrt(1-s*(2-s)*r*r)),M=n*o,m=0;do{m++,l=s*(u=i/Math.sqrt(1-s*M*M))/(u+(x=h*c+b*M-u*(1-s*M*M))),p=(d=n*(o=1/Math.sqrt(1-l*(2-l)*r*r)))*c-(f=r*(1-l)*o)*M,c=f,M=d}while(p*p>1e-24&&m<30);return y=Math.atan(d/Math.abs(f)),{x:_,y:y,z:x}}function R(t,s,i){if(s===ft)return{x:t.x+i[0],y:t.y+i[1],z:t.z+i[2]};if(s===dt){var a=i[0],h=i[1],e=i[2],n=i[3],r=i[4],o=i[5],l=i[6];return{x:l*(t.x-o*t.y+r*t.z)+a,y:l*(o*t.x+t.y-n*t.z)+h,z:l*(-r*t.x+n*t.y+t.z)+e}}}function L(t,s,i){if(s===ft)return{x:t.x-i[0],y:t.y-i[1],z:t.z-i[2]};if(s===dt){var a=i[0],h=i[1],e=i[2],n=i[3],r=i[4],o=i[5],l=i[6],u=(t.x-a)/l,c=(t.y-h)/l,M=(t.z-e)/l;return{x:u+o*c-r*M,y:-o*u+c+n*M,z:r*u-n*c+M}}}function T(t){return t===ft||t===dt}function G(t,s,i){if(null===t.grids||0===t.grids.length)return console.log(\"Grid shift grids not found\"),-1;var a={x:-i.x,y:i.y},h={x:Number.NaN,y:Number.NaN},e=[];t:for(var n=0;na.y||f>a.x||m1e-12&&Math.abs(n.y)>1e-12);if(o<0)return console.log(\"Inverse grid shift iterator failed to converge.\"),a;a.x=Ht(e.x+i.ll[0]),a.y=e.y+i.ll[1]}else isNaN(e.x)||(a.x=t.x+e.x,a.y=t.y+e.y);return a}function B(t,s){var i,a={x:t.x/s.del[0],y:t.y/s.del[1]},h={x:Math.floor(a.x),y:Math.floor(a.y)},e={x:a.x-1*h.x,y:a.y-1*h.y},n={x:Number.NaN,y:Number.NaN};if(h.x<0||h.x>=s.lim[0])return n;if(h.y<0||h.y>=s.lim[1])return n;i=h.y*s.lim[0]+h.x;var r={x:s.cvs[i][0],y:s.cvs[i][1]};i++;var o={x:s.cvs[i][0],y:s.cvs[i][1]};i+=s.lim[0];var l={x:s.cvs[i][0],y:s.cvs[i][1]};i--;var u={x:s.cvs[i][0],y:s.cvs[i][1]},c=e.x*e.y,M=e.x*(1-e.y),f=(1-e.x)*(1-e.y),d=(1-e.x)*e.y;return n.x=f*r.x+M*o.x+d*u.x+c*l.x,n.y=f*r.y+M*o.y+d*u.y+c*l.y,n}function z(t){if(\"function\"==typeof Number.isFinite){if(Number.isFinite(t))return;throw new TypeError(\"coordinates must be finite numbers\")}if(\"number\"!=typeof t||t!==t||!isFinite(t))throw new TypeError(\"coordinates must be finite numbers\")}function F(t,s){return(t.datum.datum_type===ft||t.datum.datum_type===dt||t.datum.datum_type===pt)&&\"WGS84\"!==s.datumCode||(s.datum.datum_type===ft||s.datum.datum_type===dt||s.datum.datum_type===pt)&&\"WGS84\"!==t.datumCode}function D(t,s,i,a){var h,e=void 0!==(i=Array.isArray(i)?es(i):{x:i.x,y:i.y,z:i.z,m:i.m}).z;if(ns(i),t.datum&&s.datum&&F(t,s)&&(i=D(t,h=new Projection(\"WGS84\"),i,a),t=h),a&&\"enu\"!==t.axis&&(i=hs(t,!1,i)),\"longlat\"===t.projName)i={x:i.x*Nt,y:i.y*Nt,z:i.z||0};else if(t.to_meter&&(i={x:i.x*t.to_meter,y:i.y*t.to_meter,z:i.z||0}),!(i=t.inverse(i)))return;if(t.from_greenwich&&(i.x+=t.from_greenwich),i=as(t.datum,s.datum,i))return s.from_greenwich&&(i={x:i.x-s.from_greenwich,y:i.y,z:i.z||0}),\"longlat\"===s.projName?i={x:i.x*At,y:i.y*At,z:i.z||0}:(i=s.forward(i),s.to_meter&&(i={x:i.x/s.to_meter,y:i.y/s.to_meter,z:i.z||0})),a&&\"enu\"!==s.axis?hs(s,!0,i):(i&&!e&&delete i.z,i)}function U(t,s,i,a){var h,e,n;return Array.isArray(i)?(h=D(t,s,i,a)||{x:NaN,y:NaN},i.length>2?void 0!==t.name&&\"geocent\"===t.name||void 0!==s.name&&\"geocent\"===s.name?\"number\"==typeof h.z?[h.x,h.y,h.z].concat(i.splice(3)):[h.x,h.y,i[2]].concat(i.splice(3)):[h.x,h.y].concat(i.splice(2)):[h.x,h.y]):(e=D(t,s,i,a),2===(n=Object.keys(i)).length?e:(n.forEach(function(a){if(void 0!==t.name&&\"geocent\"===t.name||void 0!==s.name&&\"geocent\"===s.name){if(\"x\"===a||\"y\"===a||\"z\"===a)return}else if(\"x\"===a||\"y\"===a)return;e[a]=i[a]}),e))}function Q(t){return t instanceof Projection?t:t.oProj?t.oProj:Projection(t)}function W(t,s,i){t=Q(t);var a,h=!1;return void 0===s?(s=t,t=rs,h=!0):(void 0!==s.x||Array.isArray(s))&&(i=s,s=t,t=rs,h=!0),s=Q(s),i?U(t,s,i):(a={forward:function(i,a){return U(t,s,i,a)},inverse:function(i,a){return U(s,t,i,a)}},h&&(a.oProj=s),a)}function H(t,s){return s=s||5,$(V({lat:t[1],lon:t[0]}),s)}function X(t){var s=Z(at(t.toUpperCase()));return s.lat&&s.lon?[s.lon,s.lat]:[(s.left+s.right)/2,(s.top+s.bottom)/2]}function J(t){return t*(Math.PI/180)}function K(t){return t/Math.PI*180}function V(t){var s,i,a,h,e,n,r,o=t.lat,l=t.lon,u=6378137,c=J(o),M=J(l);r=Math.floor((l+180)/6)+1,180===l&&(r=60),o>=56&&o<64&&l>=3&&l<12&&(r=32),o>=72&&o<84&&(l>=0&&l<9?r=31:l>=9&&l<21?r=33:l>=21&&l<33?r=35:l>=33&&l<42&&(r=37)),n=J(6*(r-1)-180+3),s=u/Math.sqrt(1-.00669438*Math.sin(c)*Math.sin(c)),i=Math.tan(c)*Math.tan(c),a=.006739496752268451*Math.cos(c)*Math.cos(c);var f=.9996*s*((h=Math.cos(c)*(M-n))+(1-i+a)*h*h*h/6+(5-18*i+i*i+72*a-.39089081163157013)*h*h*h*h*h/120)+5e5,d=.9996*((e=u*(.9983242984503243*c-.002514607064228144*Math.sin(2*c)+2639046602129982e-21*Math.sin(4*c)-3.418046101696858e-9*Math.sin(6*c)))+s*Math.tan(c)*(h*h/2+(5-i+9*a+4*a*a)*h*h*h*h/24+(61-58*i+i*i+600*a-2.2240339282485886)*h*h*h*h*h*h/720));return o<0&&(d+=1e7),{northing:Math.round(d),easting:Math.round(f),zoneNumber:r,zoneLetter:Y(o)}}function Z(t){var s=t.northing,i=t.easting,a=t.zoneLetter,h=t.zoneNumber;if(h<0||h>60)return null;var e,n,r,o,l,u,c,M,f=6378137,d=(1-Math.sqrt(.99330562))/(1+Math.sqrt(.99330562)),p=i-5e5,m=s;a<\"N\"&&(m-=1e7),u=6*(h-1)-180+3,M=(c=m/.9996/6367449.145945056)+(3*d/2-27*d*d*d/32)*Math.sin(2*c)+(21*d*d/16-55*d*d*d*d/32)*Math.sin(4*c)+151*d*d*d/96*Math.sin(6*c),e=f/Math.sqrt(1-.00669438*Math.sin(M)*Math.sin(M)),n=Math.tan(M)*Math.tan(M),r=.006739496752268451*Math.cos(M)*Math.cos(M),o=.99330562*f/Math.pow(1-.00669438*Math.sin(M)*Math.sin(M),1.5),l=p/(.9996*e);var _=M-e*Math.tan(M)/o*(l*l/2-(5+3*n+10*r-4*r*r-.06065547077041606)*l*l*l*l/24+(61+90*n+298*r+45*n*n-1.6983531815716497-3*r*r)*l*l*l*l*l*l/720);_=K(_);var y=(l-(1+2*n+r)*l*l*l/6+(5-2*r+28*n-3*r*r+.05391597401814761+24*n*n)*l*l*l*l*l/120)/Math.cos(M);y=u+K(y);var x;if(t.accuracy){var g=Z({northing:t.northing+t.accuracy,easting:t.easting+t.accuracy,zoneLetter:t.zoneLetter,zoneNumber:t.zoneNumber});x={top:g.lat,right:g.lon,bottom:_,left:y}}else x={lat:_,lon:y};return x}function Y(t){var s=\"Z\";return 84>=t&&t>=72?s=\"X\":72>t&&t>=64?s=\"W\":64>t&&t>=56?s=\"V\":56>t&&t>=48?s=\"U\":48>t&&t>=40?s=\"T\":40>t&&t>=32?s=\"S\":32>t&&t>=24?s=\"R\":24>t&&t>=16?s=\"Q\":16>t&&t>=8?s=\"P\":8>t&&t>=0?s=\"N\":0>t&&t>=-8?s=\"M\":-8>t&&t>=-16?s=\"L\":-16>t&&t>=-24?s=\"K\":-24>t&&t>=-32?s=\"J\":-32>t&&t>=-40?s=\"H\":-40>t&&t>=-48?s=\"G\":-48>t&&t>=-56?s=\"F\":-56>t&&t>=-64?s=\"E\":-64>t&&t>=-72?s=\"D\":-72>t&&t>=-80&&(s=\"C\"),s}function $(t,s){var i=\"00000\"+t.easting,a=\"00000\"+t.northing;return t.zoneNumber+t.zoneLetter+tt(t.easting,t.northing,t.zoneNumber)+i.substr(i.length-5,s)+a.substr(a.length-5,s)}function tt(t,s,i){var a=st(i);return it(Math.floor(t/1e5),Math.floor(s/1e5)%20,a)}function st(t){var s=t%os;return 0===s&&(s=os),s}function it(t,s,i){var a=i-1,h=ls.charCodeAt(a),e=us.charCodeAt(a),n=h+t-1,r=e+s,o=!1;return n>ps&&(n=n-ps+cs-1,o=!0),(n===Ms||hMs||(n>Ms||hfs||(n>fs||hps&&(n=n-ps+cs-1),r>ds?(r=r-ds+cs-1,o=!0):o=!1,(r===Ms||eMs||(r>Ms||efs||(r>fs||eds&&(r=r-ds+cs-1),String.fromCharCode(n)+String.fromCharCode(r)}function at(t){if(t&&0===t.length)throw\"MGRSPoint coverting from nothing\";for(var s,i=t.length,a=null,h=\"\",e=0;!/[A-Z]/.test(s=t.charAt(e));){if(e>=2)throw\"MGRSPoint bad conversion from: \"+t;h+=s,e++}var n=parseInt(h,10);if(0===e||e+3>i)throw\"MGRSPoint bad conversion from: \"+t;var r=t.charAt(e++);if(r<=\"A\"||\"B\"===r||\"Y\"===r||r>=\"Z\"||\"I\"===r||\"O\"===r)throw\"MGRSPoint zone letter \"+r+\" not handled: \"+t;a=t.substring(e,e+=2);for(var o=st(n),l=ht(a.charAt(0),o),u=et(a.charAt(1),o);u0&&(M=1e5/Math.pow(10,_),f=t.substring(e,e+_),y=parseFloat(f)*M,d=t.substring(e+_),x=parseFloat(d)*M),p=y+l,m=x+u,{easting:p,northing:m,zoneLetter:r,zoneNumber:n,accuracy:M}}function ht(t,s){for(var i=ls.charCodeAt(s-1),a=1e5,h=!1;i!==t.charCodeAt(0);){if(++i===Ms&&i++,i===fs&&i++,i>ps){if(h)throw\"Bad character: \"+t;i=cs,h=!0}a+=1e5}return a}function et(t,s){if(t>\"V\")throw\"MGRSPoint given invalid Northing \"+t;for(var i=us.charCodeAt(s-1),a=0,h=!1;i!==t.charCodeAt(0);){if(++i===Ms&&i++,i===fs&&i++,i>ds){if(h)throw\"Bad character: \"+t;i=cs,h=!0}a+=1e5}return a}function nt(t){var s;switch(t){case\"C\":s=11e5;break;case\"D\":s=2e6;break;case\"E\":s=28e5;break;case\"F\":s=37e5;break;case\"G\":s=46e5;break;case\"H\":s=55e5;break;case\"J\":s=64e5;break;case\"K\":s=73e5;break;case\"L\":s=82e5;break;case\"M\":s=91e5;break;case\"N\":s=0;break;case\"P\":s=8e5;break;case\"Q\":s=17e5;break;case\"R\":s=26e5;break;case\"S\":s=35e5;break;case\"T\":s=44e5;break;case\"U\":s=53e5;break;case\"V\":s=62e5;break;case\"W\":s=7e6;break;case\"X\":s=79e5;break;default:s=-1}if(s>=0)return s;throw\"Invalid zone letter: \"+t}function Point(t,s,i){if(!(this instanceof Point))return new Point(t,s,i);if(Array.isArray(t))this.x=t[0],this.y=t[1],this.z=t[2]||0;else if(\"object\"==typeof t)this.x=t.x,this.y=t.y,this.z=t.z||0;else if(\"string\"==typeof t&&void 0===s){var a=t.split(\",\");this.x=parseFloat(a[0],10),this.y=parseFloat(a[1],10),this.z=parseFloat(a[2],10)||0}else this.x=t,this.y=s,this.z=i||0;console.warn(\"proj4.Point will be removed in version 3, use proj4.toPoint\")}function rt(t){var s=[\"Hotine_Oblique_Mercator\",\"Hotine_Oblique_Mercator_Azimuth_Natural_Origin\"],i=\"object\"==typeof t.PROJECTION?Object.keys(t.PROJECTION)[0]:t.PROJECTION;return\"no_uoff\"in t||\"no_off\"in t||-1!==s.indexOf(i)}function ot(t){var s,i=[];return i[0]=t*$s,s=t*t,i[0]+=s*ti,i[1]=s*ii,s*=t,i[0]+=s*si,i[1]+=s*ai,i[2]=s*hi,i}function lt(t,s){var i=t+t;return t+s[0]*Math.sin(i)+s[1]*Math.sin(i+i)+s[2]*Math.sin(i+i+i)}function ut(t,s,i,a){var h;return tEt&&h<=xt+Et?(a.value=Ni.AREA_1,h-=xt):h>xt+Et||h<=-(xt+Et)?(a.value=Ni.AREA_2,h=h>=0?h-Pt:h+Pt):(a.value=Ni.AREA_3,h+=xt)),h}function ct(t,s){var i=t+s;return i<-Pt?i+=Ct:i>+Pt&&(i-=Ct),i}function Mt(t,s,i,a){for(var h=s;a;--a){var e=t(h);if(h-=e,Math.abs(e)=this.text.length)return;t=this.text[this.place++]}switch(this.state){case qt:return this.neutral(t);case 2:return this.keyword(t);case 4:return this.quoted(t);case 5:return this.afterquote(t);case 3:return this.number(t);case-1:return}},s.prototype.afterquote=function(t){if('\"'===t)return this.word+='\"',void(this.state=4);if(Gt.test(t))return this.word=this.word.trim(),void this.afterItem(t);throw new Error(\"havn't handled \\\"\"+t+'\" in afterquote yet, index '+this.place)},s.prototype.afterItem=function(t){return\",\"===t?(null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=qt)):\"]\"===t?(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=qt,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=-1))):void 0},s.prototype.number=function(t){if(!jt.test(t)){if(Gt.test(t))return this.word=parseFloat(this.word),void this.afterItem(t);throw new Error(\"havn't handled \\\"\"+t+'\" in number yet, index '+this.place)}this.word+=t},s.prototype.quoted=function(t){'\"'!==t?this.word+=t:this.state=5},s.prototype.keyword=function(t){if(Tt.test(t))this.word+=t;else{if(\"[\"===t){var s=[];return s.push(this.word),this.level++,null===this.root?this.root=s:this.currentObject.push(s),this.stack.push(this.currentObject),this.currentObject=s,void(this.state=qt)}if(!Gt.test(t))throw new Error(\"havn't handled \\\"\"+t+'\" in keyword yet, index '+this.place);this.afterItem(t)}},s.prototype.neutral=function(t){if(Lt.test(t))return this.word=t,void(this.state=2);if('\"'===t)return this.word=\"\",void(this.state=4);if(jt.test(t))return this.word=t,void(this.state=3);{if(!Gt.test(t))throw new Error(\"havn't handled \\\"\"+t+'\" in neutral yet, index '+this.place);this.afterItem(t)}},s.prototype.output=function(){for(;this.place90&&i*At<-90&&s*At>180&&s*At<-180)return null;var a,h;if(Math.abs(Math.abs(i)-xt)<=wt)return null;if(this.sphere)a=this.x0+this.a*this.k0*Ht(s-this.long0),h=this.y0+this.a*this.k0*Math.log(Math.tan(Et+.5*i));else{var e=Math.sin(i),n=Xt(this.e,i,e);a=this.x0+this.a*this.k0*Ht(s-this.long0),h=this.y0-this.a*this.k0*Math.log(n)}return t.x=a,t.y=h,t},inverse:function(t){var s,i,a=t.x-this.x0,h=t.y-this.y0;if(this.sphere)i=xt-2*Math.atan(Math.exp(-h/(this.a*this.k0)));else{var e=Math.exp(-h/(this.a*this.k0));if(-9999===(i=Jt(this.e,e)))return null}return s=Ht(this.long0+a/(this.a*this.k0)),t.x=s,t.y=i,t},names:[\"Mercator\",\"Popular Visualisation Pseudo Mercator\",\"Mercator_1SP\",\"Mercator_Auxiliary_Sphere\",\"merc\"]},{init:function(){},forward:m,inverse:m,names:[\"longlat\",\"identity\"]}],Vt={},Zt=[],Yt={start:function(){Kt.forEach(_)},add:_,get:function(t){if(!t)return!1;var s=t.toLowerCase();return void 0!==Vt[s]&&Zt[Vt[s]]?Zt[Vt[s]]:void 0}},$t={};$t.MERIT={a:6378137,rf:298.257,ellipseName:\"MERIT 1983\"},$t.SGS85={a:6378136,rf:298.257,ellipseName:\"Soviet Geodetic System 85\"},$t.GRS80={a:6378137,rf:298.257222101,ellipseName:\"GRS 1980(IUGG, 1980)\"},$t.IAU76={a:6378140,rf:298.257,ellipseName:\"IAU 1976\"},$t.airy={a:6377563.396,b:6356256.91,ellipseName:\"Airy 1830\"},$t.APL4={a:6378137,rf:298.25,ellipseName:\"Appl. Physics. 1965\"},$t.NWL9D={a:6378145,rf:298.25,ellipseName:\"Naval Weapons Lab., 1965\"},$t.mod_airy={a:6377340.189,b:6356034.446,ellipseName:\"Modified Airy\"},$t.andrae={a:6377104.43,rf:300,ellipseName:\"Andrae 1876 (Den., Iclnd.)\"},$t.aust_SA={a:6378160,rf:298.25,ellipseName:\"Australian Natl & S. Amer. 1969\"},$t.GRS67={a:6378160,rf:298.247167427,ellipseName:\"GRS 67(IUGG 1967)\"},$t.bessel={a:6377397.155,rf:299.1528128,ellipseName:\"Bessel 1841\"},$t.bess_nam={a:6377483.865,rf:299.1528128,ellipseName:\"Bessel 1841 (Namibia)\"},$t.clrk66={a:6378206.4,b:6356583.8,ellipseName:\"Clarke 1866\"},$t.clrk80={a:6378249.145,rf:293.4663,ellipseName:\"Clarke 1880 mod.\"},$t.clrk80ign={a:6378249.2,b:6356515,rf:293.4660213,ellipseName:\"Clarke 1880 (IGN)\"},$t.clrk58={a:6378293.645208759,rf:294.2606763692654,ellipseName:\"Clarke 1858\"},$t.CPM={a:6375738.7,rf:334.29,ellipseName:\"Comm. des Poids et Mesures 1799\"},$t.delmbr={a:6376428,rf:311.5,ellipseName:\"Delambre 1810 (Belgium)\"},$t.engelis={a:6378136.05,rf:298.2566,ellipseName:\"Engelis 1985\"},$t.evrst30={a:6377276.345,rf:300.8017,ellipseName:\"Everest 1830\"},$t.evrst48={a:6377304.063,rf:300.8017,ellipseName:\"Everest 1948\"},$t.evrst56={a:6377301.243,rf:300.8017,ellipseName:\"Everest 1956\"},$t.evrst69={a:6377295.664,rf:300.8017,ellipseName:\"Everest 1969\"},$t.evrstSS={a:6377298.556,rf:300.8017,ellipseName:\"Everest (Sabah & Sarawak)\"},$t.fschr60={a:6378166,rf:298.3,ellipseName:\"Fischer (Mercury Datum) 1960\"},$t.fschr60m={a:6378155,rf:298.3,ellipseName:\"Fischer 1960\"},$t.fschr68={a:6378150,rf:298.3,ellipseName:\"Fischer 1968\"},$t.helmert={a:6378200,rf:298.3,ellipseName:\"Helmert 1906\"},$t.hough={a:6378270,rf:297,ellipseName:\"Hough\"},$t.intl={a:6378388,rf:297,ellipseName:\"International 1909 (Hayford)\"},$t.kaula={a:6378163,rf:298.24,ellipseName:\"Kaula 1961\"},$t.lerch={a:6378139,rf:298.257,ellipseName:\"Lerch 1979\"},$t.mprts={a:6397300,rf:191,ellipseName:\"Maupertius 1738\"},$t.new_intl={a:6378157.5,b:6356772.2,ellipseName:\"New International 1967\"},$t.plessis={a:6376523,rf:6355863,ellipseName:\"Plessis 1817 (France)\"},$t.krass={a:6378245,rf:298.3,ellipseName:\"Krassovsky, 1942\"},$t.SEasia={a:6378155,b:6356773.3205,ellipseName:\"Southeast Asia\"},$t.walbeck={a:6376896,b:6355834.8467,ellipseName:\"Walbeck\"},$t.WGS60={a:6378165,rf:298.3,ellipseName:\"WGS 60\"},$t.WGS66={a:6378145,rf:298.25,ellipseName:\"WGS 66\"},$t.WGS7={a:6378135,rf:298.26,ellipseName:\"WGS 72\"};var ts=$t.WGS84={a:6378137,rf:298.257223563,ellipseName:\"WGS 84\"};$t.sphere={a:6370997,b:6370997,ellipseName:\"Normal Sphere (r=6370997)\"};var ss={};ss.wgs84={towgs84:\"0,0,0\",ellipse:\"WGS84\",datumName:\"WGS84\"},ss.ch1903={towgs84:\"674.374,15.056,405.346\",ellipse:\"bessel\",datumName:\"swiss\"},ss.ggrs87={towgs84:\"-199.87,74.79,246.62\",ellipse:\"GRS80\",datumName:\"Greek_Geodetic_Reference_System_1987\"},ss.nad83={towgs84:\"0,0,0\",ellipse:\"GRS80\",datumName:\"North_American_Datum_1983\"},ss.nad27={nadgrids:\"@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat\",ellipse:\"clrk66\",datumName:\"North_American_Datum_1927\"},ss.potsdam={towgs84:\"598.1,73.7,418.2,0.202,0.045,-2.455,6.7\",ellipse:\"bessel\",datumName:\"Potsdam Rauenberg 1950 DHDN\"},ss.carthage={towgs84:\"-263.0,6.0,431.0\",ellipse:\"clark80\",datumName:\"Carthage 1934 Tunisia\"},ss.hermannskogel={towgs84:\"577.326,90.129,463.919,5.137,1.474,5.297,2.4232\",ellipse:\"bessel\",datumName:\"Hermannskogel\"},ss.osni52={towgs84:\"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15\",ellipse:\"airy\",datumName:\"Irish National\"},ss.ire65={towgs84:\"482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15\",ellipse:\"mod_airy\",datumName:\"Ireland 1965\"},ss.rassadiran={towgs84:\"-133.63,-157.5,-158.62\",ellipse:\"intl\",datumName:\"Rassadiran\"},ss.nzgd49={towgs84:\"59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993\",ellipse:\"intl\",datumName:\"New Zealand Geodetic Datum 1949\"},ss.osgb36={towgs84:\"446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894\",ellipse:\"airy\",datumName:\"Airy 1830\"},ss.s_jtsk={towgs84:\"589,76,480\",ellipse:\"bessel\",datumName:\"S-JTSK (Ferro)\"},ss.beduaram={towgs84:\"-106,-87,188\",ellipse:\"clrk80\",datumName:\"Beduaram\"},ss.gunung_segara={towgs84:\"-403,684,41\",ellipse:\"bessel\",datumName:\"Gunung Segara Jakarta\"},ss.rnb72={towgs84:\"106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1\",ellipse:\"intl\",datumName:\"Reseau National Belge 1972\"};var is={};Projection.projections=Yt,Projection.projections.start();var as=function(t,s,i){if(O(t,s))return i;if(t.datum_type===_t||s.datum_type===_t)return i;var a=t.a,h=t.es;if(t.datum_type===pt){if(0!==G(t,!1,i))return;a=6378137,h=.0066943799901413165}var e=s.a,n=s.b,r=s.es;return s.datum_type===pt&&(e=6378137,n=6356752.314,r=.0066943799901413165),h!==r||a!==e||T(t.datum_type)||T(s.datum_type)?(i=k(i,h,a),T(t.datum_type)&&(i=R(i,t.datum_type,t.datum_params)),T(s.datum_type)&&(i=L(i,s.datum_type,s.datum_params)),i=q(i,r,e,n),s.datum_type!==pt||0===G(s,!0,i)?i:void 0):i},hs=function(t,s,i){var a,h,e,n=i.x,r=i.y,o=i.z||0,l={};for(e=0;e<3;e++)if(!s||2!==e||void 0!==i.z)switch(0===e?(a=n,h=-1!==\"ew\".indexOf(t.axis[e])?\"x\":\"y\"):1===e?(a=r,h=-1!==\"ns\".indexOf(t.axis[e])?\"y\":\"x\"):(a=o,h=\"z\"),t.axis[e]){case\"e\":l[h]=a;break;case\"w\":l[h]=-a;break;case\"n\":l[h]=a;break;case\"s\":l[h]=-a;break;case\"u\":void 0!==i[h]&&(l.z=a);break;case\"d\":void 0!==i[h]&&(l.z=-a);break;default:return null}return l},es=function(t){var s={x:t[0],y:t[1]};return t.length>2&&(s.z=t[2]),t.length>3&&(s.m=t[3]),s},ns=function(t){z(t.x),z(t.y)},rs=Projection(\"WGS84\"),os=6,ls=\"AJSAJS\",us=\"AFAFAF\",cs=65,Ms=73,fs=79,ds=86,ps=90,ms={forward:H,inverse:function(t){var s=Z(at(t.toUpperCase()));return s.lat&&s.lon?[s.lon,s.lat,s.lon,s.lat]:[s.left,s.bottom,s.right,s.top]},toPoint:X};Point.fromMGRS=function(t){return new Point(X(t))},Point.prototype.toMGRS=function(t){return H([this.x,this.y],t)};var _s=.01068115234375,ys=function(t){var s=[];s[0]=1-t*(.25+t*(.046875+t*(.01953125+t*_s))),s[1]=t*(.75-t*(.046875+t*(.01953125+t*_s)));var i=t*t;return s[2]=i*(.46875-t*(.013020833333333334+.007120768229166667*t)),i*=t,s[3]=i*(.3645833333333333-.005696614583333333*t),s[4]=i*t*.3076171875,s},xs=function(t,s,i,a){return i*=s,s*=s,a[0]*t-i*(a[1]+s*(a[2]+s*(a[3]+s*a[4])))},gs=function(t,s,i){for(var a=1/(1-s),h=t,e=20;e;--e){var n=Math.sin(h),r=1-s*n*n;if(r=(xs(h,n,Math.cos(h),i)-t)*(r*Math.sqrt(r))*a,h-=r,Math.abs(r)wt?Math.tan(e):0,d=Math.pow(f,2),p=Math.pow(d,2);s=1-this.es*Math.pow(r,2),l/=Math.sqrt(s);var m=xs(e,r,o,this.en);i=this.a*(this.k0*l*(1+u/6*(1-d+c+u/20*(5-18*d+p+14*c-58*d*c+u/42*(61+179*p-p*d-479*d)))))+this.x0,a=this.a*(this.k0*(m-this.ml0+r*n*l/2*(1+u/12*(5-d+9*c+4*M+u/30*(61+p-58*d+270*c-330*d*c+u/56*(1385+543*p-p*d-3111*d))))))+this.y0}else{var _=o*Math.sin(n);if(Math.abs(Math.abs(_)-1)=1){if(_-1>wt)return 93;a=0}else a=Math.acos(a);e<0&&(a=-a),a=this.a*this.k0*(a-this.lat0)+this.y0}return t.x=i,t.y=a,t},inverse:function(t){var s,i,a,h,e=(t.x-this.x0)*(1/this.a),n=(t.y-this.y0)*(1/this.a);if(this.es)if(s=this.ml0+n/this.k0,i=gs(s,this.es,this.en),Math.abs(i)wt?Math.tan(i):0,u=this.ep2*Math.pow(o,2),c=Math.pow(u,2),M=Math.pow(l,2),f=Math.pow(M,2);s=1-this.es*Math.pow(r,2);var d=e*Math.sqrt(s)/this.k0,p=Math.pow(d,2);a=i-(s*=l)*p/(1-this.es)*.5*(1-p/12*(5+3*M-9*u*M+u-4*c-p/30*(61+90*M-252*u*M+45*f+46*u-p/56*(1385+3633*M+4095*f+1574*f*M)))),h=Ht(this.long0+d*(1-p/6*(1+2*M+u-p/20*(5+28*M+24*f+8*u*M+6*u-p/42*(61+662*M+1320*f+720*f*M))))/o)}else a=xt*Wt(n),h=0;else{var m=Math.exp(e/this.k0),_=.5*(m-1/m),y=this.lat0+n/this.k0,x=Math.cos(y);s=Math.sqrt((1-Math.pow(x,2))/(1+Math.pow(_,2))),a=Math.asin(s),n<0&&(a=-a),h=0===_&&0===x?0:Ht(Math.atan2(_,x)+this.long0)}return t.x=h,t.y=a,t},names:[\"Fast_Transverse_Mercator\",\"Fast Transverse Mercator\"]},bs=function(t){var s=Math.exp(t);return s=(s-1/s)/2},ws=function(t,s){t=Math.abs(t),s=Math.abs(s);var i=Math.max(t,s),a=Math.min(t,s)/(i||1);return i*Math.sqrt(1+Math.pow(a,2))},Ns=function(t){var s=1+t,i=s-1;return 0===i?t:t*Math.log(s)/i},As=function(t){var s=Math.abs(t);return s=Ns(s*(1+s/(ws(1,s)+1))),t<0?-s:s},Es=function(t,s){for(var i,a=2*Math.cos(2*s),h=t.length-1,e=t[h],n=0;--h>=0;)i=a*e-n+t[h],n=e,e=i;return s+i*Math.sin(2*s)},Cs=function(t,s){for(var i,a=2*Math.cos(s),h=t.length-1,e=t[h],n=0;--h>=0;)i=a*e-n+t[h],n=e,e=i;return Math.sin(s)*i},Ps=function(t){var s=Math.exp(t);return s=(s+1/s)/2},Ss=function(t,s,i){for(var a,h,e=Math.sin(s),n=Math.cos(s),r=bs(i),o=Ps(i),l=2*n*o,u=-2*e*r,c=t.length-1,M=t[c],f=0,d=0,p=0;--c>=0;)a=d,h=f,M=l*(d=M)-a-u*(f=p)+t[c],p=u*d-h+l*f;return l=e*o,u=n*r,[l*M-u*p,l*p+u*M]},Is={init:function(){if(!this.approx&&(isNaN(this.es)||this.es<=0))throw new Error('Incorrect elliptical usage. Try using the +approx option in the proj string, or PROJECTION[\"Fast_Transverse_Mercator\"] in the WKT.');this.approx&&(vs.init.apply(this),this.forward=vs.forward,this.inverse=vs.inverse),this.x0=void 0!==this.x0?this.x0:0,this.y0=void 0!==this.y0?this.y0:0,this.long0=void 0!==this.long0?this.long0:0,this.lat0=void 0!==this.lat0?this.lat0:0,this.cgb=[],this.cbg=[],this.utg=[],this.gtu=[];var t=this.es/(1+Math.sqrt(1-this.es)),s=t/(2-t),i=s;this.cgb[0]=s*(2+s*(-2/3+s*(s*(116/45+s*(26/45+s*(-2854/675)))-2))),this.cbg[0]=s*(s*(2/3+s*(4/3+s*(-82/45+s*(32/45+s*(4642/4725)))))-2),i*=s,this.cgb[1]=i*(7/3+s*(s*(-227/45+s*(2704/315+s*(2323/945)))-1.6)),this.cbg[1]=i*(5/3+s*(-16/15+s*(-13/9+s*(904/315+s*(-1522/945))))),i*=s,this.cgb[2]=i*(56/15+s*(-136/35+s*(-1262/105+s*(73814/2835)))),this.cbg[2]=i*(-26/15+s*(34/21+s*(1.6+s*(-12686/2835)))),i*=s,this.cgb[3]=i*(4279/630+s*(-332/35+s*(-399572/14175))),this.cbg[3]=i*(1237/630+s*(s*(-24832/14175)-2.4)),i*=s,this.cgb[4]=i*(4174/315+s*(-144838/6237)),this.cbg[4]=i*(-734/315+s*(109598/31185)),i*=s,this.cgb[5]=i*(601676/22275),this.cbg[5]=i*(444337/155925),i=Math.pow(s,2),this.Qn=this.k0/(1+s)*(1+i*(.25+i*(1/64+i/256))),this.utg[0]=s*(s*(2/3+s*(-37/96+s*(1/360+s*(81/512+s*(-96199/604800)))))-.5),this.gtu[0]=s*(.5+s*(-2/3+s*(5/16+s*(41/180+s*(-127/288+s*(7891/37800)))))),this.utg[1]=i*(-1/48+s*(-1/15+s*(437/1440+s*(-46/105+s*(1118711/3870720))))),this.gtu[1]=i*(13/48+s*(s*(557/1440+s*(281/630+s*(-1983433/1935360)))-.6)),i*=s,this.utg[2]=i*(-17/480+s*(37/840+s*(209/4480+s*(-5569/90720)))),this.gtu[2]=i*(61/240+s*(-103/140+s*(15061/26880+s*(167603/181440)))),i*=s,this.utg[3]=i*(-4397/161280+s*(11/504+s*(830251/7257600))),this.gtu[3]=i*(49561/161280+s*(-179/168+s*(6601661/7257600))),i*=s,this.utg[4]=i*(-4583/161280+s*(108847/3991680)),this.gtu[4]=i*(34729/80640+s*(-3418889/1995840)),i*=s,this.utg[5]=-.03233083094085698*i,this.gtu[5]=.6650675310896665*i;var a=Es(this.cbg,this.lat0);this.Zb=-this.Qn*(a+Cs(this.gtu,2*a))},forward:function(t){var s=Ht(t.x-this.long0),i=t.y;i=Es(this.cbg,i);var a=Math.sin(i),h=Math.cos(i),e=Math.sin(s),n=Math.cos(s);i=Math.atan2(a,n*h),s=Math.atan2(e*h,ws(a,h*n)),s=As(Math.tan(s));var r=Ss(this.gtu,2*i,2*s);i+=r[0],s+=r[1];var o,l;return Math.abs(s)<=2.623395162778?(o=this.a*(this.Qn*s)+this.x0,l=this.a*(this.Qn*i+this.Zb)+this.y0):(o=1/0,l=1/0),t.x=o,t.y=l,t},inverse:function(t){var s=(t.x-this.x0)*(1/this.a),i=(t.y-this.y0)*(1/this.a);i=(i-this.Zb)/this.Qn,s/=this.Qn;var a,h;if(Math.abs(s)<=2.623395162778){var e=Ss(this.utg,2*i,2*s);i+=e[0],s+=e[1],s=Math.atan(bs(s));var n=Math.sin(i),r=Math.cos(i),o=Math.sin(s),l=Math.cos(s);i=Math.atan2(n*l,ws(o,l*r)),s=Math.atan2(o,l*r),a=Ht(s+this.long0),h=Es(this.cgb,i)}else a=1/0,h=1/0;return t.x=a,t.y=h,t},names:[\"Extended_Transverse_Mercator\",\"Extended Transverse Mercator\",\"etmerc\",\"Transverse_Mercator\",\"Transverse Mercator\",\"tmerc\"]},Os=function(t,s){if(void 0===t){if((t=Math.floor(30*(Ht(s)+Math.PI)/Math.PI)+1)<0)return 0;if(t>60)return 60}return t},ks={init:function(){var t=Os(this.zone,this.long0);if(void 0===t)throw new Error(\"unknown utm zone\");this.lat0=0,this.long0=(6*Math.abs(t)-183)*Nt,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,Is.init.apply(this),this.forward=Is.forward,this.inverse=Is.inverse},names:[\"Universal Transverse Mercator System\",\"utm\"],dependsOn:\"etmerc\"},qs=function(t,s){return Math.pow((1-t)/(1+t),s)},Rs=20,Ls={init:function(){var t=Math.sin(this.lat0),s=Math.cos(this.lat0);s*=s,this.rc=Math.sqrt(1-this.es)/(1-this.es*t*t),this.C=Math.sqrt(1+this.es*s*s/(1-this.es)),this.phic0=Math.asin(t/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+Et)/(Math.pow(Math.tan(.5*this.lat0+Et),this.C)*qs(this.e*t,this.ratexp))},forward:function(t){var s=t.x,i=t.y;return t.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*i+Et),this.C)*qs(this.e*Math.sin(i),this.ratexp))-xt,t.x=this.C*s,t},inverse:function(t){for(var s=t.x/this.C,i=t.y,a=Math.pow(Math.tan(.5*i+Et)/this.K,1/this.C),h=Rs;h>0&&(i=2*Math.atan(a*qs(this.e*Math.sin(t.y),-.5*this.e))-xt,!(Math.abs(i-t.y)<1e-14));--h)t.y=i;return h?(t.x=s,t.y=i,t):null},names:[\"gauss\"]},Ts={init:function(){Ls.init.apply(this),this.rc&&(this.sinc0=Math.sin(this.phic0),this.cosc0=Math.cos(this.phic0),this.R2=2*this.rc,this.title||(this.title=\"Oblique Stereographic Alternative\"))},forward:function(t){var s,i,a,h;return t.x=Ht(t.x-this.long0),Ls.forward.apply(this,[t]),s=Math.sin(t.y),i=Math.cos(t.y),a=Math.cos(t.x),h=this.k0*this.R2/(1+this.sinc0*s+this.cosc0*i*a),t.x=h*i*Math.sin(t.x),t.y=h*(this.cosc0*s-this.sinc0*i*a),t.x=this.a*t.x+this.x0,t.y=this.a*t.y+this.y0,t},inverse:function(t){var s,i,a,h,e;if(t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,e=Math.sqrt(t.x*t.x+t.y*t.y)){var n=2*Math.atan2(e,this.R2);s=Math.sin(n),i=Math.cos(n),h=Math.asin(i*this.sinc0+t.y*s*this.cosc0/e),a=Math.atan2(t.x*s,e*this.cosc0*i-t.y*this.sinc0*s)}else h=this.phic0,a=0;return t.x=a,t.y=h,Ls.inverse.apply(this,[t]),t.x=Ht(t.x+this.long0),t},names:[\"Stereographic_North_Pole\",\"Oblique_Stereographic\",\"sterea\",\"Oblique Stereographic Alternative\",\"Double_Stereographic\"]},Gs={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.coslat0=Math.cos(this.lat0),this.sinlat0=Math.sin(this.lat0),this.sphere?1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=wt&&(this.k0=.5*(1+Wt(this.lat0)*Math.sin(this.lat_ts))):(Math.abs(this.coslat0)<=wt&&(this.lat0>0?this.con=1:this.con=-1),this.cons=Math.sqrt(Math.pow(1+this.e,1+this.e)*Math.pow(1-this.e,1-this.e)),1===this.k0&&!isNaN(this.lat_ts)&&Math.abs(this.coslat0)<=wt&&Math.abs(Math.cos(this.lat_ts))>wt&&(this.k0=.5*this.cons*Qt(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/Xt(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=Qt(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-xt,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))},forward:function(t){var s,i,a,h,e,n,r=t.x,o=t.y,l=Math.sin(o),u=Math.cos(o),c=Ht(r-this.long0);return Math.abs(Math.abs(r-this.long0)-Math.PI)<=wt&&Math.abs(o+this.lat0)<=wt?(t.x=NaN,t.y=NaN,t):this.sphere?(s=2*this.k0/(1+this.sinlat0*l+this.coslat0*u*Math.cos(c)),t.x=this.a*s*u*Math.sin(c)+this.x0,t.y=this.a*s*(this.coslat0*l-this.sinlat0*u*Math.cos(c))+this.y0,t):(i=2*Math.atan(this.ssfn_(o,l,this.e))-xt,h=Math.cos(i),a=Math.sin(i),Math.abs(this.coslat0)<=wt?(e=Xt(this.e,o*this.con,this.con*l),n=2*this.a*this.k0*e/this.cons,t.x=this.x0+n*Math.sin(r-this.long0),t.y=this.y0-this.con*n*Math.cos(r-this.long0),t):(Math.abs(this.sinlat0)0?this.long0+Math.atan2(t.x,-1*t.y):this.long0+Math.atan2(t.x,t.y):this.long0+Math.atan2(t.x*Math.sin(r),n*this.coslat0*Math.cos(r)-t.y*this.sinlat0*Math.sin(r))),t.x=s,t.y=i,t)}if(Math.abs(this.coslat0)<=wt){if(n<=wt)return i=this.lat0,s=this.long0,t.x=s,t.y=i,t;t.x*=this.con,t.y*=this.con,a=n*this.cons/(2*this.a*this.k0),i=this.con*Jt(this.e,a),s=this.con*Ht(this.con*this.long0+Math.atan2(t.x,-1*t.y))}else h=2*Math.atan(n*this.cosX0/(2*this.a*this.k0*this.ms1)),s=this.long0,n<=wt?e=this.X0:(e=Math.asin(Math.cos(h)*this.sinX0+t.y*Math.sin(h)*this.cosX0/n),s=Ht(this.long0+Math.atan2(t.x*Math.sin(h),n*this.cosX0*Math.cos(h)-t.y*this.sinX0*Math.sin(h)))),i=-1*Jt(this.e,Math.tan(.5*(xt+e)));return t.x=s,t.y=i,t},names:[\"stere\",\"Stereographic_South_Pole\",\"Polar Stereographic (variant B)\",\"Polar_Stereographic\"],ssfn_:function(t,s,i){return s*=i,Math.tan(.5*(xt+t))*Math.pow((1-s)/(1+s),.5*i)}},js={init:function(){var t=this.lat0;this.lambda0=this.long0;var s=Math.sin(t),i=this.a,a=1/this.rf,h=2*a-Math.pow(a,2),e=this.e=Math.sqrt(h);this.R=this.k0*i*Math.sqrt(1-h)/(1-h*Math.pow(s,2)),this.alpha=Math.sqrt(1+h/(1-h)*Math.pow(Math.cos(t),4)),this.b0=Math.asin(s/this.alpha);var n=Math.log(Math.tan(Math.PI/4+this.b0/2)),r=Math.log(Math.tan(Math.PI/4+t/2)),o=Math.log((1+e*s)/(1-e*s));this.K=n-this.alpha*r+this.alpha*e/2*o},forward:function(t){var s=Math.log(Math.tan(Math.PI/4-t.y/2)),i=this.e/2*Math.log((1+this.e*Math.sin(t.y))/(1-this.e*Math.sin(t.y))),a=-this.alpha*(s+i)+this.K,h=2*(Math.atan(Math.exp(a))-Math.PI/4),e=this.alpha*(t.x-this.lambda0),n=Math.atan(Math.sin(e)/(Math.sin(this.b0)*Math.tan(h)+Math.cos(this.b0)*Math.cos(e))),r=Math.asin(Math.cos(this.b0)*Math.sin(h)-Math.sin(this.b0)*Math.cos(h)*Math.cos(e));return t.y=this.R/2*Math.log((1+Math.sin(r))/(1-Math.sin(r)))+this.y0,t.x=this.R*n+this.x0,t},inverse:function(t){for(var s=t.x-this.x0,i=t.y-this.y0,a=s/this.R,h=2*(Math.atan(Math.exp(i/this.R))-Math.PI/4),e=Math.asin(Math.cos(this.b0)*Math.sin(h)+Math.sin(this.b0)*Math.cos(h)*Math.cos(a)),n=Math.atan(Math.sin(a)/(Math.cos(this.b0)*Math.cos(a)-Math.sin(this.b0)*Math.tan(h))),r=this.lambda0+n/this.alpha,o=0,l=e,u=-1e3,c=0;Math.abs(l-u)>1e-7;){if(++c>20)return;o=1/this.alpha*(Math.log(Math.tan(Math.PI/4+e/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(l))/2)),u=l,l=2*Math.atan(Math.exp(o))-Math.PI/2}return t.x=r,t.y=l,t},names:[\"somerc\"]},Bs=1e-7,zs={init:function(){var t,s,i,a,h,e,n,r,o,l,u,c=0,M=0,f=0,d=0,p=0,m=0,_=0;this.no_off=rt(this),this.no_rot=\"no_rot\"in this;var y=!1;\"alpha\"in this&&(y=!0);var x=!1;if(\"rectified_grid_angle\"in this&&(x=!0),y&&(_=this.alpha),x&&(c=this.rectified_grid_angle*Nt),y||x)M=this.longc;else if(f=this.long1,p=this.lat1,d=this.long2,m=this.lat2,Math.abs(p-m)<=Bs||(t=Math.abs(p))<=Bs||Math.abs(t-xt)<=Bs||Math.abs(Math.abs(this.lat0)-xt)<=Bs||Math.abs(Math.abs(m)-xt)<=Bs)throw new Error;var g=1-this.es;s=Math.sqrt(g),Math.abs(this.lat0)>wt?(r=Math.sin(this.lat0),i=Math.cos(this.lat0),t=1-this.es*r*r,this.B=i*i,this.B=Math.sqrt(1+this.es*this.B*this.B/g),this.A=this.B*this.k0*s/t,(h=(a=this.B*s/(i*Math.sqrt(t)))*a-1)<=0?h=0:(h=Math.sqrt(h),this.lat0<0&&(h=-h)),this.E=h+=a,this.E*=Math.pow(Xt(this.e,this.lat0,r),this.B)):(this.B=1/s,this.A=this.k0,this.E=a=h=1),y||x?(y?(u=Math.asin(Math.sin(_)/a),x||(c=_)):(u=c,_=Math.asin(a*Math.sin(u))),this.lam0=M-Math.asin(.5*(h-1/h)*Math.tan(u))/this.B):(e=Math.pow(Xt(this.e,p,Math.sin(p)),this.B),n=Math.pow(Xt(this.e,m,Math.sin(m)),this.B),h=this.E/e,o=(n-e)/(n+e),l=((l=this.E*this.E)-n*e)/(l+n*e),(t=f-d)<-Math.pi?d-=Ct:t>Math.pi&&(d+=Ct),this.lam0=Ht(.5*(f+d)-Math.atan(l*Math.tan(.5*this.B*(f-d))/o)/this.B),u=Math.atan(2*Math.sin(this.B*Ht(f-this.lam0))/(h-1/h)),c=_=Math.asin(a*Math.sin(u))),this.singam=Math.sin(u),this.cosgam=Math.cos(u),this.sinrot=Math.sin(c),this.cosrot=Math.cos(c),this.rB=1/this.B,this.ArB=this.A*this.rB,this.BrA=1/this.ArB,this.no_off?this.u_0=0:(this.u_0=Math.abs(this.ArB*Math.atan(Math.sqrt(a*a-1)/Math.cos(_))),this.lat0<0&&(this.u_0=-this.u_0)),h=.5*u,this.v_pole_n=this.ArB*Math.log(Math.tan(Et-h)),this.v_pole_s=this.ArB*Math.log(Math.tan(Et+h))},forward:function(t){var s,i,a,h,e,n,r,o,l={};if(t.x=t.x-this.lam0,Math.abs(Math.abs(t.y)-xt)>wt){if(e=this.E/Math.pow(Xt(this.e,t.y,Math.sin(t.y)),this.B),n=1/e,s=.5*(e-n),i=.5*(e+n),h=Math.sin(this.B*t.x),a=(s*this.singam-h*this.cosgam)/i,Math.abs(Math.abs(a)-1)0?this.v_pole_n:this.v_pole_s,r=this.ArB*t.y;return this.no_rot?(l.x=r,l.y=o):(r-=this.u_0,l.x=o*this.cosrot+r*this.sinrot,l.y=r*this.cosrot-o*this.sinrot),l.x=this.a*l.x+this.x0,l.y=this.a*l.y+this.y0,l},inverse:function(t){var s,i,a,h,e,n,r,o={};if(t.x=(t.x-this.x0)*(1/this.a),t.y=(t.y-this.y0)*(1/this.a),this.no_rot?(i=t.y,s=t.x):(i=t.x*this.cosrot-t.y*this.sinrot,s=t.y*this.cosrot+t.x*this.sinrot+this.u_0),a=Math.exp(-this.BrA*i),h=.5*(a-1/a),e=.5*(a+1/a),n=Math.sin(this.BrA*s),r=(n*this.cosgam+h*this.singam)/e,Math.abs(Math.abs(r)-1)wt?this.ns=Math.log(a/r)/Math.log(h/o):this.ns=s,isNaN(this.ns)&&(this.ns=s),this.f0=a/(this.ns*Math.pow(h,this.ns)),this.rh=this.a*this.f0*Math.pow(l,this.ns),this.title||(this.title=\"Lambert Conformal Conic\")}},forward:function(t){var s=t.x,i=t.y;Math.abs(2*Math.abs(i)-Math.PI)<=wt&&(i=Wt(i)*(xt-2*wt));var a,h,e=Math.abs(Math.abs(i)-xt);if(e>wt)a=Xt(this.e,i,Math.sin(i)),h=this.a*this.f0*Math.pow(a,this.ns);else{if((e=i*this.ns)<=0)return null;h=0}var n=this.ns*Ht(s-this.long0);return t.x=this.k0*(h*Math.sin(n))+this.x0,t.y=this.k0*(this.rh-h*Math.cos(n))+this.y0,t},inverse:function(t){var s,i,a,h,e,n=(t.x-this.x0)/this.k0,r=this.rh-(t.y-this.y0)/this.k0;this.ns>0?(s=Math.sqrt(n*n+r*r),i=1):(s=-Math.sqrt(n*n+r*r),i=-1);var o=0;if(0!==s&&(o=Math.atan2(i*n,i*r)),0!==s||this.ns>0){if(i=1/this.ns,a=Math.pow(s/(this.a*this.f0),i),-9999===(h=Jt(this.e,a)))return null}else h=-xt;return e=Ht(o/this.ns+this.long0),t.x=e,t.y=h,t},names:[\"Lambert Tangential Conformal Conic Projection\",\"Lambert_Conformal_Conic\",\"Lambert_Conformal_Conic_1SP\",\"Lambert_Conformal_Conic_2SP\",\"lcc\",\"Lambert Conic Conformal (1SP)\",\"Lambert Conic Conformal (2SP)\"]},Ds={init:function(){this.a=6377397.155,this.es=.006674372230614,this.e=Math.sqrt(this.es),this.lat0||(this.lat0=.863937979737193),this.long0||(this.long0=.4334234309119251),this.k0||(this.k0=.9999),this.s45=.785398163397448,this.s90=2*this.s45,this.fi0=this.lat0,this.e2=this.es,this.e=Math.sqrt(this.e2),this.alfa=Math.sqrt(1+this.e2*Math.pow(Math.cos(this.fi0),4)/(1-this.e2)),this.uq=1.04216856380474,this.u0=Math.asin(Math.sin(this.fi0)/this.alfa),this.g=Math.pow((1+this.e*Math.sin(this.fi0))/(1-this.e*Math.sin(this.fi0)),this.alfa*this.e/2),this.k=Math.tan(this.u0/2+this.s45)/Math.pow(Math.tan(this.fi0/2+this.s45),this.alfa)*this.g,this.k1=this.k0,this.n0=this.a*Math.sqrt(1-this.e2)/(1-this.e2*Math.pow(Math.sin(this.fi0),2)),this.s0=1.37008346281555,this.n=Math.sin(this.s0),this.ro0=this.k1*this.n0/Math.tan(this.s0),this.ad=this.s90-this.uq},forward:function(t){var s,i,a,h,e,n,r,o=t.x,l=t.y,u=Ht(o-this.long0);return s=Math.pow((1+this.e*Math.sin(l))/(1-this.e*Math.sin(l)),this.alfa*this.e/2),i=2*(Math.atan(this.k*Math.pow(Math.tan(l/2+this.s45),this.alfa)/s)-this.s45),a=-u*this.alfa,h=Math.asin(Math.cos(this.ad)*Math.sin(i)+Math.sin(this.ad)*Math.cos(i)*Math.cos(a)),e=Math.asin(Math.cos(i)*Math.sin(a)/Math.cos(h)),n=this.n*e,r=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(h/2+this.s45),this.n),t.y=r*Math.cos(n)/1,t.x=r*Math.sin(n)/1,this.czech||(t.y*=-1,t.x*=-1),t},inverse:function(t){var s,i,a,h,e,n,r,o=t.x;t.x=t.y,t.y=o,this.czech||(t.y*=-1,t.x*=-1),e=Math.sqrt(t.x*t.x+t.y*t.y),h=Math.atan2(t.y,t.x)/Math.sin(this.s0),a=2*(Math.atan(Math.pow(this.ro0/e,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),s=Math.asin(Math.cos(this.ad)*Math.sin(a)-Math.sin(this.ad)*Math.cos(a)*Math.cos(h)),i=Math.asin(Math.cos(a)*Math.sin(h)/Math.cos(s)),t.x=this.long0-i/this.alfa,n=s,r=0;var l=0;do{t.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(s/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(n))/(1-this.e*Math.sin(n)),this.e/2))-this.s45),Math.abs(n-t.y)<1e-10&&(r=1),n=t.y,l+=1}while(0===r&&l<15);return l>=15?null:t},names:[\"Krovak\",\"krovak\"]},Us=function(t,s,i,a,h){return t*h-s*Math.sin(2*h)+i*Math.sin(4*h)-a*Math.sin(6*h)},Qs=function(t){return 1-.25*t*(1+t/16*(3+1.25*t))},Ws=function(t){return.375*t*(1+.25*t*(1+.46875*t))},Hs=function(t){return.05859375*t*t*(1+.75*t)},Xs=function(t){return t*t*t*(35/3072)},Js=function(t,s,i){var a=s*i;return t/Math.sqrt(1-a*a)},Ks=function(t){return Math.abs(t)1e-7?(i=t*s,(1-t*t)*(s/(1-i*i)-.5/t*Math.log((1-i)/(1+i)))):2*s},$s=.3333333333333333,ti=.17222222222222222,si=.10257936507936508,ii=.06388888888888888,ai=.0664021164021164,hi=.016415012942191543,ei={init:function(){var t=Math.abs(this.lat0);if(Math.abs(t-xt)0){var s;switch(this.qp=Ys(this.e,1),this.mmf=.5/(1-this.es),this.apa=ot(this.es),this.mode){case this.N_POLE:case this.S_POLE:this.dd=1;break;case this.EQUIT:this.rq=Math.sqrt(.5*this.qp),this.dd=1/this.rq,this.xmf=1,this.ymf=.5*this.qp;break;case this.OBLIQ:this.rq=Math.sqrt(.5*this.qp),s=Math.sin(this.lat0),this.sinb1=Ys(this.e,s)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*s*s)*this.rq*this.cosb1),this.ymf=(this.xmf=this.rq)/this.dd,this.xmf*=this.dd}}else this.mode===this.OBLIQ&&(this.sinph0=Math.sin(this.lat0),this.cosph0=Math.cos(this.lat0))},forward:function(t){var s,i,a,h,e,n,r,o,l,u,c=t.x,M=t.y;if(c=Ht(c-this.long0),this.sphere){if(e=Math.sin(M),u=Math.cos(M),a=Math.cos(c),this.mode===this.OBLIQ||this.mode===this.EQUIT){if((i=this.mode===this.EQUIT?1+u*a:1+this.sinph0*e+this.cosph0*u*a)<=wt)return null;s=(i=Math.sqrt(2/i))*u*Math.sin(c),i*=this.mode===this.EQUIT?e:this.cosph0*e-this.sinph0*u*a}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(a=-a),Math.abs(M+this.lat0)=0?(s=(l=Math.sqrt(n))*h,i=a*(this.mode===this.S_POLE?l:-l)):s=i=0}}return t.x=this.a*s+this.x0,t.y=this.a*i+this.y0,t},inverse:function(t){t.x-=this.x0,t.y-=this.y0;var s,i,a,h,e,n,r,o=t.x/this.a,l=t.y/this.a;if(this.sphere){var u,c=0,M=0;if(u=Math.sqrt(o*o+l*l),(i=.5*u)>1)return null;switch(i=2*Math.asin(i),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(M=Math.sin(i),c=Math.cos(i)),this.mode){case this.EQUIT:i=Math.abs(u)<=wt?0:Math.asin(l*M/u),o*=M,l=c*u;break;case this.OBLIQ:i=Math.abs(u)<=wt?this.lat0:Math.asin(c*this.sinph0+l*M*this.cosph0/u),o*=M*this.cosph0,l=(c-Math.sin(i)*this.sinph0)*u;break;case this.N_POLE:l=-l,i=xt-i;break;case this.S_POLE:i-=xt}s=0!==l||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(o,l):0}else{if(r=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(o/=this.dd,l*=this.dd,(n=Math.sqrt(o*o+l*l))1&&(t=t>1?1:-1),Math.asin(t)},ri={init:function(){Math.abs(this.lat1+this.lat2)wt?this.ns0=(this.ms1*this.ms1-this.ms2*this.ms2)/(this.qs2-this.qs1):this.ns0=this.con,this.c=this.ms1*this.ms1+this.ns0*this.qs1,this.rh=this.a*Math.sqrt(this.c-this.ns0*this.qs0)/this.ns0)},forward:function(t){var s=t.x,i=t.y;this.sin_phi=Math.sin(i),this.cos_phi=Math.cos(i);var a=Ys(this.e3,this.sin_phi),h=this.a*Math.sqrt(this.c-this.ns0*a)/this.ns0,e=this.ns0*Ht(s-this.long0),n=h*Math.sin(e)+this.x0,r=this.rh-h*Math.cos(e)+this.y0;return t.x=n,t.y=r,t},inverse:function(t){var s,i,a,h,e,n;return t.x-=this.x0,t.y=this.rh-t.y+this.y0,this.ns0>=0?(s=Math.sqrt(t.x*t.x+t.y*t.y),a=1):(s=-Math.sqrt(t.x*t.x+t.y*t.y),a=-1),h=0,0!==s&&(h=Math.atan2(a*t.x,a*t.y)),a=s*this.ns0/this.a,this.sphere?n=Math.asin((this.c-a*a)/(2*this.ns0)):(i=(this.c-a*a)/this.ns0,n=this.phi1z(this.e3,i)),e=Ht(h/this.ns0+this.long0),t.x=e,t.y=n,t},names:[\"Albers_Conic_Equal_Area\",\"Albers\",\"aea\"],phi1z:function(t,s){var i,a,h,e,n,r=ni(.5*s);if(t0||Math.abs(e)<=wt?(n=this.x0+1*this.a*i*Math.sin(a)/e,r=this.y0+1*this.a*(this.cos_p14*s-this.sin_p14*i*h)/e):(n=this.x0+this.infinity_dist*i*Math.sin(a),r=this.y0+this.infinity_dist*(this.cos_p14*s-this.sin_p14*i*h)),t.x=n,t.y=r,t},inverse:function(t){var s,i,a,h,e,n;return t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,t.x/=this.k0,t.y/=this.k0,(s=Math.sqrt(t.x*t.x+t.y*t.y))?(h=Math.atan2(s,this.rc),i=Math.sin(h),a=Math.cos(h),n=ni(a*this.sin_p14+t.y*i*this.cos_p14/s),e=Math.atan2(t.x*i,s*this.cos_p14*a-t.y*this.sin_p14*i),e=Ht(this.long0+e)):(n=this.phic0,e=0),t.x=e,t.y=n,t},names:[\"gnom\"]},li=function(t,s){var i=1-(1-t*t)/(2*t)*Math.log((1-t)/(1+t));if(Math.abs(Math.abs(s)-i)<1e-6)return s<0?-1*xt:xt;for(var a,h,e,n,r=Math.asin(.5*s),o=0;o<30;o++)if(h=Math.sin(r),e=Math.cos(r),n=t*h,a=Math.pow(1-n*n,2)/(2*e)*(s/(1-t*t)-h/(1-n*n)+.5/t*Math.log((1-n)/(1+n))),r+=a,Math.abs(a)<=1e-10)return r;return NaN},ui={init:function(){this.sphere||(this.k0=Qt(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))},forward:function(t){var s,i,a=t.x,h=t.y,e=Ht(a-this.long0);if(this.sphere)s=this.x0+this.a*e*Math.cos(this.lat_ts),i=this.y0+this.a*Math.sin(h)/Math.cos(this.lat_ts);else{var n=Ys(this.e,Math.sin(h));s=this.x0+this.a*this.k0*e,i=this.y0+this.a*n*.5/this.k0}return t.x=s,t.y=i,t},inverse:function(t){t.x-=this.x0,t.y-=this.y0;var s,i;return this.sphere?(s=Ht(this.long0+t.x/this.a/Math.cos(this.lat_ts)),i=Math.asin(t.y/this.a*Math.cos(this.lat_ts))):(i=li(this.e,2*t.y*this.k0/this.a),s=Ht(this.long0+t.x/(this.a*this.k0))),t.x=s,t.y=i,t},names:[\"cea\"]},ci={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||\"Equidistant Cylindrical (Plate Carre)\",this.rc=Math.cos(this.lat_ts)},forward:function(t){var s=t.x,i=t.y,a=Ht(s-this.long0),h=Ks(i-this.lat0);return t.x=this.x0+this.a*a*this.rc,t.y=this.y0+this.a*h,t},inverse:function(t){var s=t.x,i=t.y;return t.x=Ht(this.long0+(s-this.x0)/(this.a*this.rc)),t.y=Ks(this.lat0+(i-this.y0)/this.a),t},names:[\"Equirectangular\",\"Equidistant_Cylindrical\",\"eqc\"]},Mi=20,fi={init:function(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=Qs(this.es),this.e1=Ws(this.es),this.e2=Hs(this.es),this.e3=Xs(this.es),this.ml0=this.a*Us(this.e0,this.e1,this.e2,this.e3,this.lat0)},forward:function(t){var s,i,a,h=t.x,e=t.y,n=Ht(h-this.long0);if(a=n*Math.sin(e),this.sphere)Math.abs(e)<=wt?(s=this.a*n,i=-1*this.a*this.lat0):(s=this.a*Math.sin(a)/Math.tan(e),i=this.a*(Ks(e-this.lat0)+(1-Math.cos(a))/Math.tan(e)));else if(Math.abs(e)<=wt)s=this.a*n,i=-1*this.ml0;else{var r=Js(this.a,this.e,Math.sin(e))/Math.tan(e);s=r*Math.sin(a),i=this.a*Us(this.e0,this.e1,this.e2,this.e3,e)-this.ml0+r*(1-Math.cos(a))}return t.x=s+this.x0,t.y=i+this.y0,t},inverse:function(t){var s,i,a,h,e,n,r,o,l;if(a=t.x-this.x0,h=t.y-this.y0,this.sphere)if(Math.abs(h+this.a*this.lat0)<=wt)s=Ht(a/this.a+this.long0),i=0;else{n=this.lat0+h/this.a,r=a*a/this.a/this.a+n*n,o=n;var u;for(e=Mi;e;--e)if(u=Math.tan(o),l=-1*(n*(o*u+1)-o-.5*(o*o+r)*u)/((o-n)/u-1),o+=l,Math.abs(l)<=wt){i=o;break}s=Ht(this.long0+Math.asin(a*Math.tan(o)/this.a)/Math.sin(i))}else if(Math.abs(h+this.ml0)<=wt)i=0,s=Ht(this.long0+a/this.a);else{n=(this.ml0+h)/this.a,r=a*a/this.a/this.a+n*n,o=n;var c,M,f,d,p;for(e=Mi;e;--e)if(p=this.e*Math.sin(o),c=Math.sqrt(1-p*p)*Math.tan(o),M=this.a*Us(this.e0,this.e1,this.e2,this.e3,o),f=this.e0-2*this.e1*Math.cos(2*o)+4*this.e2*Math.cos(4*o)-6*this.e3*Math.cos(6*o),d=M/this.a,l=(n*(c*d+1)-d-.5*c*(d*d+r))/(this.es*Math.sin(2*o)*(d*d+r-2*n*d)/(4*c)+(n-d)*(c*f-2/Math.sin(2*o))-f),o-=l,Math.abs(l)<=wt){i=o;break}c=Math.sqrt(1-this.es*Math.pow(Math.sin(i),2))*Math.tan(i),s=Ht(this.long0+Math.asin(a*c/this.a)/Math.sin(i))}return t.x=s,t.y=i,t},names:[\"Polyconic\",\"poly\"]},di={init:function(){this.A=[],this.A[1]=.6399175073,this.A[2]=-.1358797613,this.A[3]=.063294409,this.A[4]=-.02526853,this.A[5]=.0117879,this.A[6]=-.0055161,this.A[7]=.0026906,this.A[8]=-.001333,this.A[9]=67e-5,this.A[10]=-34e-5,this.B_re=[],this.B_im=[],this.B_re[1]=.7557853228,this.B_im[1]=0,this.B_re[2]=.249204646,this.B_im[2]=.003371507,this.B_re[3]=-.001541739,this.B_im[3]=.04105856,this.B_re[4]=-.10162907,this.B_im[4]=.01727609,this.B_re[5]=-.26623489,this.B_im[5]=-.36249218,this.B_re[6]=-.6870983,this.B_im[6]=-1.1651967,this.C_re=[],this.C_im=[],this.C_re[1]=1.3231270439,this.C_im[1]=0,this.C_re[2]=-.577245789,this.C_im[2]=-.007809598,this.C_re[3]=.508307513,this.C_im[3]=-.112208952,this.C_re[4]=-.15094762,this.C_im[4]=.18200602,this.C_re[5]=1.01418179,this.C_im[5]=1.64497696,this.C_re[6]=1.9660549,this.C_im[6]=2.5127645,this.D=[],this.D[1]=1.5627014243,this.D[2]=.5185406398,this.D[3]=-.03333098,this.D[4]=-.1052906,this.D[5]=-.0368594,this.D[6]=.007317,this.D[7]=.0122,this.D[8]=.00394,this.D[9]=-.0013},forward:function(t){var s,i=t.x,a=t.y-this.lat0,h=i-this.long0,e=a/yt*1e-5,n=h,r=1,o=0;for(s=1;s<=10;s++)r*=e,o+=this.A[s]*r;var l,u=o,c=n,M=1,f=0,d=0,p=0;for(s=1;s<=6;s++)l=f*u+M*c,M=M*u-f*c,f=l,d=d+this.B_re[s]*M-this.B_im[s]*f,p=p+this.B_im[s]*M+this.B_re[s]*f;return t.x=p*this.a+this.x0,t.y=d*this.a+this.y0,t},inverse:function(t){var s,i,a=t.x,h=t.y,e=a-this.x0,n=(h-this.y0)/this.a,r=e/this.a,o=1,l=0,u=0,c=0;for(s=1;s<=6;s++)i=l*n+o*r,o=o*n-l*r,l=i,u=u+this.C_re[s]*o-this.C_im[s]*l,c=c+this.C_im[s]*o+this.C_re[s]*l;for(var M=0;M.999999999999&&(i=.999999999999),s=Math.asin(i);var a=Ht(this.long0+t.x/(.900316316158*this.a*Math.cos(s)));a<-Math.PI&&(a=-Math.PI),a>Math.PI&&(a=Math.PI),i=(2*s+Math.sin(2*s))/Math.PI,Math.abs(i)>1&&(i=1);var h=Math.asin(i);return t.x=a,t.y=h,t},names:[\"Mollweide\",\"moll\"]},xi={init:function(){Math.abs(this.lat1+this.lat2)=0?(i=Math.sqrt(t.x*t.x+t.y*t.y),s=1):(i=-Math.sqrt(t.x*t.x+t.y*t.y),s=-1);var e=0;if(0!==i&&(e=Math.atan2(s*t.x,s*t.y)),this.sphere)return h=Ht(this.long0+e/this.ns),a=Ks(this.g-i/this.a),t.x=h,t.y=a,t;var n=this.g-i/this.a;return a=Vs(n,this.e0,this.e1,this.e2,this.e3),h=Ht(this.long0+e/this.ns),t.x=h,t.y=a,t},names:[\"Equidistant_Conic\",\"eqdc\"]},gi={init:function(){this.R=this.a},forward:function(t){var s,i,a=t.x,h=t.y,e=Ht(a-this.long0);Math.abs(h)<=wt&&(s=this.x0+this.R*e,i=this.y0);var n=ni(2*Math.abs(h/Math.PI));(Math.abs(e)<=wt||Math.abs(Math.abs(h)-xt)<=wt)&&(s=this.x0,i=h>=0?this.y0+Math.PI*this.R*Math.tan(.5*n):this.y0+Math.PI*this.R*-Math.tan(.5*n));var r=.5*Math.abs(Math.PI/e-e/Math.PI),o=r*r,l=Math.sin(n),u=Math.cos(n),c=u/(l+u-1),M=c*c,f=c*(2/l-1),d=f*f,p=Math.PI*this.R*(r*(c-d)+Math.sqrt(o*(c-d)*(c-d)-(d+o)*(M-d)))/(d+o);e<0&&(p=-p),s=this.x0+p;var m=o+c;return p=Math.PI*this.R*(f*m-r*Math.sqrt((d+o)*(o+1)-m*m))/(d+o),i=h>=0?this.y0+p:this.y0-p,t.x=s,t.y=i,t},inverse:function(t){var s,i,a,h,e,n,r,o,l,u,c,M,f;return t.x-=this.x0,t.y-=this.y0,c=Math.PI*this.R,a=t.x/c,h=t.y/c,e=a*a+h*h,n=-Math.abs(h)*(1+e),r=n-2*h*h+a*a,o=-2*n+1+2*h*h+e*e,f=h*h/o+(2*r*r*r/o/o/o-9*n*r/o/o)/27,l=(n-r*r/3/o)/o,u=2*Math.sqrt(-l/3),c=3*f/l/u,Math.abs(c)>1&&(c=c>=0?1:-1),M=Math.acos(c)/3,i=t.y>=0?(-u*Math.cos(M+Math.PI/3)-r/3/o)*Math.PI:-(-u*Math.cos(M+Math.PI/3)-r/3/o)*Math.PI,s=Math.abs(a)2*xt*this.a)return;return i=s/this.a,a=Math.sin(i),h=Math.cos(i),e=this.long0,Math.abs(s)<=wt?n=this.lat0:(n=ni(h*this.sin_p12+t.y*a*this.cos_p12/s),r=Math.abs(this.lat0)-xt,e=Ht(Math.abs(r)<=wt?this.lat0>=0?this.long0+Math.atan2(t.x,-t.y):this.long0-Math.atan2(-t.x,t.y):this.long0+Math.atan2(t.x*a,s*this.cos_p12*h-t.y*this.sin_p12*a))),t.x=e,t.y=n,t}return o=Qs(this.es),l=Ws(this.es),u=Hs(this.es),c=Xs(this.es),Math.abs(this.sin_p12-1)<=wt?(M=this.a*Us(o,l,u,c,xt),s=Math.sqrt(t.x*t.x+t.y*t.y),f=M-s,n=Vs(f/this.a,o,l,u,c),e=Ht(this.long0+Math.atan2(t.x,-1*t.y)),t.x=e,t.y=n,t):Math.abs(this.sin_p12+1)<=wt?(M=this.a*Us(o,l,u,c,xt),s=Math.sqrt(t.x*t.x+t.y*t.y),f=s-M,n=Vs(f/this.a,o,l,u,c),e=Ht(this.long0+Math.atan2(t.x,t.y)),t.x=e,t.y=n,t):(s=Math.sqrt(t.x*t.x+t.y*t.y),m=Math.atan2(t.x,t.y),d=Js(this.a,this.e,this.sin_p12),_=Math.cos(m),y=this.e*this.cos_p12*_,x=-y*y/(1-this.es),g=3*this.es*(1-x)*this.sin_p12*this.cos_p12*_/(1-this.es),v=s/d,b=v-x*(1+x)*Math.pow(v,3)/6-g*(1+3*x)*Math.pow(v,4)/24,w=1-x*b*b/2-v*b*b*b/6,p=Math.asin(this.sin_p12*Math.cos(b)+this.cos_p12*Math.sin(b)*_),e=Ht(this.long0+Math.asin(Math.sin(m)*Math.sin(b)/Math.cos(p))),N=Math.sin(p),n=Math.atan2((N-this.es*w*this.sin_p12)*Math.tan(p),N*(1-this.es)),t.x=e,t.y=n,t)},names:[\"Azimuthal_Equidistant\",\"aeqd\"]},bi={init:function(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)},forward:function(t){var s,i,a,h,e,n,r,o=t.x,l=t.y;return a=Ht(o-this.long0),s=Math.sin(l),i=Math.cos(l),h=Math.cos(a),((e=this.sin_p14*s+this.cos_p14*i*h)>0||Math.abs(e)<=wt)&&(n=1*this.a*i*Math.sin(a),r=this.y0+1*this.a*(this.cos_p14*s-this.sin_p14*i*h)),t.x=n,t.y=r,t},inverse:function(t){var s,i,a,h,e,n,r;return t.x-=this.x0,t.y-=this.y0,s=Math.sqrt(t.x*t.x+t.y*t.y),i=ni(s/this.a),a=Math.sin(i),h=Math.cos(i),n=this.long0,Math.abs(s)<=wt?(r=this.lat0,t.x=n,t.y=r,t):(r=ni(h*this.sin_p14+t.y*a*this.cos_p14/s),e=Math.abs(this.lat0)-xt,Math.abs(e)<=wt?(n=Ht(this.lat0>=0?this.long0+Math.atan2(t.x,-t.y):this.long0-Math.atan2(-t.x,t.y)),t.x=n,t.y=r,t):(n=Ht(this.long0+Math.atan2(t.x*a,s*this.cos_p14*h-t.y*this.sin_p14*a)),t.x=n,t.y=r,t))},names:[\"ortho\"]},wi={FRONT:1,RIGHT:2,BACK:3,LEFT:4,TOP:5,BOTTOM:6},Ni={AREA_0:1,AREA_1:2,AREA_2:3,AREA_3:4},Ai={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.lat0=this.lat0||0,this.long0=this.long0||0,this.lat_ts=this.lat_ts||0,this.title=this.title||\"Quadrilateralized Spherical Cube\",this.lat0>=xt-Et/2?this.face=wi.TOP:this.lat0<=-(xt-Et/2)?this.face=wi.BOTTOM:Math.abs(this.long0)<=Et?this.face=wi.FRONT:Math.abs(this.long0)<=xt+Et?this.face=this.long0>0?wi.RIGHT:wi.LEFT:this.face=wi.BACK,0!==this.es&&(this.one_minus_f=1-(this.a-this.b)/this.a,this.one_minus_f_squared=this.one_minus_f*this.one_minus_f)},forward:function(t){var s,i,a,h,e,n,r={x:0,y:0},o={value:0};if(t.x-=this.long0,s=0!==this.es?Math.atan(this.one_minus_f_squared*Math.tan(t.y)):t.y,i=t.x,this.face===wi.TOP)h=xt-s,i>=Et&&i<=xt+Et?(o.value=Ni.AREA_0,a=i-xt):i>xt+Et||i<=-(xt+Et)?(o.value=Ni.AREA_1,a=i>0?i-Pt:i+Pt):i>-(xt+Et)&&i<=-Et?(o.value=Ni.AREA_2,a=i+xt):(o.value=Ni.AREA_3,a=i);else if(this.face===wi.BOTTOM)h=xt+s,i>=Et&&i<=xt+Et?(o.value=Ni.AREA_0,a=-i+xt):i=-Et?(o.value=Ni.AREA_1,a=-i):i<-Et&&i>=-(xt+Et)?(o.value=Ni.AREA_2,a=-i-xt):(o.value=Ni.AREA_3,a=i>0?-i+Pt:-i-Pt);else{var l,u,c,M,f,d;this.face===wi.RIGHT?i=ct(i,+xt):this.face===wi.BACK?i=ct(i,+Pt):this.face===wi.LEFT&&(i=ct(i,-xt)),M=Math.sin(s),f=Math.cos(s),d=Math.sin(i),l=f*Math.cos(i),u=f*d,c=M,this.face===wi.FRONT?a=ut(h=Math.acos(l),c,u,o):this.face===wi.RIGHT?a=ut(h=Math.acos(u),c,-l,o):this.face===wi.BACK?a=ut(h=Math.acos(-l),c,-u,o):this.face===wi.LEFT?a=ut(h=Math.acos(-u),c,l,o):(h=a=0,o.value=Ni.AREA_0)}return n=Math.atan(12/Pt*(a+Math.acos(Math.sin(a)*Math.cos(Et))-xt)),e=Math.sqrt((1-Math.cos(h))/(Math.cos(n)*Math.cos(n))/(1-Math.cos(Math.atan(1/Math.cos(a))))),o.value===Ni.AREA_1?n+=xt:o.value===Ni.AREA_2?n+=Pt:o.value===Ni.AREA_3&&(n+=1.5*Pt),r.x=e*Math.cos(n),r.y=e*Math.sin(n),r.x=r.x*this.a+this.x0,r.y=r.y*this.a+this.y0,t.x=r.x,t.y=r.y,t},inverse:function(t){var s,i,a,h,e,n,r,o,l,u={lam:0,phi:0},c={value:0};if(t.x=(t.x-this.x0)/this.a,t.y=(t.y-this.y0)/this.a,i=Math.atan(Math.sqrt(t.x*t.x+t.y*t.y)),s=Math.atan2(t.y,t.x),t.x>=0&&t.x>=Math.abs(t.y)?c.value=Ni.AREA_0:t.y>=0&&t.y>=Math.abs(t.x)?(c.value=Ni.AREA_1,s-=xt):t.x<0&&-t.x>=Math.abs(t.y)?(c.value=Ni.AREA_2,s=s<0?s+Pt:s-Pt):(c.value=Ni.AREA_3,s+=xt),l=Pt/12*Math.tan(s),e=Math.sin(l)/(Math.cos(l)-1/Math.sqrt(2)),n=Math.atan(e),a=Math.cos(s),h=Math.tan(i),(r=1-a*a*h*h*(1-Math.cos(Math.atan(1/Math.cos(n)))))<-1?r=-1:r>1&&(r=1),this.face===wi.TOP)o=Math.acos(r),u.phi=xt-o,c.value===Ni.AREA_0?u.lam=n+xt:c.value===Ni.AREA_1?u.lam=n<0?n+Pt:n-Pt:c.value===Ni.AREA_2?u.lam=n-xt:u.lam=n;else if(this.face===wi.BOTTOM)o=Math.acos(r),u.phi=o-xt,c.value===Ni.AREA_0?u.lam=-n+xt:c.value===Ni.AREA_1?u.lam=-n:c.value===Ni.AREA_2?u.lam=-n-xt:u.lam=n<0?-n-Pt:-n+Pt;else{var M,f,d;l=(M=r)*M,f=(l+=(d=l>=1?0:Math.sqrt(1-l)*Math.sin(n))*d)>=1?0:Math.sqrt(1-l),c.value===Ni.AREA_1?(l=f,f=-d,d=l):c.value===Ni.AREA_2?(f=-f,d=-d):c.value===Ni.AREA_3&&(l=f,f=d,d=-l),this.face===wi.RIGHT?(l=M,M=-f,f=l):this.face===wi.BACK?(M=-M,f=-f):this.face===wi.LEFT&&(l=M,M=f,f=-l),u.phi=Math.acos(-d)-xt,u.lam=Math.atan2(f,M),this.face===wi.RIGHT?u.lam=ct(u.lam,-xt):this.face===wi.BACK?u.lam=ct(u.lam,-Pt):this.face===wi.LEFT&&(u.lam=ct(u.lam,+xt))}if(0!==this.es){var p,m,_;p=u.phi<0?1:0,m=Math.tan(u.phi),_=this.b/Math.sqrt(m*m+this.one_minus_f_squared),u.phi=Math.atan(Math.sqrt(this.a*this.a-_*_)/(this.one_minus_f*_)),p&&(u.phi=-u.phi)}return u.lam+=this.long0,t.x=u.lam,t.y=u.phi,t},names:[\"Quadrilateralized Spherical Cube\",\"Quadrilateralized_Spherical_Cube\",\"qsc\"]},Ei=[[1,2.2199e-17,-715515e-10,31103e-10],[.9986,-482243e-9,-24897e-9,-13309e-10],[.9954,-83103e-8,-448605e-10,-9.86701e-7],[.99,-.00135364,-59661e-9,36777e-10],[.9822,-.00167442,-449547e-11,-572411e-11],[.973,-.00214868,-903571e-10,1.8736e-8],[.96,-.00305085,-900761e-10,164917e-11],[.9427,-.00382792,-653386e-10,-26154e-10],[.9216,-.00467746,-10457e-8,481243e-11],[.8962,-.00536223,-323831e-10,-543432e-11],[.8679,-.00609363,-113898e-9,332484e-11],[.835,-.00698325,-640253e-10,9.34959e-7],[.7986,-.00755338,-500009e-10,9.35324e-7],[.7597,-.00798324,-35971e-9,-227626e-11],[.7186,-.00851367,-701149e-10,-86303e-10],[.6732,-.00986209,-199569e-9,191974e-10],[.6213,-.010418,883923e-10,624051e-11],[.5722,-.00906601,182e-6,624051e-11],[.5322,-.00677797,275608e-9,624051e-11]],Ci=[[-5.20417e-18,.0124,1.21431e-18,-8.45284e-11],[.062,.0124,-1.26793e-9,4.22642e-10],[.124,.0124,5.07171e-9,-1.60604e-9],[.186,.0123999,-1.90189e-8,6.00152e-9],[.248,.0124002,7.10039e-8,-2.24e-8],[.31,.0123992,-2.64997e-7,8.35986e-8],[.372,.0124029,9.88983e-7,-3.11994e-7],[.434,.0123893,-369093e-11,-4.35621e-7],[.4958,.0123198,-102252e-10,-3.45523e-7],[.5571,.0121916,-154081e-10,-5.82288e-7],[.6176,.0119938,-241424e-10,-5.25327e-7],[.6769,.011713,-320223e-10,-5.16405e-7],[.7346,.0113541,-397684e-10,-6.09052e-7],[.7903,.0109107,-489042e-10,-104739e-11],[.8435,.0103431,-64615e-9,-1.40374e-9],[.8936,.00969686,-64636e-9,-8547e-9],[.9394,.00840947,-192841e-9,-42106e-10],[.9761,.00616527,-256e-6,-42106e-10],[1,.00328947,-319159e-9,-42106e-10]],Pi=.8487,Si=1.3523,Ii=At/5,Oi=1/Ii,ki=18,qi=function(t,s){return t[0]+s*(t[1]+s*(t[2]+s*t[3]))},Ri=function(t,s){return t[1]+s*(2*t[2]+3*s*t[3])},Li={init:function(){this.x0=this.x0||0,this.y0=this.y0||0,this.long0=this.long0||0,this.es=0,this.title=this.title||\"Robinson\"},forward:function(t){var s=Ht(t.x-this.long0),i=Math.abs(t.y),a=Math.floor(i*Ii);a<0?a=0:a>=ki&&(a=ki-1),i=At*(i-Oi*a);var h={x:qi(Ei[a],i)*s,y:qi(Ci[a],i)};return t.y<0&&(h.y=-h.y),h.x=h.x*this.a*Pi+this.x0,h.y=h.y*this.a*Si+this.y0,h},inverse:function(t){var s={x:(t.x-this.x0)/(this.a*Pi),y:Math.abs(t.y-this.y0)/(this.a*Si)};if(s.y>=1)s.x/=Ei[ki][0],s.y=t.y<0?-xt:xt;else{var i=Math.floor(s.y*ki);for(i<0?i=0:i>=ki&&(i=ki-1);;)if(Ci[i][0]>s.y)--i;else{if(!(Ci[i+1][0]<=s.y))break;++i}var a=Ci[i],h=5*(s.y-a[0])/(Ci[i+1][0]-a[0]);h=Mt(function(t){return(qi(a,t)-s.y)/Ri(a,t)},h,wt,100),s.x/=qi(Ei[i],h),s.y=(5*i+h)*Nt,t.y<0&&(s.y=-s.y)}return s.x=Ht(s.x+this.long0),s},names:[\"Robinson\",\"robin\"]},Ti={init:function(){this.name=\"geocent\"},forward:function(t){return k(t,this.es,this.a)},inverse:function(t){return q(t,this.es,this.a,this.b)},names:[\"Geocentric\",\"geocentric\",\"geocent\",\"Geocent\"]},Gi={N_POLE:0,S_POLE:1,EQUIT:2,OBLIQ:3},ji={h:{def:1e5,num:!0},azi:{def:0,num:!0,degrees:!0},tilt:{def:0,num:!0,degrees:!0},long0:{def:0,num:!0},lat0:{def:0,num:!0}},Bi={init:function(){if(Object.keys(ji).forEach(function(t){if(void 0===this[t])this[t]=ji[t].def;else{if(ji[t].num&&isNaN(this[t]))throw new Error(\"Invalid parameter value, must be numeric \"+t+\" = \"+this[t]);ji[t].num&&(this[t]=parseFloat(this[t]))}ji[t].degrees&&(this[t]=this[t]*Nt)}.bind(this)),Math.abs(Math.abs(this.lat0)-xt)1e10)throw new Error(\"Invalid height\");this.p=1+this.pn1,this.rp=1/this.p,this.h1=1/this.pn1,this.pfact=(this.p+1)*this.h1,this.es=0;var t=this.tilt,s=this.azi;this.cg=Math.cos(s),this.sg=Math.sin(s),this.cw=Math.cos(t),this.sw=Math.sin(t)},forward:function(t){t.x-=this.long0;var s,i,a=Math.sin(t.y),h=Math.cos(t.y),e=Math.cos(t.x);switch(this.mode){case Gi.OBLIQ:i=this.sinph0*a+this.cosph0*h*e;break;case Gi.EQUIT:i=h*e;break;case Gi.S_POLE:i=-a;break;case Gi.N_POLE:i=a}switch(i=this.pn1/(this.p-i),s=i*h*Math.sin(t.x),this.mode){case Gi.OBLIQ:i*=this.cosph0*a-this.sinph0*h*e;break;case Gi.EQUIT:i*=a;break;case Gi.N_POLE:i*=-h*e;break;case Gi.S_POLE:i*=h*e}var n,r;return n=i*this.cg+s*this.sg,r=1/(n*this.sw*this.h1+this.cw),s=(s*this.cg-i*this.sg)*this.cw*r,i=n*r,t.x=s*this.a,t.y=i*this.a,t},inverse:function(t){t.x/=this.a,t.y/=this.a;var s,i,a,h={x:t.x,y:t.y};a=1/(this.pn1-t.y*this.sw),s=this.pn1*t.x*a,i=this.pn1*t.y*this.cw*a,t.x=s*this.cg+i*this.sg,t.y=i*this.cg-s*this.sg;var e=ws(t.x,t.y);if(Math.abs(e)1e10)throw new Error;if(this.radius_g=1+this.radius_g_1,this.C=this.radius_g*this.radius_g-1,0!==this.es){var t=1-this.es,s=1/t;this.radius_p=Math.sqrt(t),this.radius_p2=t,this.radius_p_inv2=s,this.shape=\"ellipse\"}else this.radius_p=1,this.radius_p2=1,this.radius_p_inv2=1,this.shape=\"sphere\";this.title||(this.title=\"Geostationary Satellite View\")},forward:function(t){var s,i,a,h,e=t.x,n=t.y;if(e-=this.long0,\"ellipse\"===this.shape){n=Math.atan(this.radius_p2*Math.tan(n));var r=this.radius_p/ws(this.radius_p*Math.cos(n),Math.sin(n));if(i=r*Math.cos(e)*Math.cos(n),a=r*Math.sin(e)*Math.cos(n),h=r*Math.sin(n),(this.radius_g-i)*i-a*a-h*h*this.radius_p_inv2<0)return t.x=Number.NaN,t.y=Number.NaN,t;s=this.radius_g-i,this.flip_axis?(t.x=this.radius_g_1*Math.atan(a/ws(h,s)),t.y=this.radius_g_1*Math.atan(h/s)):(t.x=this.radius_g_1*Math.atan(a/s),t.y=this.radius_g_1*Math.atan(h/ws(a,s)))}else\"sphere\"===this.shape&&(s=Math.cos(n),i=Math.cos(e)*s,a=Math.sin(e)*s,h=Math.sin(n),s=this.radius_g-i,this.flip_axis?(t.x=this.radius_g_1*Math.atan(a/ws(h,s)),t.y=this.radius_g_1*Math.atan(h/s)):(t.x=this.radius_g_1*Math.atan(a/s),t.y=this.radius_g_1*Math.atan(h/ws(a,s))));return t.x=t.x*this.a,t.y=t.y*this.a,t},inverse:function(t){var s,i,a,h,e=-1,n=0,r=0;if(t.x=t.x/this.a,t.y=t.y/this.a,\"ellipse\"===this.shape){this.flip_axis?(r=Math.tan(t.y/this.radius_g_1),n=Math.tan(t.x/this.radius_g_1)*ws(1,r)):(n=Math.tan(t.x/this.radius_g_1),r=Math.tan(t.y/this.radius_g_1)*ws(1,n));var o=r/this.radius_p;if(s=n*n+o*o+e*e,i=2*this.radius_g*e,(a=i*i-4*s*this.C)<0)return t.x=Number.NaN,t.y=Number.NaN,t;h=(-i-Math.sqrt(a))/(2*s),e=this.radius_g+h*e,n*=h,r*=h,t.x=Math.atan2(n,e),t.y=Math.atan(r*Math.cos(t.x)/e),t.y=Math.atan(this.radius_p_inv2*Math.tan(t.y))}else if(\"sphere\"===this.shape){if(this.flip_axis?(r=Math.tan(t.y/this.radius_g_1),n=Math.tan(t.x/this.radius_g_1)*Math.sqrt(1+r*r)):(n=Math.tan(t.x/this.radius_g_1),r=Math.tan(t.y/this.radius_g_1)*Math.sqrt(1+n*n)),s=n*n+r*r+e*e,i=2*this.radius_g*e,(a=i*i-4*s*this.C)<0)return t.x=Number.NaN,t.y=Number.NaN,t;h=(-i-Math.sqrt(a))/(2*s),e=this.radius_g+h*e,n*=h,r*=h,t.x=Math.atan2(n,e),t.y=Math.atan(r*Math.cos(t.x)/e)}return t.x=t.x+this.long0,t},names:[\"Geostationary Satellite View\",\"Geostationary_Satellite\",\"geos\"]};return W.defaultDatum=\"WGS84\",W.Proj=Projection,W.WGS84=new W.Proj(\"WGS84\"),W.Point=Point,W.toPoint=es,W.defs=o,W.nadgrid=function(t,s){var i=new DataView(s),a=N(i),h=A(i,a),e={header:h,subgrids:C(i,h,a)};return is[t]=e,e},W.transform=D,W.mgrs=ms,W.version=\"2.9.2\",function(proj4){proj4.Proj.projections.add(vs),proj4.Proj.projections.add(Is),proj4.Proj.projections.add(ks),proj4.Proj.projections.add(Ts),proj4.Proj.projections.add(Gs),proj4.Proj.projections.add(js),proj4.Proj.projections.add(zs),proj4.Proj.projections.add(Fs),proj4.Proj.projections.add(Ds),proj4.Proj.projections.add(Zs),proj4.Proj.projections.add(ei),proj4.Proj.projections.add(ri),proj4.Proj.projections.add(oi),proj4.Proj.projections.add(ui),proj4.Proj.projections.add(ci),proj4.Proj.projections.add(fi),proj4.Proj.projections.add(di),proj4.Proj.projections.add(pi),proj4.Proj.projections.add(_i),proj4.Proj.projections.add(yi),proj4.Proj.projections.add(xi),proj4.Proj.projections.add(gi),proj4.Proj.projections.add(vi),proj4.Proj.projections.add(bi),proj4.Proj.projections.add(Ai),proj4.Proj.projections.add(Li),proj4.Proj.projections.add(Ti),proj4.Proj.projections.add(Bi),proj4.Proj.projections.add(zi)}(W),W});", "!function(t,i){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=i():\"function\"==typeof define&&define.amd?define(i):(t=t||self).RBush=i()}(this,function(){\"use strict\";function t(t,r,e,a,h){!function t(n,r,e,a,h){for(;a>e;){if(a-e>600){var o=a-e+1,s=r-e+1,l=Math.log(o),f=.5*Math.exp(2*l/3),u=.5*Math.sqrt(l*f*(o-f)/o)*(s-o/2<0?-1:1),m=Math.max(e,Math.floor(r-s*f/o+u)),c=Math.min(a,Math.floor(r+(o-s)*f/o+u));t(n,r,m,c,h)}var p=n[r],d=e,x=a;for(i(n,e,r),h(n[a],p)>0&&i(n,e,a);d0;)x--}0===h(n[e],p)?i(n,e,x):i(n,++x,a),x<=r&&(e=x+1),r<=x&&(a=x-1)}}(t,r,e||0,a||t.length-1,h||n)}function i(t,i,n){var r=t[i];t[i]=t[n],t[n]=r}function n(t,i){return ti?1:0}var r=function(t){void 0===t&&(t=9),this._maxEntries=Math.max(4,t),this._minEntries=Math.max(2,Math.ceil(.4*this._maxEntries)),this.clear()};function e(t,i,n){if(!n)return i.indexOf(t);for(var r=0;r=t.minX&&i.maxY>=t.minY}function p(t){return{children:t,height:1,leaf:!0,minX:1/0,minY:1/0,maxX:-1/0,maxY:-1/0}}function d(i,n,r,e,a){for(var h=[n,r];h.length;)if(!((r=h.pop())-(n=h.pop())<=e)){var o=n+Math.ceil((r-n)/e/2)*e;t(i,o,n,r,a),h.push(n,o,o,r)}}return r.prototype.all=function(){return this._all(this.data,[])},r.prototype.search=function(t){var i=this.data,n=[];if(!c(t,i))return n;for(var r=this.toBBox,e=[];i;){for(var a=0;a=0&&e[i].children.length>this._maxEntries;)this._split(e,i),i--;this._adjustParentBBoxes(r,e,i)},r.prototype._split=function(t,i){var n=t[i],r=n.children.length,e=this._minEntries;this._chooseSplitAxis(n,e,r);var h=this._chooseSplitIndex(n,e,r),o=p(n.children.splice(h,n.children.length-h));o.height=n.height,o.leaf=n.leaf,a(n,this.toBBox),a(o,this.toBBox),i?t[i-1].children.push(o):this._splitRoot(n,o)},r.prototype._splitRoot=function(t,i){this.data=p([t,i]),this.data.height=t.height+1,this.data.leaf=!1,a(this.data,this.toBBox)},r.prototype._chooseSplitIndex=function(t,i,n){for(var r,e,a,o,s,l,u,m=1/0,c=1/0,p=i;p<=n-i;p++){var d=h(t,0,p,this.toBBox),x=h(t,p,n,this.toBBox),v=(e=d,a=x,o=void 0,s=void 0,l=void 0,u=void 0,o=Math.max(e.minX,a.minX),s=Math.max(e.minY,a.minY),l=Math.min(e.maxX,a.maxX),u=Math.min(e.maxY,a.maxY),Math.max(0,l-o)*Math.max(0,u-s)),M=f(d)+f(x);v=i;c--){var p=t.children[c];o(s,t.leaf?e(p):p),l+=u(s)}return l},r.prototype._adjustParentBBoxes=function(t,i,n){for(var r=n;r>=0;r--)o(i[r],t)},r.prototype._condense=function(t){for(var i=t.length-1,n=void 0;i>=0;i--)0===t[i].children.length?i>0?(n=t[i-1].children).splice(n.indexOf(t[i]),1):this.clear():a(t[i],this.toBBox)},r});\n", "/**\n * @module ol/events/Event\n */\n\n/**\n * @classdesc\n * Stripped down implementation of the W3C DOM Level 2 Event interface.\n * See https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-interface.\n *\n * This implementation only provides `type` and `target` properties, and\n * `stopPropagation` and `preventDefault` methods. It is meant as base class\n * for higher level events defined in the library, and works with\n * {@link module:ol/events/Target~Target}.\n */\nclass BaseEvent {\n /**\n * @param {string} type Type.\n */\n constructor(type) {\n /**\n * @type {boolean}\n */\n this.propagationStopped;\n\n /**\n * @type {boolean}\n */\n this.defaultPrevented;\n\n /**\n * The event type.\n * @type {string}\n * @api\n */\n this.type = type;\n\n /**\n * The event target.\n * @type {Object}\n * @api\n */\n this.target = null;\n }\n\n /**\n * Prevent default. This means that no emulated `click`, `singleclick` or `doubleclick` events\n * will be fired.\n * @api\n */\n preventDefault() {\n this.defaultPrevented = true;\n }\n\n /**\n * Stop event propagation.\n * @api\n */\n stopPropagation() {\n this.propagationStopped = true;\n }\n}\n\n/**\n * @param {Event|import(\"./Event.js\").default} evt Event\n */\nexport function stopPropagation(evt) {\n evt.stopPropagation();\n}\n\n/**\n * @param {Event|import(\"./Event.js\").default} evt Event\n */\nexport function preventDefault(evt) {\n evt.preventDefault();\n}\n\nexport default BaseEvent;\n", "/**\n * @module ol/ObjectEventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n /**\n * Triggered when a property is changed.\n * @event module:ol/Object.ObjectEvent#propertychange\n * @api\n */\n PROPERTYCHANGE: 'propertychange',\n};\n\n/**\n * @typedef {'propertychange'} Types\n */\n", "/**\n * @module ol/Disposable\n */\n\n/**\n * @classdesc\n * Objects that need to clean up after themselves.\n */\nclass Disposable {\n constructor() {\n /**\n * The object has already been disposed.\n * @type {boolean}\n * @protected\n */\n this.disposed = false;\n }\n\n /**\n * Clean up.\n */\n dispose() {\n if (!this.disposed) {\n this.disposed = true;\n this.disposeInternal();\n }\n }\n\n /**\n * Extension point for disposable objects.\n * @protected\n */\n disposeInternal() {}\n}\n\nexport default Disposable;\n", "/**\n * @module ol/array\n */\n\n/**\n * Performs a binary search on the provided sorted list and returns the index of the item if found. If it can't be found it'll return -1.\n * https://github.com/darkskyapp/binary-search\n *\n * @param {Array<*>} haystack Items to search through.\n * @param {*} needle The item to look for.\n * @param {Function} [comparator] Comparator function.\n * @return {number} The index of the item if found, -1 if not.\n */\nexport function binarySearch(haystack, needle, comparator) {\n let mid, cmp;\n comparator = comparator || ascending;\n let low = 0;\n let high = haystack.length;\n let found = false;\n\n while (low < high) {\n /* Note that \"(low + high) >>> 1\" may overflow, and results in a typecast\n * to double (which gives the wrong results). */\n mid = low + ((high - low) >> 1);\n cmp = +comparator(haystack[mid], needle);\n\n if (cmp < 0.0) {\n /* Too low. */\n low = mid + 1;\n } else {\n /* Key found or too high */\n high = mid;\n found = !cmp;\n }\n }\n\n /* Key not found. */\n return found ? low : ~low;\n}\n\n/**\n * Compare function sorting arrays in ascending order. Safe to use for numeric values.\n * @param {*} a The first object to be compared.\n * @param {*} b The second object to be compared.\n * @return {number} A negative number, zero, or a positive number as the first\n * argument is less than, equal to, or greater than the second.\n */\nexport function ascending(a, b) {\n return a > b ? 1 : a < b ? -1 : 0;\n}\n\n/**\n * Compare function sorting arrays in descending order. Safe to use for numeric values.\n * @param {*} a The first object to be compared.\n * @param {*} b The second object to be compared.\n * @return {number} A negative number, zero, or a positive number as the first\n * argument is greater than, equal to, or less than the second.\n */\nexport function descending(a, b) {\n return a < b ? 1 : a > b ? -1 : 0;\n}\n\n/**\n * {@link module:ol/tilegrid/TileGrid~TileGrid#getZForResolution} can use a function\n * of this type to determine which nearest resolution to use.\n *\n * This function takes a `{number}` representing a value between two array entries,\n * a `{number}` representing the value of the nearest higher entry and\n * a `{number}` representing the value of the nearest lower entry\n * as arguments and returns a `{number}`. If a negative number or zero is returned\n * the lower value will be used, if a positive number is returned the higher value\n * will be used.\n * @typedef {function(number, number, number): number} NearestDirectionFunction\n * @api\n */\n\n/**\n * @param {Array} arr Array in descending order.\n * @param {number} target Target.\n * @param {number|NearestDirectionFunction} direction\n * 0 means return the nearest,\n * > 0 means return the largest nearest,\n * < 0 means return the smallest nearest.\n * @return {number} Index.\n */\nexport function linearFindNearest(arr, target, direction) {\n if (arr[0] <= target) {\n return 0;\n }\n\n const n = arr.length;\n if (target <= arr[n - 1]) {\n return n - 1;\n }\n\n if (typeof direction === 'function') {\n for (let i = 1; i < n; ++i) {\n const candidate = arr[i];\n if (candidate === target) {\n return i;\n }\n if (candidate < target) {\n if (direction(target, arr[i - 1], candidate) > 0) {\n return i - 1;\n }\n return i;\n }\n }\n return n - 1;\n }\n\n if (direction > 0) {\n for (let i = 1; i < n; ++i) {\n if (arr[i] < target) {\n return i - 1;\n }\n }\n return n - 1;\n }\n\n if (direction < 0) {\n for (let i = 1; i < n; ++i) {\n if (arr[i] <= target) {\n return i;\n }\n }\n return n - 1;\n }\n\n for (let i = 1; i < n; ++i) {\n if (arr[i] == target) {\n return i;\n }\n if (arr[i] < target) {\n if (arr[i - 1] - target < target - arr[i]) {\n return i - 1;\n }\n return i;\n }\n }\n return n - 1;\n}\n\n/**\n * @param {Array<*>} arr Array.\n * @param {number} begin Begin index.\n * @param {number} end End index.\n */\nexport function reverseSubArray(arr, begin, end) {\n while (begin < end) {\n const tmp = arr[begin];\n arr[begin] = arr[end];\n arr[end] = tmp;\n ++begin;\n --end;\n }\n}\n\n/**\n * @param {Array} arr The array to modify.\n * @param {!Array|VALUE} data The elements or arrays of elements to add to arr.\n * @template VALUE\n */\nexport function extend(arr, data) {\n const extension = Array.isArray(data) ? data : [data];\n const length = extension.length;\n for (let i = 0; i < length; i++) {\n arr[arr.length] = extension[i];\n }\n}\n\n/**\n * @param {Array} arr The array to modify.\n * @param {VALUE} obj The element to remove.\n * @template VALUE\n * @return {boolean} If the element was removed.\n */\nexport function remove(arr, obj) {\n const i = arr.indexOf(obj);\n const found = i > -1;\n if (found) {\n arr.splice(i, 1);\n }\n return found;\n}\n\n/**\n * @param {Array|Uint8ClampedArray} arr1 The first array to compare.\n * @param {Array|Uint8ClampedArray} arr2 The second array to compare.\n * @return {boolean} Whether the two arrays are equal.\n */\nexport function equals(arr1, arr2) {\n const len1 = arr1.length;\n if (len1 !== arr2.length) {\n return false;\n }\n for (let i = 0; i < len1; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Sort the passed array such that the relative order of equal elements is preserved.\n * See https://en.wikipedia.org/wiki/Sorting_algorithm#Stability for details.\n * @param {Array<*>} arr The array to sort (modifies original).\n * @param {!function(*, *): number} compareFnc Comparison function.\n * @api\n */\nexport function stableSort(arr, compareFnc) {\n const length = arr.length;\n const tmp = Array(arr.length);\n let i;\n for (i = 0; i < length; i++) {\n tmp[i] = {index: i, value: arr[i]};\n }\n tmp.sort(function (a, b) {\n return compareFnc(a.value, b.value) || a.index - b.index;\n });\n for (i = 0; i < arr.length; i++) {\n arr[i] = tmp[i].value;\n }\n}\n\n/**\n * @param {Array<*>} arr The array to test.\n * @param {Function} [func] Comparison function.\n * @param {boolean} [strict] Strictly sorted (default false).\n * @return {boolean} Return index.\n */\nexport function isSorted(arr, func, strict) {\n const compare = func || ascending;\n return arr.every(function (currentVal, index) {\n if (index === 0) {\n return true;\n }\n const res = compare(arr[index - 1], currentVal);\n return !(res > 0 || (strict && res === 0));\n });\n}\n", "/**\n * @module ol/functions\n */\n\nimport {equals as arrayEquals} from './array.js';\n\n/**\n * Always returns true.\n * @return {boolean} true.\n */\nexport function TRUE() {\n return true;\n}\n\n/**\n * Always returns false.\n * @return {boolean} false.\n */\nexport function FALSE() {\n return false;\n}\n\n/**\n * A reusable function, used e.g. as a default for callbacks.\n *\n * @return {void} Nothing.\n */\nexport function VOID() {}\n\n/**\n * Wrap a function in another function that remembers the last return. If the\n * returned function is called twice in a row with the same arguments and the same\n * this object, it will return the value from the first call in the second call.\n *\n * @param {function(...any): ReturnType} fn The function to memoize.\n * @return {function(...any): ReturnType} The memoized function.\n * @template ReturnType\n */\nexport function memoizeOne(fn) {\n let called = false;\n\n /** @type {ReturnType} */\n let lastResult;\n\n /** @type {Array} */\n let lastArgs;\n\n let lastThis;\n\n return function () {\n const nextArgs = Array.prototype.slice.call(arguments);\n if (!called || this !== lastThis || !arrayEquals(nextArgs, lastArgs)) {\n called = true;\n lastThis = this;\n lastArgs = nextArgs;\n lastResult = fn.apply(this, arguments);\n }\n return lastResult;\n };\n}\n\n/**\n * @template T\n * @param {function(): (T | Promise)} getter A function that returns a value or a promise for a value.\n * @return {Promise} A promise for the value.\n */\nexport function toPromise(getter) {\n function promiseGetter() {\n let value;\n try {\n value = getter();\n } catch (err) {\n return Promise.reject(err);\n }\n if (value instanceof Promise) {\n return value;\n }\n return Promise.resolve(value);\n }\n return promiseGetter();\n}\n", "/**\n * @module ol/obj\n */\n\n/**\n * Removes all properties from an object.\n * @param {Object} object The object to clear.\n */\nexport function clear(object) {\n for (const property in object) {\n delete object[property];\n }\n}\n\n/**\n * Determine if an object has any properties.\n * @param {Object} object The object to check.\n * @return {boolean} The object is empty.\n */\nexport function isEmpty(object) {\n let property;\n for (property in object) {\n return false;\n }\n return !property;\n}\n", "/**\n * @module ol/events/Target\n */\nimport Disposable from '../Disposable.js';\nimport Event from './Event.js';\nimport {VOID} from '../functions.js';\nimport {clear} from '../obj.js';\n\n/**\n * @typedef {EventTarget|Target} EventTargetLike\n */\n\n/**\n * @classdesc\n * A simplified implementation of the W3C DOM Level 2 EventTarget interface.\n * See https://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-EventTarget.\n *\n * There are two important simplifications compared to the specification:\n *\n * 1. The handling of `useCapture` in `addEventListener` and\n * `removeEventListener`. There is no real capture model.\n * 2. The handling of `stopPropagation` and `preventDefault` on `dispatchEvent`.\n * There is no event target hierarchy. When a listener calls\n * `stopPropagation` or `preventDefault` on an event object, it means that no\n * more listeners after this one will be called. Same as when the listener\n * returns false.\n */\nclass Target extends Disposable {\n /**\n * @param {*} [target] Default event target for dispatched events.\n */\n constructor(target) {\n super();\n\n /**\n * @private\n * @type {*}\n */\n this.eventTarget_ = target;\n\n /**\n * @private\n * @type {Object}\n */\n this.pendingRemovals_ = null;\n\n /**\n * @private\n * @type {Object}\n */\n this.dispatching_ = null;\n\n /**\n * @private\n * @type {Object>}\n */\n this.listeners_ = null;\n }\n\n /**\n * @param {string} type Type.\n * @param {import(\"../events.js\").Listener} listener Listener.\n */\n addEventListener(type, listener) {\n if (!type || !listener) {\n return;\n }\n const listeners = this.listeners_ || (this.listeners_ = {});\n const listenersForType = listeners[type] || (listeners[type] = []);\n if (!listenersForType.includes(listener)) {\n listenersForType.push(listener);\n }\n }\n\n /**\n * Dispatches an event and calls all listeners listening for events\n * of this type. The event parameter can either be a string or an\n * Object with a `type` property.\n *\n * @param {import(\"./Event.js\").default|string} event Event object.\n * @return {boolean|undefined} `false` if anyone called preventDefault on the\n * event object or if any of the listeners returned false.\n * @api\n */\n dispatchEvent(event) {\n const isString = typeof event === 'string';\n const type = isString ? event : event.type;\n const listeners = this.listeners_ && this.listeners_[type];\n if (!listeners) {\n return;\n }\n\n const evt = isString ? new Event(event) : /** @type {Event} */ (event);\n if (!evt.target) {\n evt.target = this.eventTarget_ || this;\n }\n const dispatching = this.dispatching_ || (this.dispatching_ = {});\n const pendingRemovals =\n this.pendingRemovals_ || (this.pendingRemovals_ = {});\n if (!(type in dispatching)) {\n dispatching[type] = 0;\n pendingRemovals[type] = 0;\n }\n ++dispatching[type];\n let propagate;\n for (let i = 0, ii = listeners.length; i < ii; ++i) {\n if ('handleEvent' in listeners[i]) {\n propagate = /** @type {import(\"../events.js\").ListenerObject} */ (\n listeners[i]\n ).handleEvent(evt);\n } else {\n propagate = /** @type {import(\"../events.js\").ListenerFunction} */ (\n listeners[i]\n ).call(this, evt);\n }\n if (propagate === false || evt.propagationStopped) {\n propagate = false;\n break;\n }\n }\n if (--dispatching[type] === 0) {\n let pr = pendingRemovals[type];\n delete pendingRemovals[type];\n while (pr--) {\n this.removeEventListener(type, VOID);\n }\n delete dispatching[type];\n }\n return propagate;\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n this.listeners_ && clear(this.listeners_);\n }\n\n /**\n * Get the listeners for a specified event type. Listeners are returned in the\n * order that they will be called in.\n *\n * @param {string} type Type.\n * @return {Array|undefined} Listeners.\n */\n getListeners(type) {\n return (this.listeners_ && this.listeners_[type]) || undefined;\n }\n\n /**\n * @param {string} [type] Type. If not provided,\n * `true` will be returned if this event target has any listeners.\n * @return {boolean} Has listeners.\n */\n hasListener(type) {\n if (!this.listeners_) {\n return false;\n }\n return type\n ? type in this.listeners_\n : Object.keys(this.listeners_).length > 0;\n }\n\n /**\n * @param {string} type Type.\n * @param {import(\"../events.js\").Listener} listener Listener.\n */\n removeEventListener(type, listener) {\n const listeners = this.listeners_ && this.listeners_[type];\n if (listeners) {\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n if (this.pendingRemovals_ && type in this.pendingRemovals_) {\n // make listener a no-op, and remove later in #dispatchEvent()\n listeners[index] = VOID;\n ++this.pendingRemovals_[type];\n } else {\n listeners.splice(index, 1);\n if (listeners.length === 0) {\n delete this.listeners_[type];\n }\n }\n }\n }\n }\n}\n\nexport default Target;\n", "/**\n * @module ol/events/EventType\n */\n\n/**\n * @enum {string}\n * @const\n */\nexport default {\n /**\n * Generic change event. Triggered when the revision counter is increased.\n * @event module:ol/events/Event~BaseEvent#change\n * @api\n */\n CHANGE: 'change',\n\n /**\n * Generic error event. Triggered when an error occurs.\n * @event module:ol/events/Event~BaseEvent#error\n * @api\n */\n ERROR: 'error',\n\n BLUR: 'blur',\n CLEAR: 'clear',\n CONTEXTMENU: 'contextmenu',\n CLICK: 'click',\n DBLCLICK: 'dblclick',\n DRAGENTER: 'dragenter',\n DRAGOVER: 'dragover',\n DROP: 'drop',\n FOCUS: 'focus',\n KEYDOWN: 'keydown',\n KEYPRESS: 'keypress',\n LOAD: 'load',\n RESIZE: 'resize',\n TOUCHMOVE: 'touchmove',\n WHEEL: 'wheel',\n};\n", "/**\n * @module ol/events\n */\nimport {clear} from './obj.js';\n\n/**\n * Key to use with {@link module:ol/Observable.unByKey}.\n * @typedef {Object} EventsKey\n * @property {ListenerFunction} listener Listener.\n * @property {import(\"./events/Target.js\").EventTargetLike} target Target.\n * @property {string} type Type.\n * @api\n */\n\n/**\n * Listener function. This function is called with an event object as argument.\n * When the function returns `false`, event propagation will stop.\n *\n * @typedef {function((Event|import(\"./events/Event.js\").default)): (void|boolean)} ListenerFunction\n * @api\n */\n\n/**\n * @typedef {Object} ListenerObject\n * @property {ListenerFunction} handleEvent HandleEvent listener function.\n */\n\n/**\n * @typedef {ListenerFunction|ListenerObject} Listener\n */\n\n/**\n * Registers an event listener on an event target. Inspired by\n * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html\n *\n * This function efficiently binds a `listener` to a `this` object, and returns\n * a key for use with {@link module:ol/events.unlistenByKey}.\n *\n * @param {import(\"./events/Target.js\").EventTargetLike} target Event target.\n * @param {string} type Event type.\n * @param {ListenerFunction} listener Listener.\n * @param {Object} [thisArg] Object referenced by the `this` keyword in the\n * listener. Default is the `target`.\n * @param {boolean} [once] If true, add the listener as one-off listener.\n * @return {EventsKey} Unique key for the listener.\n */\nexport function listen(target, type, listener, thisArg, once) {\n if (thisArg && thisArg !== target) {\n listener = listener.bind(thisArg);\n }\n if (once) {\n const originalListener = listener;\n listener = function () {\n target.removeEventListener(type, listener);\n originalListener.apply(this, arguments);\n };\n }\n const eventsKey = {\n target: target,\n type: type,\n listener: listener,\n };\n target.addEventListener(type, listener);\n return eventsKey;\n}\n\n/**\n * Registers a one-off event listener on an event target. Inspired by\n * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html\n *\n * This function efficiently binds a `listener` as self-unregistering listener\n * to a `this` object, and returns a key for use with\n * {@link module:ol/events.unlistenByKey} in case the listener needs to be\n * unregistered before it is called.\n *\n * When {@link module:ol/events.listen} is called with the same arguments after this\n * function, the self-unregistering listener will be turned into a permanent\n * listener.\n *\n * @param {import(\"./events/Target.js\").EventTargetLike} target Event target.\n * @param {string} type Event type.\n * @param {ListenerFunction} listener Listener.\n * @param {Object} [thisArg] Object referenced by the `this` keyword in the\n * listener. Default is the `target`.\n * @return {EventsKey} Key for unlistenByKey.\n */\nexport function listenOnce(target, type, listener, thisArg) {\n return listen(target, type, listener, thisArg, true);\n}\n\n/**\n * Unregisters event listeners on an event target. Inspired by\n * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html\n *\n * The argument passed to this function is the key returned from\n * {@link module:ol/events.listen} or {@link module:ol/events.listenOnce}.\n *\n * @param {EventsKey} key The key.\n */\nexport function unlistenByKey(key) {\n if (key && key.target) {\n key.target.removeEventListener(key.type, key.listener);\n clear(key);\n }\n}\n", "/**\n * @module ol/Observable\n */\nimport EventTarget from './events/Target.js';\nimport EventType from './events/EventType.js';\nimport {listen, listenOnce, unlistenByKey} from './events.js';\n\n/***\n * @template {string} Type\n * @template {Event|import(\"./events/Event.js\").default} EventClass\n * @template Return\n * @typedef {(type: Type, listener: (event: EventClass) => ?) => Return} OnSignature\n */\n\n/***\n * @template {string} Type\n * @template Return\n * @typedef {(type: Type[], listener: (event: Event|import(\"./events/Event\").default) => ?) => Return extends void ? void : Return[]} CombinedOnSignature\n */\n\n/**\n * @typedef {'change'|'error'} EventTypes\n */\n\n/***\n * @template Return\n * @typedef {OnSignature & CombinedOnSignature} ObservableOnSignature\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * An event target providing convenient methods for listener registration\n * and unregistration. A generic `change` event is always available through\n * {@link module:ol/Observable~Observable#changed}.\n *\n * @fires import(\"./events/Event.js\").default\n * @api\n */\nclass Observable extends EventTarget {\n constructor() {\n super();\n\n this.on =\n /** @type {ObservableOnSignature} */ (\n this.onInternal\n );\n\n this.once =\n /** @type {ObservableOnSignature} */ (\n this.onceInternal\n );\n\n this.un = /** @type {ObservableOnSignature} */ (this.unInternal);\n\n /**\n * @private\n * @type {number}\n */\n this.revision_ = 0;\n }\n\n /**\n * Increases the revision counter and dispatches a 'change' event.\n * @api\n */\n changed() {\n ++this.revision_;\n this.dispatchEvent(EventType.CHANGE);\n }\n\n /**\n * Get the version number for this object. Each time the object is modified,\n * its version number will be incremented.\n * @return {number} Revision.\n * @api\n */\n getRevision() {\n return this.revision_;\n }\n\n /**\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener Listener.\n * @return {import(\"./events.js\").EventsKey|Array} Event key.\n * @protected\n */\n onInternal(type, listener) {\n if (Array.isArray(type)) {\n const len = type.length;\n const keys = new Array(len);\n for (let i = 0; i < len; ++i) {\n keys[i] = listen(this, type[i], listener);\n }\n return keys;\n }\n return listen(this, /** @type {string} */ (type), listener);\n }\n\n /**\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener Listener.\n * @return {import(\"./events.js\").EventsKey|Array} Event key.\n * @protected\n */\n onceInternal(type, listener) {\n let key;\n if (Array.isArray(type)) {\n const len = type.length;\n key = new Array(len);\n for (let i = 0; i < len; ++i) {\n key[i] = listenOnce(this, type[i], listener);\n }\n } else {\n key = listenOnce(this, /** @type {string} */ (type), listener);\n }\n /** @type {Object} */ (listener).ol_key = key;\n return key;\n }\n\n /**\n * Unlisten for a certain type of event.\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener Listener.\n * @protected\n */\n unInternal(type, listener) {\n const key = /** @type {Object} */ (listener).ol_key;\n if (key) {\n unByKey(key);\n } else if (Array.isArray(type)) {\n for (let i = 0, ii = type.length; i < ii; ++i) {\n this.removeEventListener(type[i], listener);\n }\n } else {\n this.removeEventListener(type, listener);\n }\n }\n}\n\n/**\n * Listen for a certain type of event.\n * @function\n * @param {string|Array} type The event type or array of event types.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener The listener function.\n * @return {import(\"./events.js\").EventsKey|Array} Unique key for the listener. If\n * called with an array of event types as the first argument, the return\n * will be an array of keys.\n * @api\n */\nObservable.prototype.on;\n\n/**\n * Listen once for a certain type of event.\n * @function\n * @param {string|Array} type The event type or array of event types.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener The listener function.\n * @return {import(\"./events.js\").EventsKey|Array} Unique key for the listener. If\n * called with an array of event types as the first argument, the return\n * will be an array of keys.\n * @api\n */\nObservable.prototype.once;\n\n/**\n * Unlisten for a certain type of event.\n * @function\n * @param {string|Array} type The event type or array of event types.\n * @param {function((Event|import(\"./events/Event\").default)): ?} listener The listener function.\n * @api\n */\nObservable.prototype.un;\n\n/**\n * Removes an event listener using the key returned by `on()` or `once()`.\n * @param {import(\"./events.js\").EventsKey|Array} key The key returned by `on()`\n * or `once()` (or an array of keys).\n * @api\n */\nexport function unByKey(key) {\n if (Array.isArray(key)) {\n for (let i = 0, ii = key.length; i < ii; ++i) {\n unlistenByKey(key[i]);\n }\n } else {\n unlistenByKey(/** @type {import(\"./events.js\").EventsKey} */ (key));\n }\n}\n\nexport default Observable;\n", "/**\n * @module ol/util\n */\n\n/**\n * @return {never} Any return.\n */\nexport function abstract() {\n throw new Error('Unimplemented abstract method.');\n}\n\n/**\n * Counter for getUid.\n * @type {number}\n * @private\n */\nlet uidCounter_ = 0;\n\n/**\n * Gets a unique ID for an object. This mutates the object so that further calls\n * with the same object as a parameter returns the same value. Unique IDs are generated\n * as a strictly increasing sequence. Adapted from goog.getUid.\n *\n * @param {Object} obj The object to get the unique ID for.\n * @return {string} The unique ID for the object.\n * @api\n */\nexport function getUid(obj) {\n return obj.ol_uid || (obj.ol_uid = String(++uidCounter_));\n}\n\n/**\n * OpenLayers version.\n * @type {string}\n */\nexport const VERSION = '7.5.2';\n", "/**\n * @module ol/Object\n */\nimport Event from './events/Event.js';\nimport ObjectEventType from './ObjectEventType.js';\nimport Observable from './Observable.js';\nimport {getUid} from './util.js';\nimport {isEmpty} from './obj.js';\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/Object~BaseObject} instances are instances of this type.\n */\nexport class ObjectEvent extends Event {\n /**\n * @param {string} type The event type.\n * @param {string} key The property name.\n * @param {*} oldValue The old value for `key`.\n */\n constructor(type, key, oldValue) {\n super(type);\n\n /**\n * The name of the property whose value is changing.\n * @type {string}\n * @api\n */\n this.key = key;\n\n /**\n * The old value. To get the new value use `e.target.get(e.key)` where\n * `e` is the event object.\n * @type {*}\n * @api\n */\n this.oldValue = oldValue;\n }\n}\n\n/***\n * @template Return\n * @typedef {import(\"./Observable\").OnSignature &\n * import(\"./Observable\").OnSignature &\n * import(\"./Observable\").CombinedOnSignature} ObjectOnSignature\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Most non-trivial classes inherit from this.\n *\n * This extends {@link module:ol/Observable~Observable} with observable\n * properties, where each property is observable as well as the object as a\n * whole.\n *\n * Classes that inherit from this have pre-defined properties, to which you can\n * add your owns. The pre-defined properties are listed in this documentation as\n * 'Observable Properties', and have their own accessors; for example,\n * {@link module:ol/Map~Map} has a `target` property, accessed with\n * `getTarget()` and changed with `setTarget()`. Not all properties are however\n * settable. There are also general-purpose accessors `get()` and `set()`. For\n * example, `get('target')` is equivalent to `getTarget()`.\n *\n * The `set` accessors trigger a change event, and you can monitor this by\n * registering a listener. For example, {@link module:ol/View~View} has a\n * `center` property, so `view.on('change:center', function(evt) {...});` would\n * call the function whenever the value of the center property changes. Within\n * the function, `evt.target` would be the view, so `evt.target.getCenter()`\n * would return the new center.\n *\n * You can add your own observable properties with\n * `object.set('prop', 'value')`, and retrieve that with `object.get('prop')`.\n * You can listen for changes on that property value with\n * `object.on('change:prop', listener)`. You can get a list of all\n * properties with {@link module:ol/Object~BaseObject#getProperties}.\n *\n * Note that the observable properties are separate from standard JS properties.\n * You can, for example, give your map object a title with\n * `map.title='New title'` and with `map.set('title', 'Another title')`. The\n * first will be a `hasOwnProperty`; the second will appear in\n * `getProperties()`. Only the second is observable.\n *\n * Properties can be deleted by using the unset method. E.g.\n * object.unset('foo').\n *\n * @fires ObjectEvent\n * @api\n */\nclass BaseObject extends Observable {\n /**\n * @param {Object} [values] An object with key-value pairs.\n */\n constructor(values) {\n super();\n\n /***\n * @type {ObjectOnSignature}\n */\n this.on;\n\n /***\n * @type {ObjectOnSignature}\n */\n this.once;\n\n /***\n * @type {ObjectOnSignature}\n */\n this.un;\n\n // Call {@link module:ol/util.getUid} to ensure that the order of objects' ids is\n // the same as the order in which they were created. This also helps to\n // ensure that object properties are always added in the same order, which\n // helps many JavaScript engines generate faster code.\n getUid(this);\n\n /**\n * @private\n * @type {Object}\n */\n this.values_ = null;\n\n if (values !== undefined) {\n this.setProperties(values);\n }\n }\n\n /**\n * Gets a value.\n * @param {string} key Key name.\n * @return {*} Value.\n * @api\n */\n get(key) {\n let value;\n if (this.values_ && this.values_.hasOwnProperty(key)) {\n value = this.values_[key];\n }\n return value;\n }\n\n /**\n * Get a list of object property names.\n * @return {Array} List of property names.\n * @api\n */\n getKeys() {\n return (this.values_ && Object.keys(this.values_)) || [];\n }\n\n /**\n * Get an object of all property names and values.\n * @return {Object} Object.\n * @api\n */\n getProperties() {\n return (this.values_ && Object.assign({}, this.values_)) || {};\n }\n\n /**\n * @return {boolean} The object has properties.\n */\n hasProperties() {\n return !!this.values_;\n }\n\n /**\n * @param {string} key Key name.\n * @param {*} oldValue Old value.\n */\n notify(key, oldValue) {\n let eventType;\n eventType = `change:${key}`;\n if (this.hasListener(eventType)) {\n this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));\n }\n eventType = ObjectEventType.PROPERTYCHANGE;\n if (this.hasListener(eventType)) {\n this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));\n }\n }\n\n /**\n * @param {string} key Key name.\n * @param {import(\"./events.js\").Listener} listener Listener.\n */\n addChangeListener(key, listener) {\n this.addEventListener(`change:${key}`, listener);\n }\n\n /**\n * @param {string} key Key name.\n * @param {import(\"./events.js\").Listener} listener Listener.\n */\n removeChangeListener(key, listener) {\n this.removeEventListener(`change:${key}`, listener);\n }\n\n /**\n * Sets a value.\n * @param {string} key Key name.\n * @param {*} value Value.\n * @param {boolean} [silent] Update without triggering an event.\n * @api\n */\n set(key, value, silent) {\n const values = this.values_ || (this.values_ = {});\n if (silent) {\n values[key] = value;\n } else {\n const oldValue = values[key];\n values[key] = value;\n if (oldValue !== value) {\n this.notify(key, oldValue);\n }\n }\n }\n\n /**\n * Sets a collection of key-value pairs. Note that this changes any existing\n * properties and adds new ones (it does not remove any existing properties).\n * @param {Object} values Values.\n * @param {boolean} [silent] Update without triggering an event.\n * @api\n */\n setProperties(values, silent) {\n for (const key in values) {\n this.set(key, values[key], silent);\n }\n }\n\n /**\n * Apply any properties from another object without triggering events.\n * @param {BaseObject} source The source object.\n * @protected\n */\n applyProperties(source) {\n if (!source.values_) {\n return;\n }\n Object.assign(this.values_ || (this.values_ = {}), source.values_);\n }\n\n /**\n * Unsets a property.\n * @param {string} key Key name.\n * @param {boolean} [silent] Unset without triggering an event.\n * @api\n */\n unset(key, silent) {\n if (this.values_ && key in this.values_) {\n const oldValue = this.values_[key];\n delete this.values_[key];\n if (isEmpty(this.values_)) {\n this.values_ = null;\n }\n if (!silent) {\n this.notify(key, oldValue);\n }\n }\n }\n}\n\nexport default BaseObject;\n", "/**\n * @module ol/AssertionError\n */\n\n/** @type {Object} */\nconst messages = {\n 1: 'The view center is not defined',\n 2: 'The view resolution is not defined',\n 3: 'The view rotation is not defined',\n 4: '`image` and `src` cannot be provided at the same time',\n 5: '`imgSize` must be set when `image` is provided',\n 7: '`format` must be set when `url` is set',\n 8: 'Unknown `serverType` configured',\n 9: '`url` must be configured or set using `#setUrl()`',\n 10: 'The default `geometryFunction` can only handle `Point` geometries',\n 11: '`options.featureTypes` must be an Array',\n 12: '`options.geometryName` must also be provided when `options.bbox` is set',\n 13: 'Invalid corner',\n 14: 'Invalid color',\n 15: 'Tried to get a value for a key that does not exist in the cache',\n 16: 'Tried to set a value for a key that is used already',\n 17: '`resolutions` must be sorted in descending order',\n 18: 'Either `origin` or `origins` must be configured, never both',\n 19: 'Number of `tileSizes` and `resolutions` must be equal',\n 20: 'Number of `origins` and `resolutions` must be equal',\n 22: 'Either `tileSize` or `tileSizes` must be configured, never both',\n 24: 'Invalid extent or geometry provided as `geometry`',\n 25: 'Cannot fit empty extent provided as `geometry`',\n 26: 'Features must have an id set',\n 27: 'Features must have an id set',\n 28: '`renderMode` must be `\"hybrid\"` or `\"vector\"`',\n 30: 'The passed `feature` was already added to the source',\n 31: 'Tried to enqueue an `element` that was already added to the queue',\n 32: 'Transformation matrix cannot be inverted',\n 33: 'Invalid units',\n 34: 'Invalid geometry layout',\n 36: 'Unknown SRS type',\n 37: 'Unknown geometry type found',\n 38: '`styleMapValue` has an unknown type',\n 39: 'Unknown geometry type',\n 40: 'Expected `feature` to have a geometry',\n 41: 'Expected an `ol/style/Style` or an array of `ol/style/Style.js`',\n 42: 'Question unknown, the answer is 42',\n 43: 'Expected `layers` to be an array or a `Collection`',\n 47: 'Expected `controls` to be an array or an `ol/Collection`',\n 48: 'Expected `interactions` to be an array or an `ol/Collection`',\n 49: 'Expected `overlays` to be an array or an `ol/Collection`',\n 50: '`options.featureTypes` should be an Array',\n 51: 'Either `url` or `tileJSON` options must be provided',\n 52: 'Unknown `serverType` configured',\n 53: 'Unknown `tierSizeCalculation` configured',\n 55: 'The {-y} placeholder requires a tile grid with extent',\n 56: 'mapBrowserEvent must originate from a pointer event',\n 57: 'At least 2 conditions are required',\n 59: 'Invalid command found in the PBF',\n 60: 'Missing or invalid `size`',\n 61: 'Cannot determine IIIF Image API version from provided image information JSON',\n 62: 'A `WebGLArrayBuffer` must either be of type `ELEMENT_ARRAY_BUFFER` or `ARRAY_BUFFER`',\n 64: 'Layer opacity must be a number',\n 66: '`forEachFeatureAtCoordinate` cannot be used on a WebGL layer if the hit detection logic has not been enabled. This is done by providing adequate shaders using the `hitVertexShader` and `hitFragmentShader` properties of `WebGLPointsLayerRenderer`',\n 67: 'A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both',\n 68: 'A VectorTile source can only be rendered if it has a projection compatible with the view projection',\n 69: '`width` or `height` cannot be provided together with `scale`',\n};\n\n/**\n * Error object thrown when an assertion failed. This is an ECMA-262 Error,\n * extended with a `code` property.\n * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Error.\n */\nclass AssertionError extends Error {\n /**\n * @param {number} code Error code.\n */\n constructor(code) {\n const message = messages[code];\n\n super(message);\n\n /**\n * Error code. The meaning of the code can be found on\n * https://openlayers.org/en/latest/doc/errors/ (replace `latest` with\n * the version found in the OpenLayers script's header comment if a version\n * other than the latest is used).\n * @type {number}\n * @deprecated ol/AssertionError and error codes will be removed in v8.0\n * @api\n */\n this.code = code;\n\n /**\n * @type {string}\n */\n this.name = 'AssertionError';\n\n // Re-assign message, see https://github.com/Rich-Harris/buble/issues/40\n this.message = message;\n }\n}\n\nexport default AssertionError;\n", "/**\n * @module ol/CollectionEventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n /**\n * Triggered when an item is added to the collection.\n * @event module:ol/Collection.CollectionEvent#add\n * @api\n */\n ADD: 'add',\n /**\n * Triggered when an item is removed from the collection.\n * @event module:ol/Collection.CollectionEvent#remove\n * @api\n */\n REMOVE: 'remove',\n};\n", "/**\n * @module ol/Collection\n */\nimport AssertionError from './AssertionError.js';\nimport BaseObject from './Object.js';\nimport CollectionEventType from './CollectionEventType.js';\nimport Event from './events/Event.js';\n\n/**\n * @enum {string}\n * @private\n */\nconst Property = {\n LENGTH: 'length',\n};\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/Collection~Collection} instances are instances of this\n * type.\n * @template T\n */\nexport class CollectionEvent extends Event {\n /**\n * @param {import(\"./CollectionEventType.js\").default} type Type.\n * @param {T} element Element.\n * @param {number} index The index of the added or removed element.\n */\n constructor(type, element, index) {\n super(type);\n\n /**\n * The element that is added to or removed from the collection.\n * @type {T}\n * @api\n */\n this.element = element;\n\n /**\n * The index of the added or removed element.\n * @type {number}\n * @api\n */\n this.index = index;\n }\n}\n\n/***\n * @template T\n * @template Return\n * @typedef {import(\"./Observable\").OnSignature &\n * import(\"./Observable\").OnSignature &\n * import(\"./Observable\").OnSignature<'add'|'remove', CollectionEvent, Return> &\n * import(\"./Observable\").CombinedOnSignature} CollectionOnSignature\n */\n\n/**\n * @typedef {Object} Options\n * @property {boolean} [unique=false] Disallow the same item from being added to\n * the collection twice.\n */\n\n/**\n * @classdesc\n * An expanded version of standard JS Array, adding convenience methods for\n * manipulation. Add and remove changes to the Collection trigger a Collection\n * event. Note that this does not cover changes to the objects _within_ the\n * Collection; they trigger events on the appropriate object, not on the\n * Collection as a whole.\n *\n * @fires CollectionEvent\n *\n * @template T\n * @api\n */\nclass Collection extends BaseObject {\n /**\n * @param {Array} [array] Array.\n * @param {Options} [options] Collection options.\n */\n constructor(array, options) {\n super();\n\n /***\n * @type {CollectionOnSignature}\n */\n this.on;\n\n /***\n * @type {CollectionOnSignature}\n */\n this.once;\n\n /***\n * @type {CollectionOnSignature}\n */\n this.un;\n\n options = options || {};\n\n /**\n * @private\n * @type {boolean}\n */\n this.unique_ = !!options.unique;\n\n /**\n * @private\n * @type {!Array}\n */\n this.array_ = array ? array : [];\n\n if (this.unique_) {\n for (let i = 0, ii = this.array_.length; i < ii; ++i) {\n this.assertUnique_(this.array_[i], i);\n }\n }\n\n this.updateLength_();\n }\n\n /**\n * Remove all elements from the collection.\n * @api\n */\n clear() {\n while (this.getLength() > 0) {\n this.pop();\n }\n }\n\n /**\n * Add elements to the collection. This pushes each item in the provided array\n * to the end of the collection.\n * @param {!Array} arr Array.\n * @return {Collection} This collection.\n * @api\n */\n extend(arr) {\n for (let i = 0, ii = arr.length; i < ii; ++i) {\n this.push(arr[i]);\n }\n return this;\n }\n\n /**\n * Iterate over each element, calling the provided callback.\n * @param {function(T, number, Array): *} f The function to call\n * for every element. This function takes 3 arguments (the element, the\n * index and the array). The return value is ignored.\n * @api\n */\n forEach(f) {\n const array = this.array_;\n for (let i = 0, ii = array.length; i < ii; ++i) {\n f(array[i], i, array);\n }\n }\n\n /**\n * Get a reference to the underlying Array object. Warning: if the array\n * is mutated, no events will be dispatched by the collection, and the\n * collection's \"length\" property won't be in sync with the actual length\n * of the array.\n * @return {!Array} Array.\n * @api\n */\n getArray() {\n return this.array_;\n }\n\n /**\n * Get the element at the provided index.\n * @param {number} index Index.\n * @return {T} Element.\n * @api\n */\n item(index) {\n return this.array_[index];\n }\n\n /**\n * Get the length of this collection.\n * @return {number} The length of the array.\n * @observable\n * @api\n */\n getLength() {\n return this.get(Property.LENGTH);\n }\n\n /**\n * Insert an element at the provided index.\n * @param {number} index Index.\n * @param {T} elem Element.\n * @api\n */\n insertAt(index, elem) {\n if (index < 0 || index > this.getLength()) {\n throw new Error('Index out of bounds: ' + index);\n }\n if (this.unique_) {\n this.assertUnique_(elem);\n }\n this.array_.splice(index, 0, elem);\n this.updateLength_();\n this.dispatchEvent(\n new CollectionEvent(CollectionEventType.ADD, elem, index)\n );\n }\n\n /**\n * Remove the last element of the collection and return it.\n * Return `undefined` if the collection is empty.\n * @return {T|undefined} Element.\n * @api\n */\n pop() {\n return this.removeAt(this.getLength() - 1);\n }\n\n /**\n * Insert the provided element at the end of the collection.\n * @param {T} elem Element.\n * @return {number} New length of the collection.\n * @api\n */\n push(elem) {\n if (this.unique_) {\n this.assertUnique_(elem);\n }\n const n = this.getLength();\n this.insertAt(n, elem);\n return this.getLength();\n }\n\n /**\n * Remove the first occurrence of an element from the collection.\n * @param {T} elem Element.\n * @return {T|undefined} The removed element or undefined if none found.\n * @api\n */\n remove(elem) {\n const arr = this.array_;\n for (let i = 0, ii = arr.length; i < ii; ++i) {\n if (arr[i] === elem) {\n return this.removeAt(i);\n }\n }\n return undefined;\n }\n\n /**\n * Remove the element at the provided index and return it.\n * Return `undefined` if the collection does not contain this index.\n * @param {number} index Index.\n * @return {T|undefined} Value.\n * @api\n */\n removeAt(index) {\n if (index < 0 || index >= this.getLength()) {\n return undefined;\n }\n const prev = this.array_[index];\n this.array_.splice(index, 1);\n this.updateLength_();\n this.dispatchEvent(\n /** @type {CollectionEvent} */ (\n new CollectionEvent(CollectionEventType.REMOVE, prev, index)\n )\n );\n return prev;\n }\n\n /**\n * Set the element at the provided index.\n * @param {number} index Index.\n * @param {T} elem Element.\n * @api\n */\n setAt(index, elem) {\n const n = this.getLength();\n if (index >= n) {\n this.insertAt(index, elem);\n return;\n }\n if (index < 0) {\n throw new Error('Index out of bounds: ' + index);\n }\n if (this.unique_) {\n this.assertUnique_(elem, index);\n }\n const prev = this.array_[index];\n this.array_[index] = elem;\n this.dispatchEvent(\n /** @type {CollectionEvent} */ (\n new CollectionEvent(CollectionEventType.REMOVE, prev, index)\n )\n );\n this.dispatchEvent(\n /** @type {CollectionEvent} */ (\n new CollectionEvent(CollectionEventType.ADD, elem, index)\n )\n );\n }\n\n /**\n * @private\n */\n updateLength_() {\n this.set(Property.LENGTH, this.array_.length);\n }\n\n /**\n * @private\n * @param {T} elem Element.\n * @param {number} [except] Optional index to ignore.\n */\n assertUnique_(elem, except) {\n for (let i = 0, ii = this.array_.length; i < ii; ++i) {\n if (this.array_[i] === elem && i !== except) {\n throw new AssertionError(58);\n }\n }\n }\n}\n\nexport default Collection;\n", "/**\n * @module ol/has\n */\n\nconst ua =\n typeof navigator !== 'undefined' && typeof navigator.userAgent !== 'undefined'\n ? navigator.userAgent.toLowerCase()\n : '';\n\n/**\n * User agent string says we are dealing with Firefox as browser.\n * @type {boolean}\n */\nexport const FIREFOX = ua.includes('firefox');\n\n/**\n * User agent string says we are dealing with Safari as browser.\n * @type {boolean}\n */\nexport const SAFARI = ua.includes('safari') && !ua.includes('chrom');\n\n/**\n * https://bugs.webkit.org/show_bug.cgi?id=237906\n * @type {boolean}\n */\nexport const SAFARI_BUG_237906 =\n SAFARI &&\n (ua.includes('version/15.4') ||\n /cpu (os|iphone os) 15_4 like mac os x/.test(ua));\n\n/**\n * User agent string says we are dealing with a WebKit engine.\n * @type {boolean}\n */\nexport const WEBKIT = ua.includes('webkit') && !ua.includes('edge');\n\n/**\n * User agent string says we are dealing with a Mac as platform.\n * @type {boolean}\n */\nexport const MAC = ua.includes('macintosh');\n\n/**\n * The ratio between physical pixels and device-independent pixels\n * (dips) on the device (`window.devicePixelRatio`).\n * @const\n * @type {number}\n * @api\n */\nexport const DEVICE_PIXEL_RATIO =\n typeof devicePixelRatio !== 'undefined' ? devicePixelRatio : 1;\n\n/**\n * The execution context is a worker with OffscreenCanvas available.\n * @const\n * @type {boolean}\n */\nexport const WORKER_OFFSCREEN_CANVAS =\n typeof WorkerGlobalScope !== 'undefined' &&\n typeof OffscreenCanvas !== 'undefined' &&\n self instanceof WorkerGlobalScope; //eslint-disable-line\n\n/**\n * Image.prototype.decode() is supported.\n * @type {boolean}\n */\nexport const IMAGE_DECODE =\n typeof Image !== 'undefined' && Image.prototype.decode;\n\n/**\n * @type {boolean}\n */\nexport const PASSIVE_EVENT_LISTENERS = (function () {\n let passive = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get: function () {\n passive = true;\n },\n });\n\n window.addEventListener('_', null, options);\n window.removeEventListener('_', null, options);\n } catch (error) {\n // passive not supported\n }\n return passive;\n})();\n", "/**\n * @module ol/asserts\n */\nimport AssertionError from './AssertionError.js';\n\n/**\n * @param {*} assertion Assertion we expected to be truthy.\n * @param {number} errorCode Error code.\n */\nexport function assert(assertion, errorCode) {\n if (!assertion) {\n throw new AssertionError(errorCode);\n }\n}\n", "/**\n * @module ol/transform\n */\nimport {WORKER_OFFSCREEN_CANVAS} from './has.js';\nimport {assert} from './asserts.js';\n\n/**\n * An array representing an affine 2d transformation for use with\n * {@link module:ol/transform} functions. The array has 6 elements.\n * @typedef {!Array} Transform\n * @api\n */\n\n/**\n * Collection of affine 2d transformation functions. The functions work on an\n * array of 6 elements. The element order is compatible with the [SVGMatrix\n * interface](https://developer.mozilla.org/en-US/docs/Web/API/SVGMatrix) and is\n * a subset (elements a to f) of a 3\u00D73 matrix:\n * ```\n * [ a c e ]\n * [ b d f ]\n * [ 0 0 1 ]\n * ```\n */\n\n/**\n * @private\n * @type {Transform}\n */\nconst tmp_ = new Array(6);\n\n/**\n * Create an identity transform.\n * @return {!Transform} Identity transform.\n */\nexport function create() {\n return [1, 0, 0, 1, 0, 0];\n}\n\n/**\n * Resets the given transform to an identity transform.\n * @param {!Transform} transform Transform.\n * @return {!Transform} Transform.\n */\nexport function reset(transform) {\n return set(transform, 1, 0, 0, 1, 0, 0);\n}\n\n/**\n * Multiply the underlying matrices of two transforms and return the result in\n * the first transform.\n * @param {!Transform} transform1 Transform parameters of matrix 1.\n * @param {!Transform} transform2 Transform parameters of matrix 2.\n * @return {!Transform} transform1 multiplied with transform2.\n */\nexport function multiply(transform1, transform2) {\n const a1 = transform1[0];\n const b1 = transform1[1];\n const c1 = transform1[2];\n const d1 = transform1[3];\n const e1 = transform1[4];\n const f1 = transform1[5];\n const a2 = transform2[0];\n const b2 = transform2[1];\n const c2 = transform2[2];\n const d2 = transform2[3];\n const e2 = transform2[4];\n const f2 = transform2[5];\n\n transform1[0] = a1 * a2 + c1 * b2;\n transform1[1] = b1 * a2 + d1 * b2;\n transform1[2] = a1 * c2 + c1 * d2;\n transform1[3] = b1 * c2 + d1 * d2;\n transform1[4] = a1 * e2 + c1 * f2 + e1;\n transform1[5] = b1 * e2 + d1 * f2 + f1;\n\n return transform1;\n}\n\n/**\n * Set the transform components a-f on a given transform.\n * @param {!Transform} transform Transform.\n * @param {number} a The a component of the transform.\n * @param {number} b The b component of the transform.\n * @param {number} c The c component of the transform.\n * @param {number} d The d component of the transform.\n * @param {number} e The e component of the transform.\n * @param {number} f The f component of the transform.\n * @return {!Transform} Matrix with transform applied.\n */\nexport function set(transform, a, b, c, d, e, f) {\n transform[0] = a;\n transform[1] = b;\n transform[2] = c;\n transform[3] = d;\n transform[4] = e;\n transform[5] = f;\n return transform;\n}\n\n/**\n * Set transform on one matrix from another matrix.\n * @param {!Transform} transform1 Matrix to set transform to.\n * @param {!Transform} transform2 Matrix to set transform from.\n * @return {!Transform} transform1 with transform from transform2 applied.\n */\nexport function setFromArray(transform1, transform2) {\n transform1[0] = transform2[0];\n transform1[1] = transform2[1];\n transform1[2] = transform2[2];\n transform1[3] = transform2[3];\n transform1[4] = transform2[4];\n transform1[5] = transform2[5];\n return transform1;\n}\n\n/**\n * Transforms the given coordinate with the given transform returning the\n * resulting, transformed coordinate. The coordinate will be modified in-place.\n *\n * @param {Transform} transform The transformation.\n * @param {import(\"./coordinate.js\").Coordinate|import(\"./pixel.js\").Pixel} coordinate The coordinate to transform.\n * @return {import(\"./coordinate.js\").Coordinate|import(\"./pixel.js\").Pixel} return coordinate so that operations can be\n * chained together.\n */\nexport function apply(transform, coordinate) {\n const x = coordinate[0];\n const y = coordinate[1];\n coordinate[0] = transform[0] * x + transform[2] * y + transform[4];\n coordinate[1] = transform[1] * x + transform[3] * y + transform[5];\n return coordinate;\n}\n\n/**\n * Applies rotation to the given transform.\n * @param {!Transform} transform Transform.\n * @param {number} angle Angle in radians.\n * @return {!Transform} The rotated transform.\n */\nexport function rotate(transform, angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return multiply(transform, set(tmp_, cos, sin, -sin, cos, 0, 0));\n}\n\n/**\n * Applies scale to a given transform.\n * @param {!Transform} transform Transform.\n * @param {number} x Scale factor x.\n * @param {number} y Scale factor y.\n * @return {!Transform} The scaled transform.\n */\nexport function scale(transform, x, y) {\n return multiply(transform, set(tmp_, x, 0, 0, y, 0, 0));\n}\n\n/**\n * Creates a scale transform.\n * @param {!Transform} target Transform to overwrite.\n * @param {number} x Scale factor x.\n * @param {number} y Scale factor y.\n * @return {!Transform} The scale transform.\n */\nexport function makeScale(target, x, y) {\n return set(target, x, 0, 0, y, 0, 0);\n}\n\n/**\n * Applies translation to the given transform.\n * @param {!Transform} transform Transform.\n * @param {number} dx Translation x.\n * @param {number} dy Translation y.\n * @return {!Transform} The translated transform.\n */\nexport function translate(transform, dx, dy) {\n return multiply(transform, set(tmp_, 1, 0, 0, 1, dx, dy));\n}\n\n/**\n * Creates a composite transform given an initial translation, scale, rotation, and\n * final translation (in that order only, not commutative).\n * @param {!Transform} transform The transform (will be modified in place).\n * @param {number} dx1 Initial translation x.\n * @param {number} dy1 Initial translation y.\n * @param {number} sx Scale factor x.\n * @param {number} sy Scale factor y.\n * @param {number} angle Rotation (in counter-clockwise radians).\n * @param {number} dx2 Final translation x.\n * @param {number} dy2 Final translation y.\n * @return {!Transform} The composite transform.\n */\nexport function compose(transform, dx1, dy1, sx, sy, angle, dx2, dy2) {\n const sin = Math.sin(angle);\n const cos = Math.cos(angle);\n transform[0] = sx * cos;\n transform[1] = sy * sin;\n transform[2] = -sx * sin;\n transform[3] = sy * cos;\n transform[4] = dx2 * sx * cos - dy2 * sx * sin + dx1;\n transform[5] = dx2 * sy * sin + dy2 * sy * cos + dy1;\n return transform;\n}\n\n/**\n * Creates a composite transform given an initial translation, scale, rotation, and\n * final translation (in that order only, not commutative). The resulting transform\n * string can be applied as `transform` property of an HTMLElement's style.\n * @param {number} dx1 Initial translation x.\n * @param {number} dy1 Initial translation y.\n * @param {number} sx Scale factor x.\n * @param {number} sy Scale factor y.\n * @param {number} angle Rotation (in counter-clockwise radians).\n * @param {number} dx2 Final translation x.\n * @param {number} dy2 Final translation y.\n * @return {string} The composite css transform.\n * @api\n */\nexport function composeCssTransform(dx1, dy1, sx, sy, angle, dx2, dy2) {\n return toString(compose(create(), dx1, dy1, sx, sy, angle, dx2, dy2));\n}\n\n/**\n * Invert the given transform.\n * @param {!Transform} source The source transform to invert.\n * @return {!Transform} The inverted (source) transform.\n */\nexport function invert(source) {\n return makeInverse(source, source);\n}\n\n/**\n * Invert the given transform.\n * @param {!Transform} target Transform to be set as the inverse of\n * the source transform.\n * @param {!Transform} source The source transform to invert.\n * @return {!Transform} The inverted (target) transform.\n */\nexport function makeInverse(target, source) {\n const det = determinant(source);\n assert(det !== 0, 32); // Transformation matrix cannot be inverted\n\n const a = source[0];\n const b = source[1];\n const c = source[2];\n const d = source[3];\n const e = source[4];\n const f = source[5];\n\n target[0] = d / det;\n target[1] = -b / det;\n target[2] = -c / det;\n target[3] = a / det;\n target[4] = (c * f - d * e) / det;\n target[5] = -(a * f - b * e) / det;\n\n return target;\n}\n\n/**\n * Returns the determinant of the given matrix.\n * @param {!Transform} mat Matrix.\n * @return {number} Determinant.\n */\nexport function determinant(mat) {\n return mat[0] * mat[3] - mat[1] * mat[2];\n}\n\n/**\n * @type {HTMLElement}\n * @private\n */\nlet transformStringDiv;\n\n/**\n * A rounded string version of the transform. This can be used\n * for CSS transforms.\n * @param {!Transform} mat Matrix.\n * @return {string} The transform as a string.\n */\nexport function toString(mat) {\n const transformString = 'matrix(' + mat.join(', ') + ')';\n if (WORKER_OFFSCREEN_CANVAS) {\n return transformString;\n }\n const node =\n transformStringDiv || (transformStringDiv = document.createElement('div'));\n node.style.transform = transformString;\n return node.style.transform;\n}\n", "/**\n * @module ol/extent/Relationship\n */\n\n/**\n * Relationship to an extent.\n * @enum {number}\n */\nexport default {\n UNKNOWN: 0,\n INTERSECTING: 1,\n ABOVE: 2,\n RIGHT: 4,\n BELOW: 8,\n LEFT: 16,\n};\n", "/**\n * @module ol/extent\n */\nimport Relationship from './extent/Relationship.js';\nimport {assert} from './asserts.js';\n\n/**\n * An array of numbers representing an extent: `[minx, miny, maxx, maxy]`.\n * @typedef {Array} Extent\n * @api\n */\n\n/**\n * Extent corner.\n * @typedef {'bottom-left' | 'bottom-right' | 'top-left' | 'top-right'} Corner\n */\n\n/**\n * Build an extent that includes all given coordinates.\n *\n * @param {Array} coordinates Coordinates.\n * @return {Extent} Bounding extent.\n * @api\n */\nexport function boundingExtent(coordinates) {\n const extent = createEmpty();\n for (let i = 0, ii = coordinates.length; i < ii; ++i) {\n extendCoordinate(extent, coordinates[i]);\n }\n return extent;\n}\n\n/**\n * @param {Array} xs Xs.\n * @param {Array} ys Ys.\n * @param {Extent} [dest] Destination extent.\n * @private\n * @return {Extent} Extent.\n */\nfunction _boundingExtentXYs(xs, ys, dest) {\n const minX = Math.min.apply(null, xs);\n const minY = Math.min.apply(null, ys);\n const maxX = Math.max.apply(null, xs);\n const maxY = Math.max.apply(null, ys);\n return createOrUpdate(minX, minY, maxX, maxY, dest);\n}\n\n/**\n * Return extent increased by the provided value.\n * @param {Extent} extent Extent.\n * @param {number} value The amount by which the extent should be buffered.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n * @api\n */\nexport function buffer(extent, value, dest) {\n if (dest) {\n dest[0] = extent[0] - value;\n dest[1] = extent[1] - value;\n dest[2] = extent[2] + value;\n dest[3] = extent[3] + value;\n return dest;\n }\n return [\n extent[0] - value,\n extent[1] - value,\n extent[2] + value,\n extent[3] + value,\n ];\n}\n\n/**\n * Creates a clone of an extent.\n *\n * @param {Extent} extent Extent to clone.\n * @param {Extent} [dest] Extent.\n * @return {Extent} The clone.\n */\nexport function clone(extent, dest) {\n if (dest) {\n dest[0] = extent[0];\n dest[1] = extent[1];\n dest[2] = extent[2];\n dest[3] = extent[3];\n return dest;\n }\n return extent.slice();\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {number} Closest squared distance.\n */\nexport function closestSquaredDistanceXY(extent, x, y) {\n let dx, dy;\n if (x < extent[0]) {\n dx = extent[0] - x;\n } else if (extent[2] < x) {\n dx = x - extent[2];\n } else {\n dx = 0;\n }\n if (y < extent[1]) {\n dy = extent[1] - y;\n } else if (extent[3] < y) {\n dy = y - extent[3];\n } else {\n dy = 0;\n }\n return dx * dx + dy * dy;\n}\n\n/**\n * Check if the passed coordinate is contained or on the edge of the extent.\n *\n * @param {Extent} extent Extent.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {boolean} The coordinate is contained in the extent.\n * @api\n */\nexport function containsCoordinate(extent, coordinate) {\n return containsXY(extent, coordinate[0], coordinate[1]);\n}\n\n/**\n * Check if one extent contains another.\n *\n * An extent is deemed contained if it lies completely within the other extent,\n * including if they share one or more edges.\n *\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {boolean} The second extent is contained by or on the edge of the\n * first.\n * @api\n */\nexport function containsExtent(extent1, extent2) {\n return (\n extent1[0] <= extent2[0] &&\n extent2[2] <= extent1[2] &&\n extent1[1] <= extent2[1] &&\n extent2[3] <= extent1[3]\n );\n}\n\n/**\n * Check if the passed coordinate is contained or on the edge of the extent.\n *\n * @param {Extent} extent Extent.\n * @param {number} x X coordinate.\n * @param {number} y Y coordinate.\n * @return {boolean} The x, y values are contained in the extent.\n * @api\n */\nexport function containsXY(extent, x, y) {\n return extent[0] <= x && x <= extent[2] && extent[1] <= y && y <= extent[3];\n}\n\n/**\n * Get the relationship between a coordinate and extent.\n * @param {Extent} extent The extent.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate The coordinate.\n * @return {import(\"./extent/Relationship.js\").default} The relationship (bitwise compare with\n * import(\"./extent/Relationship.js\").Relationship).\n */\nexport function coordinateRelationship(extent, coordinate) {\n const minX = extent[0];\n const minY = extent[1];\n const maxX = extent[2];\n const maxY = extent[3];\n const x = coordinate[0];\n const y = coordinate[1];\n let relationship = Relationship.UNKNOWN;\n if (x < minX) {\n relationship = relationship | Relationship.LEFT;\n } else if (x > maxX) {\n relationship = relationship | Relationship.RIGHT;\n }\n if (y < minY) {\n relationship = relationship | Relationship.BELOW;\n } else if (y > maxY) {\n relationship = relationship | Relationship.ABOVE;\n }\n if (relationship === Relationship.UNKNOWN) {\n relationship = Relationship.INTERSECTING;\n }\n return relationship;\n}\n\n/**\n * Create an empty extent.\n * @return {Extent} Empty extent.\n * @api\n */\nexport function createEmpty() {\n return [Infinity, Infinity, -Infinity, -Infinity];\n}\n\n/**\n * Create a new extent or update the provided extent.\n * @param {number} minX Minimum X.\n * @param {number} minY Minimum Y.\n * @param {number} maxX Maximum X.\n * @param {number} maxY Maximum Y.\n * @param {Extent} [dest] Destination extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdate(minX, minY, maxX, maxY, dest) {\n if (dest) {\n dest[0] = minX;\n dest[1] = minY;\n dest[2] = maxX;\n dest[3] = maxY;\n return dest;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/**\n * Create a new empty extent or make the provided one empty.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdateEmpty(dest) {\n return createOrUpdate(Infinity, Infinity, -Infinity, -Infinity, dest);\n}\n\n/**\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdateFromCoordinate(coordinate, dest) {\n const x = coordinate[0];\n const y = coordinate[1];\n return createOrUpdate(x, y, x, y, dest);\n}\n\n/**\n * @param {Array} coordinates Coordinates.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdateFromCoordinates(coordinates, dest) {\n const extent = createOrUpdateEmpty(dest);\n return extendCoordinates(extent, coordinates);\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdateFromFlatCoordinates(\n flatCoordinates,\n offset,\n end,\n stride,\n dest\n) {\n const extent = createOrUpdateEmpty(dest);\n return extendFlatCoordinates(extent, flatCoordinates, offset, end, stride);\n}\n\n/**\n * @param {Array>} rings Rings.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdateFromRings(rings, dest) {\n const extent = createOrUpdateEmpty(dest);\n return extendRings(extent, rings);\n}\n\n/**\n * Determine if two extents are equivalent.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {boolean} The two extents are equivalent.\n * @api\n */\nexport function equals(extent1, extent2) {\n return (\n extent1[0] == extent2[0] &&\n extent1[2] == extent2[2] &&\n extent1[1] == extent2[1] &&\n extent1[3] == extent2[3]\n );\n}\n\n/**\n * Determine if two extents are approximately equivalent.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @param {number} tolerance Tolerance in extent coordinate units.\n * @return {boolean} The two extents differ by less than the tolerance.\n */\nexport function approximatelyEquals(extent1, extent2, tolerance) {\n return (\n Math.abs(extent1[0] - extent2[0]) < tolerance &&\n Math.abs(extent1[2] - extent2[2]) < tolerance &&\n Math.abs(extent1[1] - extent2[1]) < tolerance &&\n Math.abs(extent1[3] - extent2[3]) < tolerance\n );\n}\n\n/**\n * Modify an extent to include another extent.\n * @param {Extent} extent1 The extent to be modified.\n * @param {Extent} extent2 The extent that will be included in the first.\n * @return {Extent} A reference to the first (extended) extent.\n * @api\n */\nexport function extend(extent1, extent2) {\n if (extent2[0] < extent1[0]) {\n extent1[0] = extent2[0];\n }\n if (extent2[2] > extent1[2]) {\n extent1[2] = extent2[2];\n }\n if (extent2[1] < extent1[1]) {\n extent1[1] = extent2[1];\n }\n if (extent2[3] > extent1[3]) {\n extent1[3] = extent2[3];\n }\n return extent1;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n */\nexport function extendCoordinate(extent, coordinate) {\n if (coordinate[0] < extent[0]) {\n extent[0] = coordinate[0];\n }\n if (coordinate[0] > extent[2]) {\n extent[2] = coordinate[0];\n }\n if (coordinate[1] < extent[1]) {\n extent[1] = coordinate[1];\n }\n if (coordinate[1] > extent[3]) {\n extent[3] = coordinate[1];\n }\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {Array} coordinates Coordinates.\n * @return {Extent} Extent.\n */\nexport function extendCoordinates(extent, coordinates) {\n for (let i = 0, ii = coordinates.length; i < ii; ++i) {\n extendCoordinate(extent, coordinates[i]);\n }\n return extent;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {Extent} Extent.\n */\nexport function extendFlatCoordinates(\n extent,\n flatCoordinates,\n offset,\n end,\n stride\n) {\n for (; offset < end; offset += stride) {\n extendXY(extent, flatCoordinates[offset], flatCoordinates[offset + 1]);\n }\n return extent;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {Array>} rings Rings.\n * @return {Extent} Extent.\n */\nexport function extendRings(extent, rings) {\n for (let i = 0, ii = rings.length; i < ii; ++i) {\n extendCoordinates(extent, rings[i]);\n }\n return extent;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {number} x X.\n * @param {number} y Y.\n */\nexport function extendXY(extent, x, y) {\n extent[0] = Math.min(extent[0], x);\n extent[1] = Math.min(extent[1], y);\n extent[2] = Math.max(extent[2], x);\n extent[3] = Math.max(extent[3], y);\n}\n\n/**\n * This function calls `callback` for each corner of the extent. If the\n * callback returns a truthy value the function returns that value\n * immediately. Otherwise the function returns `false`.\n * @param {Extent} extent Extent.\n * @param {function(import(\"./coordinate.js\").Coordinate): S} callback Callback.\n * @return {S|boolean} Value.\n * @template S\n */\nexport function forEachCorner(extent, callback) {\n let val;\n val = callback(getBottomLeft(extent));\n if (val) {\n return val;\n }\n val = callback(getBottomRight(extent));\n if (val) {\n return val;\n }\n val = callback(getTopRight(extent));\n if (val) {\n return val;\n }\n val = callback(getTopLeft(extent));\n if (val) {\n return val;\n }\n return false;\n}\n\n/**\n * Get the size of an extent.\n * @param {Extent} extent Extent.\n * @return {number} Area.\n * @api\n */\nexport function getArea(extent) {\n let area = 0;\n if (!isEmpty(extent)) {\n area = getWidth(extent) * getHeight(extent);\n }\n return area;\n}\n\n/**\n * Get the bottom left coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import(\"./coordinate.js\").Coordinate} Bottom left coordinate.\n * @api\n */\nexport function getBottomLeft(extent) {\n return [extent[0], extent[1]];\n}\n\n/**\n * Get the bottom right coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import(\"./coordinate.js\").Coordinate} Bottom right coordinate.\n * @api\n */\nexport function getBottomRight(extent) {\n return [extent[2], extent[1]];\n}\n\n/**\n * Get the center coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import(\"./coordinate.js\").Coordinate} Center.\n * @api\n */\nexport function getCenter(extent) {\n return [(extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2];\n}\n\n/**\n * Get a corner coordinate of an extent.\n * @param {Extent} extent Extent.\n * @param {Corner} corner Corner.\n * @return {import(\"./coordinate.js\").Coordinate} Corner coordinate.\n */\nexport function getCorner(extent, corner) {\n let coordinate;\n if (corner === 'bottom-left') {\n coordinate = getBottomLeft(extent);\n } else if (corner === 'bottom-right') {\n coordinate = getBottomRight(extent);\n } else if (corner === 'top-left') {\n coordinate = getTopLeft(extent);\n } else if (corner === 'top-right') {\n coordinate = getTopRight(extent);\n } else {\n assert(false, 13); // Invalid corner\n }\n return coordinate;\n}\n\n/**\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {number} Enlarged area.\n */\nexport function getEnlargedArea(extent1, extent2) {\n const minX = Math.min(extent1[0], extent2[0]);\n const minY = Math.min(extent1[1], extent2[1]);\n const maxX = Math.max(extent1[2], extent2[2]);\n const maxY = Math.max(extent1[3], extent2[3]);\n return (maxX - minX) * (maxY - minY);\n}\n\n/**\n * @param {import(\"./coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {import(\"./size.js\").Size} size Size.\n * @param {Extent} [dest] Destination extent.\n * @return {Extent} Extent.\n */\nexport function getForViewAndSize(center, resolution, rotation, size, dest) {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = getRotatedViewport(\n center,\n resolution,\n rotation,\n size\n );\n return createOrUpdate(\n Math.min(x0, x1, x2, x3),\n Math.min(y0, y1, y2, y3),\n Math.max(x0, x1, x2, x3),\n Math.max(y0, y1, y2, y3),\n dest\n );\n}\n\n/**\n * @param {import(\"./coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {import(\"./size.js\").Size} size Size.\n * @return {Array} Linear ring representing the viewport.\n */\nexport function getRotatedViewport(center, resolution, rotation, size) {\n const dx = (resolution * size[0]) / 2;\n const dy = (resolution * size[1]) / 2;\n const cosRotation = Math.cos(rotation);\n const sinRotation = Math.sin(rotation);\n const xCos = dx * cosRotation;\n const xSin = dx * sinRotation;\n const yCos = dy * cosRotation;\n const ySin = dy * sinRotation;\n const x = center[0];\n const y = center[1];\n return [\n x - xCos + ySin,\n y - xSin - yCos,\n x - xCos - ySin,\n y - xSin + yCos,\n x + xCos - ySin,\n y + xSin + yCos,\n x + xCos + ySin,\n y + xSin - yCos,\n x - xCos + ySin,\n y - xSin - yCos,\n ];\n}\n\n/**\n * Get the height of an extent.\n * @param {Extent} extent Extent.\n * @return {number} Height.\n * @api\n */\nexport function getHeight(extent) {\n return extent[3] - extent[1];\n}\n\n/**\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {number} Intersection area.\n */\nexport function getIntersectionArea(extent1, extent2) {\n const intersection = getIntersection(extent1, extent2);\n return getArea(intersection);\n}\n\n/**\n * Get the intersection of two extents.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @param {Extent} [dest] Optional extent to populate with intersection.\n * @return {Extent} Intersecting extent.\n * @api\n */\nexport function getIntersection(extent1, extent2, dest) {\n const intersection = dest ? dest : createEmpty();\n if (intersects(extent1, extent2)) {\n if (extent1[0] > extent2[0]) {\n intersection[0] = extent1[0];\n } else {\n intersection[0] = extent2[0];\n }\n if (extent1[1] > extent2[1]) {\n intersection[1] = extent1[1];\n } else {\n intersection[1] = extent2[1];\n }\n if (extent1[2] < extent2[2]) {\n intersection[2] = extent1[2];\n } else {\n intersection[2] = extent2[2];\n }\n if (extent1[3] < extent2[3]) {\n intersection[3] = extent1[3];\n } else {\n intersection[3] = extent2[3];\n }\n } else {\n createOrUpdateEmpty(intersection);\n }\n return intersection;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @return {number} Margin.\n */\nexport function getMargin(extent) {\n return getWidth(extent) + getHeight(extent);\n}\n\n/**\n * Get the size (width, height) of an extent.\n * @param {Extent} extent The extent.\n * @return {import(\"./size.js\").Size} The extent size.\n * @api\n */\nexport function getSize(extent) {\n return [extent[2] - extent[0], extent[3] - extent[1]];\n}\n\n/**\n * Get the top left coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import(\"./coordinate.js\").Coordinate} Top left coordinate.\n * @api\n */\nexport function getTopLeft(extent) {\n return [extent[0], extent[3]];\n}\n\n/**\n * Get the top right coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import(\"./coordinate.js\").Coordinate} Top right coordinate.\n * @api\n */\nexport function getTopRight(extent) {\n return [extent[2], extent[3]];\n}\n\n/**\n * Get the width of an extent.\n * @param {Extent} extent Extent.\n * @return {number} Width.\n * @api\n */\nexport function getWidth(extent) {\n return extent[2] - extent[0];\n}\n\n/**\n * Determine if one extent intersects another.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent.\n * @return {boolean} The two extents intersect.\n * @api\n */\nexport function intersects(extent1, extent2) {\n return (\n extent1[0] <= extent2[2] &&\n extent1[2] >= extent2[0] &&\n extent1[1] <= extent2[3] &&\n extent1[3] >= extent2[1]\n );\n}\n\n/**\n * Determine if an extent is empty.\n * @param {Extent} extent Extent.\n * @return {boolean} Is empty.\n * @api\n */\nexport function isEmpty(extent) {\n return extent[2] < extent[0] || extent[3] < extent[1];\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function returnOrUpdate(extent, dest) {\n if (dest) {\n dest[0] = extent[0];\n dest[1] = extent[1];\n dest[2] = extent[2];\n dest[3] = extent[3];\n return dest;\n }\n return extent;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {number} value Value.\n */\nexport function scaleFromCenter(extent, value) {\n const deltaX = ((extent[2] - extent[0]) / 2) * (value - 1);\n const deltaY = ((extent[3] - extent[1]) / 2) * (value - 1);\n extent[0] -= deltaX;\n extent[2] += deltaX;\n extent[1] -= deltaY;\n extent[3] += deltaY;\n}\n\n/**\n * Determine if the segment between two coordinates intersects (crosses,\n * touches, or is contained by) the provided extent.\n * @param {Extent} extent The extent.\n * @param {import(\"./coordinate.js\").Coordinate} start Segment start coordinate.\n * @param {import(\"./coordinate.js\").Coordinate} end Segment end coordinate.\n * @return {boolean} The segment intersects the extent.\n */\nexport function intersectsSegment(extent, start, end) {\n let intersects = false;\n const startRel = coordinateRelationship(extent, start);\n const endRel = coordinateRelationship(extent, end);\n if (\n startRel === Relationship.INTERSECTING ||\n endRel === Relationship.INTERSECTING\n ) {\n intersects = true;\n } else {\n const minX = extent[0];\n const minY = extent[1];\n const maxX = extent[2];\n const maxY = extent[3];\n const startX = start[0];\n const startY = start[1];\n const endX = end[0];\n const endY = end[1];\n const slope = (endY - startY) / (endX - startX);\n let x, y;\n if (!!(endRel & Relationship.ABOVE) && !(startRel & Relationship.ABOVE)) {\n // potentially intersects top\n x = endX - (endY - maxY) / slope;\n intersects = x >= minX && x <= maxX;\n }\n if (\n !intersects &&\n !!(endRel & Relationship.RIGHT) &&\n !(startRel & Relationship.RIGHT)\n ) {\n // potentially intersects right\n y = endY - (endX - maxX) * slope;\n intersects = y >= minY && y <= maxY;\n }\n if (\n !intersects &&\n !!(endRel & Relationship.BELOW) &&\n !(startRel & Relationship.BELOW)\n ) {\n // potentially intersects bottom\n x = endX - (endY - minY) / slope;\n intersects = x >= minX && x <= maxX;\n }\n if (\n !intersects &&\n !!(endRel & Relationship.LEFT) &&\n !(startRel & Relationship.LEFT)\n ) {\n // potentially intersects left\n y = endY - (endX - minX) * slope;\n intersects = y >= minY && y <= maxY;\n }\n }\n return intersects;\n}\n\n/**\n * Apply a transform function to the extent.\n * @param {Extent} extent Extent.\n * @param {import(\"./proj.js\").TransformFunction} transformFn Transform function.\n * Called with `[minX, minY, maxX, maxY]` extent coordinates.\n * @param {Extent} [dest] Destination extent.\n * @param {number} [stops] Number of stops per side used for the transform.\n * By default only the corners are used.\n * @return {Extent} Extent.\n * @api\n */\nexport function applyTransform(extent, transformFn, dest, stops) {\n if (isEmpty(extent)) {\n return createOrUpdateEmpty(dest);\n }\n let coordinates = [];\n if (stops > 1) {\n const width = extent[2] - extent[0];\n const height = extent[3] - extent[1];\n for (let i = 0; i < stops; ++i) {\n coordinates.push(\n extent[0] + (width * i) / stops,\n extent[1],\n extent[2],\n extent[1] + (height * i) / stops,\n extent[2] - (width * i) / stops,\n extent[3],\n extent[0],\n extent[3] - (height * i) / stops\n );\n }\n } else {\n coordinates = [\n extent[0],\n extent[1],\n extent[2],\n extent[1],\n extent[2],\n extent[3],\n extent[0],\n extent[3],\n ];\n }\n transformFn(coordinates, coordinates, 2);\n const xs = [];\n const ys = [];\n for (let i = 0, l = coordinates.length; i < l; i += 2) {\n xs.push(coordinates[i]);\n ys.push(coordinates[i + 1]);\n }\n return _boundingExtentXYs(xs, ys, dest);\n}\n\n/**\n * Modifies the provided extent in-place to be within the real world\n * extent.\n *\n * @param {Extent} extent Extent.\n * @param {import(\"./proj/Projection.js\").default} projection Projection\n * @return {Extent} The extent within the real world extent.\n */\nexport function wrapX(extent, projection) {\n const projectionExtent = projection.getExtent();\n const center = getCenter(extent);\n if (\n projection.canWrapX() &&\n (center[0] < projectionExtent[0] || center[0] >= projectionExtent[2])\n ) {\n const worldWidth = getWidth(projectionExtent);\n const worldsAway = Math.floor(\n (center[0] - projectionExtent[0]) / worldWidth\n );\n const offset = worldsAway * worldWidth;\n extent[0] -= offset;\n extent[2] -= offset;\n }\n return extent;\n}\n\n/**\n * Fits the extent to the real world\n *\n * If the extent does not cross the anti meridian, this will return the extent in an array\n * If the extent crosses the anti meridian, the extent will be sliced, so each part fits within the\n * real world\n *\n *\n * @param {Extent} extent Extent.\n * @param {import(\"./proj/Projection.js\").default} projection Projection\n * @return {Array} The extent within the real world extent.\n */\nexport function wrapAndSliceX(extent, projection) {\n if (projection.canWrapX()) {\n const projectionExtent = projection.getExtent();\n\n if (!isFinite(extent[0]) || !isFinite(extent[2])) {\n return [[projectionExtent[0], extent[1], projectionExtent[2], extent[3]]];\n }\n\n wrapX(extent, projection);\n const worldWidth = getWidth(projectionExtent);\n\n if (getWidth(extent) > worldWidth) {\n // the extent wraps around on itself\n return [[projectionExtent[0], extent[1], projectionExtent[2], extent[3]]];\n }\n if (extent[0] < projectionExtent[0]) {\n // the extent crosses the anti meridian, so it needs to be sliced\n return [\n [extent[0] + worldWidth, extent[1], projectionExtent[2], extent[3]],\n [projectionExtent[0], extent[1], extent[2], extent[3]],\n ];\n }\n if (extent[2] > projectionExtent[2]) {\n // the extent crosses the anti meridian, so it needs to be sliced\n return [\n [extent[0], extent[1], projectionExtent[2], extent[3]],\n [projectionExtent[0], extent[1], extent[2] - worldWidth, extent[3]],\n ];\n }\n }\n\n return [extent];\n}\n", "/**\n * @module ol/math\n */\n\n/**\n * Takes a number and clamps it to within the provided bounds.\n * @param {number} value The input number.\n * @param {number} min The minimum value to return.\n * @param {number} max The maximum value to return.\n * @return {number} The input number if it is within bounds, or the nearest\n * number within the bounds.\n */\nexport function clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Returns the square of the closest distance between the point (x, y) and the\n * line segment (x1, y1) to (x2, y2).\n * @param {number} x X.\n * @param {number} y Y.\n * @param {number} x1 X1.\n * @param {number} y1 Y1.\n * @param {number} x2 X2.\n * @param {number} y2 Y2.\n * @return {number} Squared distance.\n */\nexport function squaredSegmentDistance(x, y, x1, y1, x2, y2) {\n const dx = x2 - x1;\n const dy = y2 - y1;\n if (dx !== 0 || dy !== 0) {\n const t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);\n if (t > 1) {\n x1 = x2;\n y1 = y2;\n } else if (t > 0) {\n x1 += dx * t;\n y1 += dy * t;\n }\n }\n return squaredDistance(x, y, x1, y1);\n}\n\n/**\n * Returns the square of the distance between the points (x1, y1) and (x2, y2).\n * @param {number} x1 X1.\n * @param {number} y1 Y1.\n * @param {number} x2 X2.\n * @param {number} y2 Y2.\n * @return {number} Squared distance.\n */\nexport function squaredDistance(x1, y1, x2, y2) {\n const dx = x2 - x1;\n const dy = y2 - y1;\n return dx * dx + dy * dy;\n}\n\n/**\n * Solves system of linear equations using Gaussian elimination method.\n *\n * @param {Array>} mat Augmented matrix (n x n + 1 column)\n * in row-major order.\n * @return {Array} The resulting vector.\n */\nexport function solveLinearSystem(mat) {\n const n = mat.length;\n\n for (let i = 0; i < n; i++) {\n // Find max in the i-th column (ignoring i - 1 first rows)\n let maxRow = i;\n let maxEl = Math.abs(mat[i][i]);\n for (let r = i + 1; r < n; r++) {\n const absValue = Math.abs(mat[r][i]);\n if (absValue > maxEl) {\n maxEl = absValue;\n maxRow = r;\n }\n }\n\n if (maxEl === 0) {\n return null; // matrix is singular\n }\n\n // Swap max row with i-th (current) row\n const tmp = mat[maxRow];\n mat[maxRow] = mat[i];\n mat[i] = tmp;\n\n // Subtract the i-th row to make all the remaining rows 0 in the i-th column\n for (let j = i + 1; j < n; j++) {\n const coef = -mat[j][i] / mat[i][i];\n for (let k = i; k < n + 1; k++) {\n if (i == k) {\n mat[j][k] = 0;\n } else {\n mat[j][k] += coef * mat[i][k];\n }\n }\n }\n }\n\n // Solve Ax=b for upper triangular matrix A (mat)\n const x = new Array(n);\n for (let l = n - 1; l >= 0; l--) {\n x[l] = mat[l][n] / mat[l][l];\n for (let m = l - 1; m >= 0; m--) {\n mat[m][n] -= mat[m][l] * x[l];\n }\n }\n return x;\n}\n\n/**\n * Converts radians to to degrees.\n *\n * @param {number} angleInRadians Angle in radians.\n * @return {number} Angle in degrees.\n */\nexport function toDegrees(angleInRadians) {\n return (angleInRadians * 180) / Math.PI;\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} angleInDegrees Angle in degrees.\n * @return {number} Angle in radians.\n */\nexport function toRadians(angleInDegrees) {\n return (angleInDegrees * Math.PI) / 180;\n}\n\n/**\n * Returns the modulo of a / b, depending on the sign of b.\n *\n * @param {number} a Dividend.\n * @param {number} b Divisor.\n * @return {number} Modulo.\n */\nexport function modulo(a, b) {\n const r = a % b;\n return r * b < 0 ? r + b : r;\n}\n\n/**\n * Calculates the linearly interpolated value of x between a and b.\n *\n * @param {number} a Number\n * @param {number} b Number\n * @param {number} x Value to be interpolated.\n * @return {number} Interpolated value.\n */\nexport function lerp(a, b, x) {\n return a + x * (b - a);\n}\n\n/**\n * Returns a number with a limited number of decimal digits.\n * @param {number} n The input number.\n * @param {number} decimals The maximum number of decimal digits.\n * @return {number} The input number with a limited number of decimal digits.\n */\nexport function toFixed(n, decimals) {\n const factor = Math.pow(10, decimals);\n return Math.round(n * factor) / factor;\n}\n\n/**\n * Rounds a number to the nearest integer value considering only the given number\n * of decimal digits (with rounding on the final digit).\n * @param {number} n The input number.\n * @param {number} decimals The maximum number of decimal digits.\n * @return {number} The nearest integer.\n */\nexport function round(n, decimals) {\n return Math.round(toFixed(n, decimals));\n}\n\n/**\n * Rounds a number to the next smaller integer considering only the given number\n * of decimal digits (with rounding on the final digit).\n * @param {number} n The input number.\n * @param {number} decimals The maximum number of decimal digits.\n * @return {number} The next smaller integer.\n */\nexport function floor(n, decimals) {\n return Math.floor(toFixed(n, decimals));\n}\n\n/**\n * Rounds a number to the next bigger integer considering only the given number\n * of decimal digits (with rounding on the final digit).\n * @param {number} n The input number.\n * @param {number} decimals The maximum number of decimal digits.\n * @return {number} The next bigger integer.\n */\nexport function ceil(n, decimals) {\n return Math.ceil(toFixed(n, decimals));\n}\n", "/**\n * @module ol/color\n */\nimport {assert} from './asserts.js';\nimport {clamp} from './math.js';\n\n/**\n * A color represented as a short array [red, green, blue, alpha].\n * red, green, and blue should be integers in the range 0..255 inclusive.\n * alpha should be a float in the range 0..1 inclusive. If no alpha value is\n * given then `1` will be used.\n * @typedef {Array} Color\n * @api\n */\n\n/**\n * This RegExp matches # followed by 3, 4, 6, or 8 hex digits.\n * @const\n * @type {RegExp}\n * @private\n */\nconst HEX_COLOR_RE_ = /^#([a-f0-9]{3}|[a-f0-9]{4}(?:[a-f0-9]{2}){0,2})$/i;\n\n/**\n * Regular expression for matching potential named color style strings.\n * @const\n * @type {RegExp}\n * @private\n */\nconst NAMED_COLOR_RE_ = /^([a-z]*)$|^hsla?\\(.*\\)$/i;\n\n/**\n * Return the color as an rgba string.\n * @param {Color|string} color Color.\n * @return {string} Rgba string.\n * @api\n */\nexport function asString(color) {\n if (typeof color === 'string') {\n return color;\n }\n return toString(color);\n}\n\n/**\n * Return named color as an rgba string.\n * @param {string} color Named color.\n * @return {string} Rgb string.\n */\nfunction fromNamed(color) {\n const el = document.createElement('div');\n el.style.color = color;\n if (el.style.color !== '') {\n document.body.appendChild(el);\n const rgb = getComputedStyle(el).color;\n document.body.removeChild(el);\n return rgb;\n }\n return '';\n}\n\n/**\n * @param {string} s String.\n * @return {Color} Color.\n */\nexport const fromString = (function () {\n // We maintain a small cache of parsed strings. To provide cheap LRU-like\n // semantics, whenever the cache grows too large we simply delete an\n // arbitrary 25% of the entries.\n\n /**\n * @const\n * @type {number}\n */\n const MAX_CACHE_SIZE = 1024;\n\n /**\n * @type {Object}\n */\n const cache = {};\n\n /**\n * @type {number}\n */\n let cacheSize = 0;\n\n return (\n /**\n * @param {string} s String.\n * @return {Color} Color.\n */\n function (s) {\n let color;\n if (cache.hasOwnProperty(s)) {\n color = cache[s];\n } else {\n if (cacheSize >= MAX_CACHE_SIZE) {\n let i = 0;\n for (const key in cache) {\n if ((i++ & 3) === 0) {\n delete cache[key];\n --cacheSize;\n }\n }\n }\n color = fromStringInternal_(s);\n cache[s] = color;\n ++cacheSize;\n }\n return color;\n }\n );\n})();\n\n/**\n * Return the color as an array. This function maintains a cache of calculated\n * arrays which means the result should not be modified.\n * @param {Color|string} color Color.\n * @return {Color} Color.\n * @api\n */\nexport function asArray(color) {\n if (Array.isArray(color)) {\n return color;\n }\n return fromString(color);\n}\n\n/**\n * @param {string} s String.\n * @private\n * @return {Color} Color.\n */\nfunction fromStringInternal_(s) {\n let r, g, b, a, color;\n\n if (NAMED_COLOR_RE_.exec(s)) {\n s = fromNamed(s);\n }\n\n if (HEX_COLOR_RE_.exec(s)) {\n // hex\n const n = s.length - 1; // number of hex digits\n let d; // number of digits per channel\n if (n <= 4) {\n d = 1;\n } else {\n d = 2;\n }\n const hasAlpha = n === 4 || n === 8;\n r = parseInt(s.substr(1 + 0 * d, d), 16);\n g = parseInt(s.substr(1 + 1 * d, d), 16);\n b = parseInt(s.substr(1 + 2 * d, d), 16);\n if (hasAlpha) {\n a = parseInt(s.substr(1 + 3 * d, d), 16);\n } else {\n a = 255;\n }\n if (d == 1) {\n r = (r << 4) + r;\n g = (g << 4) + g;\n b = (b << 4) + b;\n if (hasAlpha) {\n a = (a << 4) + a;\n }\n }\n color = [r, g, b, a / 255];\n } else if (s.startsWith('rgba(')) {\n // rgba()\n color = s.slice(5, -1).split(',').map(Number);\n normalize(color);\n } else if (s.startsWith('rgb(')) {\n // rgb()\n color = s.slice(4, -1).split(',').map(Number);\n color.push(1);\n normalize(color);\n } else {\n assert(false, 14); // Invalid color\n }\n return color;\n}\n\n/**\n * TODO this function is only used in the test, we probably shouldn't export it\n * @param {Color} color Color.\n * @return {Color} Clamped color.\n */\nexport function normalize(color) {\n color[0] = clamp((color[0] + 0.5) | 0, 0, 255);\n color[1] = clamp((color[1] + 0.5) | 0, 0, 255);\n color[2] = clamp((color[2] + 0.5) | 0, 0, 255);\n color[3] = clamp(color[3], 0, 1);\n return color;\n}\n\n/**\n * @param {Color} color Color.\n * @return {string} String.\n */\nexport function toString(color) {\n let r = color[0];\n if (r != (r | 0)) {\n r = (r + 0.5) | 0;\n }\n let g = color[1];\n if (g != (g | 0)) {\n g = (g + 0.5) | 0;\n }\n let b = color[2];\n if (b != (b | 0)) {\n b = (b + 0.5) | 0;\n }\n const a = color[3] === undefined ? 1 : Math.round(color[3] * 100) / 100;\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n}\n\n/**\n * @param {string} s String.\n * @return {boolean} Whether the string is actually a valid color\n */\nexport function isStringColor(s) {\n if (NAMED_COLOR_RE_.test(s)) {\n s = fromNamed(s);\n }\n return HEX_COLOR_RE_.test(s) || s.startsWith('rgba(') || s.startsWith('rgb(');\n}\n", "/**\n * @module ol/style/IconImageCache\n */\nimport {asString} from '../color.js';\n\n/**\n * @classdesc\n * Singleton class. Available through {@link module:ol/style/IconImageCache.shared}.\n */\nclass IconImageCache {\n constructor() {\n /**\n * @type {!Object}\n * @private\n */\n this.cache_ = {};\n\n /**\n * @type {number}\n * @private\n */\n this.cacheSize_ = 0;\n\n /**\n * @type {number}\n * @private\n */\n this.maxCacheSize_ = 32;\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.cache_ = {};\n this.cacheSize_ = 0;\n }\n\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n return this.cacheSize_ > this.maxCacheSize_;\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n expire() {\n if (this.canExpireCache()) {\n let i = 0;\n for (const key in this.cache_) {\n const iconImage = this.cache_[key];\n if ((i++ & 3) === 0 && !iconImage.hasListener()) {\n delete this.cache_[key];\n --this.cacheSize_;\n }\n }\n }\n }\n\n /**\n * @param {string} src Src.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"../color.js\").Color} color Color.\n * @return {import(\"./IconImage.js\").default} Icon image.\n */\n get(src, crossOrigin, color) {\n const key = getKey(src, crossOrigin, color);\n return key in this.cache_ ? this.cache_[key] : null;\n }\n\n /**\n * @param {string} src Src.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"../color.js\").Color} color Color.\n * @param {import(\"./IconImage.js\").default} iconImage Icon image.\n */\n set(src, crossOrigin, color, iconImage) {\n const key = getKey(src, crossOrigin, color);\n this.cache_[key] = iconImage;\n ++this.cacheSize_;\n }\n\n /**\n * Set the cache size of the icon cache. Default is `32`. Change this value when\n * your map uses more than 32 different icon images and you are not caching icon\n * styles on the application level.\n * @param {number} maxCacheSize Cache max size.\n * @api\n */\n setSize(maxCacheSize) {\n this.maxCacheSize_ = maxCacheSize;\n this.expire();\n }\n}\n\n/**\n * @param {string} src Src.\n * @param {?string} crossOrigin Cross origin.\n * @param {import(\"../color.js\").Color} color Color.\n * @return {string} Cache key.\n */\nfunction getKey(src, crossOrigin, color) {\n const colorString = color ? asString(color) : 'null';\n return crossOrigin + ':' + src + ':' + colorString;\n}\n\nexport default IconImageCache;\n\n/**\n * The {@link module:ol/style/IconImageCache~IconImageCache} for\n * {@link module:ol/style/Icon~Icon} images.\n * @api\n */\nexport const shared = new IconImageCache();\n", "/**\n * @module ol/layer/Property\n */\n\n/**\n * @enum {string}\n */\nexport default {\n OPACITY: 'opacity',\n VISIBLE: 'visible',\n EXTENT: 'extent',\n Z_INDEX: 'zIndex',\n MAX_RESOLUTION: 'maxResolution',\n MIN_RESOLUTION: 'minResolution',\n MAX_ZOOM: 'maxZoom',\n MIN_ZOOM: 'minZoom',\n SOURCE: 'source',\n MAP: 'map',\n};\n", "/**\n * @module ol/layer/Base\n */\nimport BaseObject from '../Object.js';\nimport LayerProperty from './Property.js';\nimport {abstract} from '../util.js';\nimport {assert} from '../asserts.js';\nimport {clamp} from '../math.js';\n\n/**\n * A css color, or a function called with a view resolution returning a css color.\n *\n * @typedef {string|function(number):string} BackgroundColor\n * @api\n */\n\n/**\n * @typedef {import(\"../ObjectEventType\").Types|'change:extent'|'change:maxResolution'|'change:maxZoom'|\n * 'change:minResolution'|'change:minZoom'|'change:opacity'|'change:visible'|'change:zIndex'} BaseLayerObjectEventTypes\n */\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature &\n * import(\"../Observable\").CombinedOnSignature} BaseLayerOnSignature\n */\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-layer'] A CSS class name to set to the layer element.\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import(\"../extent.js\").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {BackgroundColor} [background] Background color for the layer. If not specified, no background\n * will be rendered.\n * @property {Object} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Note that with {@link module:ol/layer/Base~BaseLayer} and all its subclasses, any property set in\n * the options is set as a {@link module:ol/Object~BaseObject} property on the layer object, so\n * is observable, and has get/set accessors.\n *\n * @api\n */\nclass BaseLayer extends BaseObject {\n /**\n * @param {Options} options Layer options.\n */\n constructor(options) {\n super();\n\n /***\n * @type {BaseLayerOnSignature}\n */\n this.on;\n\n /***\n * @type {BaseLayerOnSignature}\n */\n this.once;\n\n /***\n * @type {BaseLayerOnSignature}\n */\n this.un;\n\n /**\n * @type {BackgroundColor|false}\n * @private\n */\n this.background_ = options.background;\n\n /**\n * @type {Object}\n */\n const properties = Object.assign({}, options);\n if (typeof options.properties === 'object') {\n delete properties.properties;\n Object.assign(properties, options.properties);\n }\n\n properties[LayerProperty.OPACITY] =\n options.opacity !== undefined ? options.opacity : 1;\n assert(typeof properties[LayerProperty.OPACITY] === 'number', 64); // Layer opacity must be a number\n\n properties[LayerProperty.VISIBLE] =\n options.visible !== undefined ? options.visible : true;\n properties[LayerProperty.Z_INDEX] = options.zIndex;\n properties[LayerProperty.MAX_RESOLUTION] =\n options.maxResolution !== undefined ? options.maxResolution : Infinity;\n properties[LayerProperty.MIN_RESOLUTION] =\n options.minResolution !== undefined ? options.minResolution : 0;\n properties[LayerProperty.MIN_ZOOM] =\n options.minZoom !== undefined ? options.minZoom : -Infinity;\n properties[LayerProperty.MAX_ZOOM] =\n options.maxZoom !== undefined ? options.maxZoom : Infinity;\n\n /**\n * @type {string}\n * @private\n */\n this.className_ =\n properties.className !== undefined ? properties.className : 'ol-layer';\n delete properties.className;\n\n this.setProperties(properties);\n\n /**\n * @type {import(\"./Layer.js\").State}\n * @private\n */\n this.state_ = null;\n }\n\n /**\n * Get the background for this layer.\n * @return {BackgroundColor|false} Layer background.\n */\n getBackground() {\n return this.background_;\n }\n\n /**\n * @return {string} CSS class name.\n */\n getClassName() {\n return this.className_;\n }\n\n /**\n * This method is not meant to be called by layers or layer renderers because the state\n * is incorrect if the layer is included in a layer group.\n *\n * @param {boolean} [managed] Layer is managed.\n * @return {import(\"./Layer.js\").State} Layer state.\n */\n getLayerState(managed) {\n /** @type {import(\"./Layer.js\").State} */\n const state =\n this.state_ ||\n /** @type {?} */ ({\n layer: this,\n managed: managed === undefined ? true : managed,\n });\n const zIndex = this.getZIndex();\n state.opacity = clamp(Math.round(this.getOpacity() * 100) / 100, 0, 1);\n state.visible = this.getVisible();\n state.extent = this.getExtent();\n state.zIndex = zIndex === undefined && !state.managed ? Infinity : zIndex;\n state.maxResolution = this.getMaxResolution();\n state.minResolution = Math.max(this.getMinResolution(), 0);\n state.minZoom = this.getMinZoom();\n state.maxZoom = this.getMaxZoom();\n this.state_ = state;\n\n return state;\n }\n\n /**\n * @abstract\n * @param {Array} [array] Array of layers (to be\n * modified in place).\n * @return {Array} Array of layers.\n */\n getLayersArray(array) {\n return abstract();\n }\n\n /**\n * @abstract\n * @param {Array} [states] Optional list of layer\n * states (to be modified in place).\n * @return {Array} List of layer states.\n */\n getLayerStatesArray(states) {\n return abstract();\n }\n\n /**\n * Return the {@link module:ol/extent~Extent extent} of the layer or `undefined` if it\n * will be visible regardless of extent.\n * @return {import(\"../extent.js\").Extent|undefined} The layer extent.\n * @observable\n * @api\n */\n getExtent() {\n return /** @type {import(\"../extent.js\").Extent|undefined} */ (\n this.get(LayerProperty.EXTENT)\n );\n }\n\n /**\n * Return the maximum resolution of the layer.\n * @return {number} The maximum resolution of the layer.\n * @observable\n * @api\n */\n getMaxResolution() {\n return /** @type {number} */ (this.get(LayerProperty.MAX_RESOLUTION));\n }\n\n /**\n * Return the minimum resolution of the layer.\n * @return {number} The minimum resolution of the layer.\n * @observable\n * @api\n */\n getMinResolution() {\n return /** @type {number} */ (this.get(LayerProperty.MIN_RESOLUTION));\n }\n\n /**\n * Return the minimum zoom level of the layer.\n * @return {number} The minimum zoom level of the layer.\n * @observable\n * @api\n */\n getMinZoom() {\n return /** @type {number} */ (this.get(LayerProperty.MIN_ZOOM));\n }\n\n /**\n * Return the maximum zoom level of the layer.\n * @return {number} The maximum zoom level of the layer.\n * @observable\n * @api\n */\n getMaxZoom() {\n return /** @type {number} */ (this.get(LayerProperty.MAX_ZOOM));\n }\n\n /**\n * Return the opacity of the layer (between 0 and 1).\n * @return {number} The opacity of the layer.\n * @observable\n * @api\n */\n getOpacity() {\n return /** @type {number} */ (this.get(LayerProperty.OPACITY));\n }\n\n /**\n * @abstract\n * @return {import(\"../source/Source.js\").State} Source state.\n */\n getSourceState() {\n return abstract();\n }\n\n /**\n * Return the value of this layer's `visible` property. To find out whether the layer\n * is visible on a map, use `isVisible()` instead.\n * @return {boolean} The value of the `visible` property of the layer.\n * @observable\n * @api\n */\n getVisible() {\n return /** @type {boolean} */ (this.get(LayerProperty.VISIBLE));\n }\n\n /**\n * Return the Z-index of the layer, which is used to order layers before\n * rendering. The default Z-index is 0.\n * @return {number} The Z-index of the layer.\n * @observable\n * @api\n */\n getZIndex() {\n return /** @type {number} */ (this.get(LayerProperty.Z_INDEX));\n }\n\n /**\n * Sets the background color.\n * @param {BackgroundColor} [background] Background color.\n */\n setBackground(background) {\n this.background_ = background;\n this.changed();\n }\n\n /**\n * Set the extent at which the layer is visible. If `undefined`, the layer\n * will be visible at all extents.\n * @param {import(\"../extent.js\").Extent|undefined} extent The extent of the layer.\n * @observable\n * @api\n */\n setExtent(extent) {\n this.set(LayerProperty.EXTENT, extent);\n }\n\n /**\n * Set the maximum resolution at which the layer is visible.\n * @param {number} maxResolution The maximum resolution of the layer.\n * @observable\n * @api\n */\n setMaxResolution(maxResolution) {\n this.set(LayerProperty.MAX_RESOLUTION, maxResolution);\n }\n\n /**\n * Set the minimum resolution at which the layer is visible.\n * @param {number} minResolution The minimum resolution of the layer.\n * @observable\n * @api\n */\n setMinResolution(minResolution) {\n this.set(LayerProperty.MIN_RESOLUTION, minResolution);\n }\n\n /**\n * Set the maximum zoom (exclusive) at which the layer is visible.\n * Note that the zoom levels for layer visibility are based on the\n * view zoom level, which may be different from a tile source zoom level.\n * @param {number} maxZoom The maximum zoom of the layer.\n * @observable\n * @api\n */\n setMaxZoom(maxZoom) {\n this.set(LayerProperty.MAX_ZOOM, maxZoom);\n }\n\n /**\n * Set the minimum zoom (inclusive) at which the layer is visible.\n * Note that the zoom levels for layer visibility are based on the\n * view zoom level, which may be different from a tile source zoom level.\n * @param {number} minZoom The minimum zoom of the layer.\n * @observable\n * @api\n */\n setMinZoom(minZoom) {\n this.set(LayerProperty.MIN_ZOOM, minZoom);\n }\n\n /**\n * Set the opacity of the layer, allowed values range from 0 to 1.\n * @param {number} opacity The opacity of the layer.\n * @observable\n * @api\n */\n setOpacity(opacity) {\n assert(typeof opacity === 'number', 64); // Layer opacity must be a number\n this.set(LayerProperty.OPACITY, opacity);\n }\n\n /**\n * Set the visibility of the layer (`true` or `false`).\n * @param {boolean} visible The visibility of the layer.\n * @observable\n * @api\n */\n setVisible(visible) {\n this.set(LayerProperty.VISIBLE, visible);\n }\n\n /**\n * Set Z-index of the layer, which is used to order layers before rendering.\n * The default Z-index is 0.\n * @param {number} zindex The z-index of the layer.\n * @observable\n * @api\n */\n setZIndex(zindex) {\n this.set(LayerProperty.Z_INDEX, zindex);\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n if (this.state_) {\n this.state_.layer = null;\n this.state_ = null;\n }\n super.disposeInternal();\n }\n}\n\nexport default BaseLayer;\n", "/**\n * @module ol/render/EventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n /**\n * Triggered before a layer is rendered.\n * @event module:ol/render/Event~RenderEvent#prerender\n * @api\n */\n PRERENDER: 'prerender',\n\n /**\n * Triggered after a layer is rendered.\n * @event module:ol/render/Event~RenderEvent#postrender\n * @api\n */\n POSTRENDER: 'postrender',\n\n /**\n * Triggered before layers are composed. When dispatched by the map, the event object will not have\n * a `context` set. When dispatched by a layer, the event object will have a `context` set. Only\n * WebGL layers currently dispatch this event.\n * @event module:ol/render/Event~RenderEvent#precompose\n * @api\n */\n PRECOMPOSE: 'precompose',\n\n /**\n * Triggered after layers are composed. When dispatched by the map, the event object will not have\n * a `context` set. When dispatched by a layer, the event object will have a `context` set. Only\n * WebGL layers currently dispatch this event.\n * @event module:ol/render/Event~RenderEvent#postcompose\n * @api\n */\n POSTCOMPOSE: 'postcompose',\n\n /**\n * Triggered when rendering is complete, i.e. all sources and tiles have\n * finished loading for the current viewport, and all tiles are faded in.\n * The event object will not have a `context` set.\n * @event module:ol/render/Event~RenderEvent#rendercomplete\n * @api\n */\n RENDERCOMPLETE: 'rendercomplete',\n};\n\n/**\n * @typedef {'postrender'|'precompose'|'postcompose'|'rendercomplete'} MapRenderEventTypes\n */\n\n/**\n * @typedef {'postrender'|'prerender'} LayerRenderEventTypes\n */\n", "/**\n * @module ol/ViewHint\n */\n\n/**\n * @enum {number}\n */\nexport default {\n ANIMATING: 0,\n INTERACTING: 1,\n};\n", "/**\n * @module ol/ViewProperty\n */\n\n/**\n * @enum {string}\n */\nexport default {\n CENTER: 'center',\n RESOLUTION: 'resolution',\n ROTATION: 'rotation',\n};\n", "/**\n * @module ol/proj/Units\n */\n\n/**\n * @typedef {'radians' | 'degrees' | 'ft' | 'm' | 'pixels' | 'tile-pixels' | 'us-ft'} Units\n * Projection units.\n */\n\n/**\n * See http://duff.ess.washington.edu/data/raster/drg/docs/geotiff.txt\n * @type {Object}\n */\nconst unitByCode = {\n '9001': 'm',\n '9002': 'ft',\n '9003': 'us-ft',\n '9101': 'radians',\n '9102': 'degrees',\n};\n\n/**\n * @param {number} code Unit code.\n * @return {Units} Units.\n */\nexport function fromCode(code) {\n return unitByCode[code];\n}\n\n/**\n * @typedef {Object} MetersPerUnitLookup\n * @property {number} radians Radians\n * @property {number} degrees Degrees\n * @property {number} ft Feet\n * @property {number} m Meters\n * @property {number} us-ft US feet\n */\n\n/**\n * Meters per unit lookup table.\n * @const\n * @type {MetersPerUnitLookup}\n * @api\n */\nexport const METERS_PER_UNIT = {\n // use the radius of the Normal sphere\n 'radians': 6370997 / (2 * Math.PI),\n 'degrees': (2 * Math.PI * 6370997) / 360,\n 'ft': 0.3048,\n 'm': 1,\n 'us-ft': 1200 / 3937,\n};\n", "/**\n * @module ol/proj/Projection\n */\nimport {METERS_PER_UNIT} from './Units.js';\n\n/**\n * @typedef {Object} Options\n * @property {string} code The SRS identifier code, e.g. `EPSG:4326`.\n * @property {import(\"./Units.js\").Units} [units] Units. Required unless a\n * proj4 projection is defined for `code`.\n * @property {import(\"../extent.js\").Extent} [extent] The validity extent for the SRS.\n * @property {string} [axisOrientation='enu'] The axis orientation as specified in Proj4.\n * @property {boolean} [global=false] Whether the projection is valid for the whole globe.\n * @property {number} [metersPerUnit] The meters per unit for the SRS.\n * If not provided, the `units` are used to get the meters per unit from the {@link METERS_PER_UNIT}\n * lookup table.\n * @property {import(\"../extent.js\").Extent} [worldExtent] The world extent for the SRS.\n * @property {function(number, import(\"../coordinate.js\").Coordinate):number} [getPointResolution]\n * Function to determine resolution at a point. The function is called with a\n * `number` view resolution and a {@link module:ol/coordinate~Coordinate} as arguments, and returns\n * the `number` resolution in projection units at the passed coordinate. If this is `undefined`,\n * the default {@link module:ol/proj.getPointResolution} function will be used.\n */\n\n/**\n * @classdesc\n * Projection definition class. One of these is created for each projection\n * supported in the application and stored in the {@link module:ol/proj} namespace.\n * You can use these in applications, but this is not required, as API params\n * and options use {@link module:ol/proj~ProjectionLike} which means the simple string\n * code will suffice.\n *\n * You can use {@link module:ol/proj.get} to retrieve the object for a particular\n * projection.\n *\n * The library includes definitions for `EPSG:4326` and `EPSG:3857`, together\n * with the following aliases:\n * * `EPSG:4326`: CRS:84, urn:ogc:def:crs:EPSG:6.6:4326,\n * urn:ogc:def:crs:OGC:1.3:CRS84, urn:ogc:def:crs:OGC:2:84,\n * http://www.opengis.net/gml/srs/epsg.xml#4326,\n * urn:x-ogc:def:crs:EPSG:4326\n * * `EPSG:3857`: EPSG:102100, EPSG:102113, EPSG:900913,\n * urn:ogc:def:crs:EPSG:6.18:3:3857,\n * http://www.opengis.net/gml/srs/epsg.xml#3857\n *\n * If you use [proj4js](https://github.com/proj4js/proj4js), aliases can\n * be added using `proj4.defs()`. After all required projection definitions are\n * added, call the {@link module:ol/proj/proj4.register} function.\n *\n * @api\n */\nclass Projection {\n /**\n * @param {Options} options Projection options.\n */\n constructor(options) {\n /**\n * @private\n * @type {string}\n */\n this.code_ = options.code;\n\n /**\n * Units of projected coordinates. When set to `TILE_PIXELS`, a\n * `this.extent_` and `this.worldExtent_` must be configured properly for each\n * tile.\n * @private\n * @type {import(\"./Units.js\").Units}\n */\n this.units_ = /** @type {import(\"./Units.js\").Units} */ (options.units);\n\n /**\n * Validity extent of the projection in projected coordinates. For projections\n * with `TILE_PIXELS` units, this is the extent of the tile in\n * tile pixel space.\n * @private\n * @type {import(\"../extent.js\").Extent}\n */\n this.extent_ = options.extent !== undefined ? options.extent : null;\n\n /**\n * Extent of the world in EPSG:4326. For projections with\n * `TILE_PIXELS` units, this is the extent of the tile in\n * projected coordinate space.\n * @private\n * @type {import(\"../extent.js\").Extent}\n */\n this.worldExtent_ =\n options.worldExtent !== undefined ? options.worldExtent : null;\n\n /**\n * @private\n * @type {string}\n */\n this.axisOrientation_ =\n options.axisOrientation !== undefined ? options.axisOrientation : 'enu';\n\n /**\n * @private\n * @type {boolean}\n */\n this.global_ = options.global !== undefined ? options.global : false;\n\n /**\n * @private\n * @type {boolean}\n */\n this.canWrapX_ = !!(this.global_ && this.extent_);\n\n /**\n * @private\n * @type {function(number, import(\"../coordinate.js\").Coordinate):number|undefined}\n */\n this.getPointResolutionFunc_ = options.getPointResolution;\n\n /**\n * @private\n * @type {import(\"../tilegrid/TileGrid.js\").default}\n */\n this.defaultTileGrid_ = null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.metersPerUnit_ = options.metersPerUnit;\n }\n\n /**\n * @return {boolean} The projection is suitable for wrapping the x-axis\n */\n canWrapX() {\n return this.canWrapX_;\n }\n\n /**\n * Get the code for this projection, e.g. 'EPSG:4326'.\n * @return {string} Code.\n * @api\n */\n getCode() {\n return this.code_;\n }\n\n /**\n * Get the validity extent for this projection.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getExtent() {\n return this.extent_;\n }\n\n /**\n * Get the units of this projection.\n * @return {import(\"./Units.js\").Units} Units.\n * @api\n */\n getUnits() {\n return this.units_;\n }\n\n /**\n * Get the amount of meters per unit of this projection. If the projection is\n * not configured with `metersPerUnit` or a units identifier, the return is\n * `undefined`.\n * @return {number|undefined} Meters.\n * @api\n */\n getMetersPerUnit() {\n return this.metersPerUnit_ || METERS_PER_UNIT[this.units_];\n }\n\n /**\n * Get the world extent for this projection.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getWorldExtent() {\n return this.worldExtent_;\n }\n\n /**\n * Get the axis orientation of this projection.\n * Example values are:\n * enu - the default easting, northing, elevation.\n * neu - northing, easting, up - useful for \"lat/long\" geographic coordinates,\n * or south orientated transverse mercator.\n * wnu - westing, northing, up - some planetary coordinate systems have\n * \"west positive\" coordinate systems\n * @return {string} Axis orientation.\n * @api\n */\n getAxisOrientation() {\n return this.axisOrientation_;\n }\n\n /**\n * Is this projection a global projection which spans the whole world?\n * @return {boolean} Whether the projection is global.\n * @api\n */\n isGlobal() {\n return this.global_;\n }\n\n /**\n * Set if the projection is a global projection which spans the whole world\n * @param {boolean} global Whether the projection is global.\n * @api\n */\n setGlobal(global) {\n this.global_ = global;\n this.canWrapX_ = !!(global && this.extent_);\n }\n\n /**\n * @return {import(\"../tilegrid/TileGrid.js\").default} The default tile grid.\n */\n getDefaultTileGrid() {\n return this.defaultTileGrid_;\n }\n\n /**\n * @param {import(\"../tilegrid/TileGrid.js\").default} tileGrid The default tile grid.\n */\n setDefaultTileGrid(tileGrid) {\n this.defaultTileGrid_ = tileGrid;\n }\n\n /**\n * Set the validity extent for this projection.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @api\n */\n setExtent(extent) {\n this.extent_ = extent;\n this.canWrapX_ = !!(this.global_ && extent);\n }\n\n /**\n * Set the world extent for this projection.\n * @param {import(\"../extent.js\").Extent} worldExtent World extent\n * [minlon, minlat, maxlon, maxlat].\n * @api\n */\n setWorldExtent(worldExtent) {\n this.worldExtent_ = worldExtent;\n }\n\n /**\n * Set the getPointResolution function (see {@link module:ol/proj.getPointResolution}\n * for this projection.\n * @param {function(number, import(\"../coordinate.js\").Coordinate):number} func Function\n * @api\n */\n setGetPointResolution(func) {\n this.getPointResolutionFunc_ = func;\n }\n\n /**\n * Get the custom point resolution function for this projection (if set).\n * @return {function(number, import(\"../coordinate.js\").Coordinate):number|undefined} The custom point\n * resolution function (if set).\n */\n getPointResolutionFunc() {\n return this.getPointResolutionFunc_;\n }\n}\n\nexport default Projection;\n", "/**\n * @module ol/proj/epsg3857\n */\nimport Projection from './Projection.js';\n\n/**\n * Radius of WGS84 sphere\n *\n * @const\n * @type {number}\n */\nexport const RADIUS = 6378137;\n\n/**\n * @const\n * @type {number}\n */\nexport const HALF_SIZE = Math.PI * RADIUS;\n\n/**\n * @const\n * @type {import(\"../extent.js\").Extent}\n */\nexport const EXTENT = [-HALF_SIZE, -HALF_SIZE, HALF_SIZE, HALF_SIZE];\n\n/**\n * @const\n * @type {import(\"../extent.js\").Extent}\n */\nexport const WORLD_EXTENT = [-180, -85, 180, 85];\n\n/**\n * Maximum safe value in y direction\n * @const\n * @type {number}\n */\nexport const MAX_SAFE_Y = RADIUS * Math.log(Math.tan(Math.PI / 2));\n\n/**\n * @classdesc\n * Projection object for web/spherical Mercator (EPSG:3857).\n */\nclass EPSG3857Projection extends Projection {\n /**\n * @param {string} code Code.\n */\n constructor(code) {\n super({\n code: code,\n units: 'm',\n extent: EXTENT,\n global: true,\n worldExtent: WORLD_EXTENT,\n getPointResolution: function (resolution, point) {\n return resolution / Math.cosh(point[1] / RADIUS);\n },\n });\n }\n}\n\n/**\n * Projections equal to EPSG:3857.\n *\n * @const\n * @type {Array}\n */\nexport const PROJECTIONS = [\n new EPSG3857Projection('EPSG:3857'),\n new EPSG3857Projection('EPSG:102100'),\n new EPSG3857Projection('EPSG:102113'),\n new EPSG3857Projection('EPSG:900913'),\n new EPSG3857Projection('http://www.opengis.net/def/crs/EPSG/0/3857'),\n new EPSG3857Projection('http://www.opengis.net/gml/srs/epsg.xml#3857'),\n];\n\n/**\n * Transformation from EPSG:4326 to EPSG:3857.\n *\n * @param {Array} input Input array of coordinate values.\n * @param {Array} [output] Output array of coordinate values.\n * @param {number} [dimension] Dimension (default is `2`).\n * @return {Array} Output array of coordinate values.\n */\nexport function fromEPSG4326(input, output, dimension) {\n const length = input.length;\n dimension = dimension > 1 ? dimension : 2;\n if (output === undefined) {\n if (dimension > 2) {\n // preserve values beyond second dimension\n output = input.slice();\n } else {\n output = new Array(length);\n }\n }\n for (let i = 0; i < length; i += dimension) {\n output[i] = (HALF_SIZE * input[i]) / 180;\n let y = RADIUS * Math.log(Math.tan((Math.PI * (+input[i + 1] + 90)) / 360));\n if (y > MAX_SAFE_Y) {\n y = MAX_SAFE_Y;\n } else if (y < -MAX_SAFE_Y) {\n y = -MAX_SAFE_Y;\n }\n output[i + 1] = y;\n }\n return output;\n}\n\n/**\n * Transformation from EPSG:3857 to EPSG:4326.\n *\n * @param {Array} input Input array of coordinate values.\n * @param {Array} [output] Output array of coordinate values.\n * @param {number} [dimension] Dimension (default is `2`).\n * @return {Array} Output array of coordinate values.\n */\nexport function toEPSG4326(input, output, dimension) {\n const length = input.length;\n dimension = dimension > 1 ? dimension : 2;\n if (output === undefined) {\n if (dimension > 2) {\n // preserve values beyond second dimension\n output = input.slice();\n } else {\n output = new Array(length);\n }\n }\n for (let i = 0; i < length; i += dimension) {\n output[i] = (180 * input[i]) / HALF_SIZE;\n output[i + 1] =\n (360 * Math.atan(Math.exp(input[i + 1] / RADIUS))) / Math.PI - 90;\n }\n return output;\n}\n", "/**\n * @module ol/proj/epsg4326\n */\nimport Projection from './Projection.js';\n\n/**\n * Semi-major radius of the WGS84 ellipsoid.\n *\n * @const\n * @type {number}\n */\nexport const RADIUS = 6378137;\n\n/**\n * Extent of the EPSG:4326 projection which is the whole world.\n *\n * @const\n * @type {import(\"../extent.js\").Extent}\n */\nexport const EXTENT = [-180, -90, 180, 90];\n\n/**\n * @const\n * @type {number}\n */\nexport const METERS_PER_UNIT = (Math.PI * RADIUS) / 180;\n\n/**\n * @classdesc\n * Projection object for WGS84 geographic coordinates (EPSG:4326).\n *\n * Note that OpenLayers does not strictly comply with the EPSG definition.\n * The EPSG registry defines 4326 as a CRS for Latitude,Longitude (y,x).\n * OpenLayers treats EPSG:4326 as a pseudo-projection, with x,y coordinates.\n */\nclass EPSG4326Projection extends Projection {\n /**\n * @param {string} code Code.\n * @param {string} [axisOrientation] Axis orientation.\n */\n constructor(code, axisOrientation) {\n super({\n code: code,\n units: 'degrees',\n extent: EXTENT,\n axisOrientation: axisOrientation,\n global: true,\n metersPerUnit: METERS_PER_UNIT,\n worldExtent: EXTENT,\n });\n }\n}\n\n/**\n * Projections equal to EPSG:4326.\n *\n * @const\n * @type {Array}\n */\nexport const PROJECTIONS = [\n new EPSG4326Projection('CRS:84'),\n new EPSG4326Projection('EPSG:4326', 'neu'),\n new EPSG4326Projection('urn:ogc:def:crs:OGC:1.3:CRS84'),\n new EPSG4326Projection('urn:ogc:def:crs:OGC:2:84'),\n new EPSG4326Projection('http://www.opengis.net/def/crs/OGC/1.3/CRS84'),\n new EPSG4326Projection('http://www.opengis.net/gml/srs/epsg.xml#4326', 'neu'),\n new EPSG4326Projection('http://www.opengis.net/def/crs/EPSG/0/4326', 'neu'),\n];\n", "/**\n * @module ol/proj/projections\n */\n\n/**\n * @type {Object}\n */\nlet cache = {};\n\n/**\n * Clear the projections cache.\n */\nexport function clear() {\n cache = {};\n}\n\n/**\n * Get a cached projection by code.\n * @param {string} code The code for the projection.\n * @return {import(\"./Projection.js\").default} The projection (if cached).\n */\nexport function get(code) {\n return (\n cache[code] ||\n cache[code.replace(/urn:(x-)?ogc:def:crs:EPSG:(.*:)?(\\w+)$/, 'EPSG:$3')] ||\n null\n );\n}\n\n/**\n * Add a projection to the cache.\n * @param {string} code The projection code.\n * @param {import(\"./Projection.js\").default} projection The projection to cache.\n */\nexport function add(code, projection) {\n cache[code] = projection;\n}\n", "/**\n * @module ol/proj/transforms\n */\nimport {isEmpty} from '../obj.js';\n\n/**\n * @private\n * @type {!Object>}\n */\nlet transforms = {};\n\n/**\n * Clear the transform cache.\n */\nexport function clear() {\n transforms = {};\n}\n\n/**\n * Registers a conversion function to convert coordinates from the source\n * projection to the destination projection.\n *\n * @param {import(\"./Projection.js\").default} source Source.\n * @param {import(\"./Projection.js\").default} destination Destination.\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform.\n */\nexport function add(source, destination, transformFn) {\n const sourceCode = source.getCode();\n const destinationCode = destination.getCode();\n if (!(sourceCode in transforms)) {\n transforms[sourceCode] = {};\n }\n transforms[sourceCode][destinationCode] = transformFn;\n}\n\n/**\n * Unregisters the conversion function to convert coordinates from the source\n * projection to the destination projection. This method is used to clean up\n * cached transforms during testing.\n *\n * @param {import(\"./Projection.js\").default} source Source projection.\n * @param {import(\"./Projection.js\").default} destination Destination projection.\n * @return {import(\"../proj.js\").TransformFunction} transformFn The unregistered transform.\n */\nexport function remove(source, destination) {\n const sourceCode = source.getCode();\n const destinationCode = destination.getCode();\n const transform = transforms[sourceCode][destinationCode];\n delete transforms[sourceCode][destinationCode];\n if (isEmpty(transforms[sourceCode])) {\n delete transforms[sourceCode];\n }\n return transform;\n}\n\n/**\n * Get a transform given a source code and a destination code.\n * @param {string} sourceCode The code for the source projection.\n * @param {string} destinationCode The code for the destination projection.\n * @return {import(\"../proj.js\").TransformFunction|undefined} The transform function (if found).\n */\nexport function get(sourceCode, destinationCode) {\n let transform;\n if (sourceCode in transforms && destinationCode in transforms[sourceCode]) {\n transform = transforms[sourceCode][destinationCode];\n }\n return transform;\n}\n", "/**\n * @module ol/string\n */\n\n/**\n * @param {number} number Number to be formatted\n * @param {number} width The desired width\n * @param {number} [precision] Precision of the output string (i.e. number of decimal places)\n * @return {string} Formatted string\n */\nexport function padNumber(number, width, precision) {\n const numberString =\n precision !== undefined ? number.toFixed(precision) : '' + number;\n let decimal = numberString.indexOf('.');\n decimal = decimal === -1 ? numberString.length : decimal;\n return decimal > width\n ? numberString\n : new Array(1 + width - decimal).join('0') + numberString;\n}\n\n/**\n * Adapted from https://github.com/omichelsen/compare-versions/blob/master/index.js\n * @param {string|number} v1 First version\n * @param {string|number} v2 Second version\n * @return {number} Value\n */\nexport function compareVersions(v1, v2) {\n const s1 = ('' + v1).split('.');\n const s2 = ('' + v2).split('.');\n\n for (let i = 0; i < Math.max(s1.length, s2.length); i++) {\n const n1 = parseInt(s1[i] || '0', 10);\n const n2 = parseInt(s2[i] || '0', 10);\n\n if (n1 > n2) {\n return 1;\n }\n if (n2 > n1) {\n return -1;\n }\n }\n\n return 0;\n}\n", "/**\n * @module ol/coordinate\n */\nimport {getWidth} from './extent.js';\nimport {modulo, toFixed} from './math.js';\nimport {padNumber} from './string.js';\n\n/**\n * An array of numbers representing an `xy`, `xyz` or `xyzm` coordinate.\n * Example: `[16, 48]`.\n * @typedef {Array} Coordinate\n * @api\n */\n\n/**\n * A function that takes a {@link module:ol/coordinate~Coordinate} and\n * transforms it into a `{string}`.\n *\n * @typedef {function((Coordinate|undefined)): string} CoordinateFormat\n * @api\n */\n\n/**\n * Add `delta` to `coordinate`. `coordinate` is modified in place and returned\n * by the function.\n *\n * Example:\n *\n * import {add} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * add(coord, [-2, 4]);\n * // coord is now [5.85, 51.983333]\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {Coordinate} delta Delta.\n * @return {Coordinate} The input coordinate adjusted by\n * the given delta.\n * @api\n */\nexport function add(coordinate, delta) {\n coordinate[0] += +delta[0];\n coordinate[1] += +delta[1];\n return coordinate;\n}\n\n/**\n * Calculates the point closest to the passed coordinate on the passed circle.\n *\n * @param {Coordinate} coordinate The coordinate.\n * @param {import(\"./geom/Circle.js\").default} circle The circle.\n * @return {Coordinate} Closest point on the circumference.\n */\nexport function closestOnCircle(coordinate, circle) {\n const r = circle.getRadius();\n const center = circle.getCenter();\n const x0 = center[0];\n const y0 = center[1];\n const x1 = coordinate[0];\n const y1 = coordinate[1];\n\n let dx = x1 - x0;\n const dy = y1 - y0;\n if (dx === 0 && dy === 0) {\n dx = 1;\n }\n const d = Math.sqrt(dx * dx + dy * dy);\n\n const x = x0 + (r * dx) / d;\n const y = y0 + (r * dy) / d;\n\n return [x, y];\n}\n\n/**\n * Calculates the point closest to the passed coordinate on the passed segment.\n * This is the foot of the perpendicular of the coordinate to the segment when\n * the foot is on the segment, or the closest segment coordinate when the foot\n * is outside the segment.\n *\n * @param {Coordinate} coordinate The coordinate.\n * @param {Array} segment The two coordinates\n * of the segment.\n * @return {Coordinate} The foot of the perpendicular of\n * the coordinate to the segment.\n */\nexport function closestOnSegment(coordinate, segment) {\n const x0 = coordinate[0];\n const y0 = coordinate[1];\n const start = segment[0];\n const end = segment[1];\n const x1 = start[0];\n const y1 = start[1];\n const x2 = end[0];\n const y2 = end[1];\n const dx = x2 - x1;\n const dy = y2 - y1;\n const along =\n dx === 0 && dy === 0\n ? 0\n : (dx * (x0 - x1) + dy * (y0 - y1)) / (dx * dx + dy * dy || 0);\n let x, y;\n if (along <= 0) {\n x = x1;\n y = y1;\n } else if (along >= 1) {\n x = x2;\n y = y2;\n } else {\n x = x1 + along * dx;\n y = y1 + along * dy;\n }\n return [x, y];\n}\n\n/**\n * Returns a {@link module:ol/coordinate~CoordinateFormat} function that can be\n * used to format\n * a {Coordinate} to a string.\n *\n * Example without specifying the fractional digits:\n *\n * import {createStringXY} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const stringifyFunc = createStringXY();\n * const out = stringifyFunc(coord);\n * // out is now '8, 48'\n *\n * Example with explicitly specifying 2 fractional digits:\n *\n * import {createStringXY} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const stringifyFunc = createStringXY(2);\n * const out = stringifyFunc(coord);\n * // out is now '7.85, 47.98'\n *\n * @param {number} [fractionDigits] The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {CoordinateFormat} Coordinate format.\n * @api\n */\nexport function createStringXY(fractionDigits) {\n return (\n /**\n * @param {Coordinate} coordinate Coordinate.\n * @return {string} String XY.\n */\n function (coordinate) {\n return toStringXY(coordinate, fractionDigits);\n }\n );\n}\n\n/**\n * @param {string} hemispheres Hemispheres.\n * @param {number} degrees Degrees.\n * @param {number} [fractionDigits] The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} String.\n */\nexport function degreesToStringHDMS(hemispheres, degrees, fractionDigits) {\n const normalizedDegrees = modulo(degrees + 180, 360) - 180;\n const x = Math.abs(3600 * normalizedDegrees);\n const decimals = fractionDigits || 0;\n\n let deg = Math.floor(x / 3600);\n let min = Math.floor((x - deg * 3600) / 60);\n let sec = toFixed(x - deg * 3600 - min * 60, decimals);\n\n if (sec >= 60) {\n sec = 0;\n min += 1;\n }\n\n if (min >= 60) {\n min = 0;\n deg += 1;\n }\n\n let hdms = deg + '\\u00b0';\n if (min !== 0 || sec !== 0) {\n hdms += ' ' + padNumber(min, 2) + '\\u2032';\n }\n if (sec !== 0) {\n hdms += ' ' + padNumber(sec, 2, decimals) + '\\u2033';\n }\n if (normalizedDegrees !== 0) {\n hdms += ' ' + hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0);\n }\n\n return hdms;\n}\n\n/**\n * Transforms the given {@link module:ol/coordinate~Coordinate} to a string\n * using the given string template. The strings `{x}` and `{y}` in the template\n * will be replaced with the first and second coordinate values respectively.\n *\n * Example without specifying the fractional digits:\n *\n * import {format} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const template = 'Coordinate is ({x}|{y}).';\n * const out = format(coord, template);\n * // out is now 'Coordinate is (8|48).'\n *\n * Example explicitly specifying the fractional digits:\n *\n * import {format} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const template = 'Coordinate is ({x}|{y}).';\n * const out = format(coord, template, 2);\n * // out is now 'Coordinate is (7.85|47.98).'\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {string} template A template string with `{x}` and `{y}` placeholders\n * that will be replaced by first and second coordinate values.\n * @param {number} [fractionDigits] The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} Formatted coordinate.\n * @api\n */\nexport function format(coordinate, template, fractionDigits) {\n if (coordinate) {\n return template\n .replace('{x}', coordinate[0].toFixed(fractionDigits))\n .replace('{y}', coordinate[1].toFixed(fractionDigits));\n }\n return '';\n}\n\n/**\n * @param {Coordinate} coordinate1 First coordinate.\n * @param {Coordinate} coordinate2 Second coordinate.\n * @return {boolean} The two coordinates are equal.\n */\nexport function equals(coordinate1, coordinate2) {\n let equals = true;\n for (let i = coordinate1.length - 1; i >= 0; --i) {\n if (coordinate1[i] != coordinate2[i]) {\n equals = false;\n break;\n }\n }\n return equals;\n}\n\n/**\n * Rotate `coordinate` by `angle`. `coordinate` is modified in place and\n * returned by the function.\n *\n * Example:\n *\n * import {rotate} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const rotateRadians = Math.PI / 2; // 90 degrees\n * rotate(coord, rotateRadians);\n * // coord is now [-47.983333, 7.85]\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number} angle Angle in radian.\n * @return {Coordinate} Coordinate.\n * @api\n */\nexport function rotate(coordinate, angle) {\n const cosAngle = Math.cos(angle);\n const sinAngle = Math.sin(angle);\n const x = coordinate[0] * cosAngle - coordinate[1] * sinAngle;\n const y = coordinate[1] * cosAngle + coordinate[0] * sinAngle;\n coordinate[0] = x;\n coordinate[1] = y;\n return coordinate;\n}\n\n/**\n * Scale `coordinate` by `scale`. `coordinate` is modified in place and returned\n * by the function.\n *\n * Example:\n *\n * import {scale as scaleCoordinate} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const scale = 1.2;\n * scaleCoordinate(coord, scale);\n * // coord is now [9.42, 57.5799996]\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number} scale Scale factor.\n * @return {Coordinate} Coordinate.\n */\nexport function scale(coordinate, scale) {\n coordinate[0] *= scale;\n coordinate[1] *= scale;\n return coordinate;\n}\n\n/**\n * @param {Coordinate} coord1 First coordinate.\n * @param {Coordinate} coord2 Second coordinate.\n * @return {number} Squared distance between coord1 and coord2.\n */\nexport function squaredDistance(coord1, coord2) {\n const dx = coord1[0] - coord2[0];\n const dy = coord1[1] - coord2[1];\n return dx * dx + dy * dy;\n}\n\n/**\n * @param {Coordinate} coord1 First coordinate.\n * @param {Coordinate} coord2 Second coordinate.\n * @return {number} Distance between coord1 and coord2.\n */\nexport function distance(coord1, coord2) {\n return Math.sqrt(squaredDistance(coord1, coord2));\n}\n\n/**\n * Calculate the squared distance from a coordinate to a line segment.\n *\n * @param {Coordinate} coordinate Coordinate of the point.\n * @param {Array} segment Line segment (2\n * coordinates).\n * @return {number} Squared distance from the point to the line segment.\n */\nexport function squaredDistanceToSegment(coordinate, segment) {\n return squaredDistance(coordinate, closestOnSegment(coordinate, segment));\n}\n\n/**\n * Format a geographic coordinate with the hemisphere, degrees, minutes, and\n * seconds.\n *\n * Example without specifying fractional digits:\n *\n * import {toStringHDMS} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const out = toStringHDMS(coord);\n * // out is now '47\u00B0 58\u2032 60\u2033 N 7\u00B0 50\u2032 60\u2033 E'\n *\n * Example explicitly specifying 1 fractional digit:\n *\n * import {toStringHDMS} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const out = toStringHDMS(coord, 1);\n * // out is now '47\u00B0 58\u2032 60.0\u2033 N 7\u00B0 50\u2032 60.0\u2033 E'\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number} [fractionDigits] The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} Hemisphere, degrees, minutes and seconds.\n * @api\n */\nexport function toStringHDMS(coordinate, fractionDigits) {\n if (coordinate) {\n return (\n degreesToStringHDMS('NS', coordinate[1], fractionDigits) +\n ' ' +\n degreesToStringHDMS('EW', coordinate[0], fractionDigits)\n );\n }\n return '';\n}\n\n/**\n * Format a coordinate as a comma delimited string.\n *\n * Example without specifying fractional digits:\n *\n * import {toStringXY} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const out = toStringXY(coord);\n * // out is now '8, 48'\n *\n * Example explicitly specifying 1 fractional digit:\n *\n * import {toStringXY} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const out = toStringXY(coord, 1);\n * // out is now '7.8, 48.0'\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number} [fractionDigits] The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} XY.\n * @api\n */\nexport function toStringXY(coordinate, fractionDigits) {\n return format(coordinate, '{x}, {y}', fractionDigits);\n}\n\n/**\n * Modifies the provided coordinate in-place to be within the real world\n * extent. The lower projection extent boundary is inclusive, the upper one\n * exclusive.\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {Coordinate} The coordinate within the real world extent.\n */\nexport function wrapX(coordinate, projection) {\n if (projection.canWrapX()) {\n const worldWidth = getWidth(projection.getExtent());\n const worldsAway = getWorldsAway(coordinate, projection, worldWidth);\n if (worldsAway) {\n coordinate[0] -= worldsAway * worldWidth;\n }\n }\n return coordinate;\n}\n/**\n * @param {Coordinate} coordinate Coordinate.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @param {number} [sourceExtentWidth] Width of the source extent.\n * @return {number} Offset in world widths.\n */\nexport function getWorldsAway(coordinate, projection, sourceExtentWidth) {\n const projectionExtent = projection.getExtent();\n let worldsAway = 0;\n if (\n projection.canWrapX() &&\n (coordinate[0] < projectionExtent[0] || coordinate[0] > projectionExtent[2])\n ) {\n sourceExtentWidth = sourceExtentWidth || getWidth(projectionExtent);\n worldsAway = Math.floor(\n (coordinate[0] - projectionExtent[0]) / sourceExtentWidth\n );\n }\n return worldsAway;\n}\n", "/**\n * @module ol/sphere\n */\nimport {toDegrees, toRadians} from './math.js';\n\n/**\n * Object literal with options for the {@link getLength} or {@link getArea}\n * functions.\n * @typedef {Object} SphereMetricOptions\n * @property {import(\"./proj.js\").ProjectionLike} [projection='EPSG:3857']\n * Projection of the geometry. By default, the geometry is assumed to be in\n * Web Mercator.\n * @property {number} [radius=6371008.8] Sphere radius. By default, the\n * [mean Earth radius](https://en.wikipedia.org/wiki/Earth_radius#Mean_radius)\n * for the WGS84 ellipsoid is used.\n */\n\n/**\n * The mean Earth radius (1/3 * (2a + b)) for the WGS84 ellipsoid.\n * https://en.wikipedia.org/wiki/Earth_radius#Mean_radius\n * @type {number}\n */\nexport const DEFAULT_RADIUS = 6371008.8;\n\n/**\n * Get the great circle distance (in meters) between two geographic coordinates.\n * @param {Array} c1 Starting coordinate.\n * @param {Array} c2 Ending coordinate.\n * @param {number} [radius] The sphere radius to use. Defaults to the Earth's\n * mean radius using the WGS84 ellipsoid.\n * @return {number} The great circle distance between the points (in meters).\n * @api\n */\nexport function getDistance(c1, c2, radius) {\n radius = radius || DEFAULT_RADIUS;\n const lat1 = toRadians(c1[1]);\n const lat2 = toRadians(c2[1]);\n const deltaLatBy2 = (lat2 - lat1) / 2;\n const deltaLonBy2 = toRadians(c2[0] - c1[0]) / 2;\n const a =\n Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) +\n Math.sin(deltaLonBy2) *\n Math.sin(deltaLonBy2) *\n Math.cos(lat1) *\n Math.cos(lat2);\n return 2 * radius * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\n/**\n * Get the cumulative great circle length of linestring coordinates (geographic).\n * @param {Array} coordinates Linestring coordinates.\n * @param {number} radius The sphere radius to use.\n * @return {number} The length (in meters).\n */\nfunction getLengthInternal(coordinates, radius) {\n let length = 0;\n for (let i = 0, ii = coordinates.length; i < ii - 1; ++i) {\n length += getDistance(coordinates[i], coordinates[i + 1], radius);\n }\n return length;\n}\n\n/**\n * Get the spherical length of a geometry. This length is the sum of the\n * great circle distances between coordinates. For polygons, the length is\n * the sum of all rings. For points, the length is zero. For multi-part\n * geometries, the length is the sum of the length of each part.\n * @param {import(\"./geom/Geometry.js\").default} geometry A geometry.\n * @param {SphereMetricOptions} [options] Options for the\n * length calculation. By default, geometries are assumed to be in 'EPSG:3857'.\n * You can change this by providing a `projection` option.\n * @return {number} The spherical length (in meters).\n * @api\n */\nexport function getLength(geometry, options) {\n options = options || {};\n const radius = options.radius || DEFAULT_RADIUS;\n const projection = options.projection || 'EPSG:3857';\n const type = geometry.getType();\n if (type !== 'GeometryCollection') {\n geometry = geometry.clone().transform(projection, 'EPSG:4326');\n }\n let length = 0;\n let coordinates, coords, i, ii, j, jj;\n switch (type) {\n case 'Point':\n case 'MultiPoint': {\n break;\n }\n case 'LineString':\n case 'LinearRing': {\n coordinates = /** @type {import(\"./geom/SimpleGeometry.js\").default} */ (\n geometry\n ).getCoordinates();\n length = getLengthInternal(coordinates, radius);\n break;\n }\n case 'MultiLineString':\n case 'Polygon': {\n coordinates = /** @type {import(\"./geom/SimpleGeometry.js\").default} */ (\n geometry\n ).getCoordinates();\n for (i = 0, ii = coordinates.length; i < ii; ++i) {\n length += getLengthInternal(coordinates[i], radius);\n }\n break;\n }\n case 'MultiPolygon': {\n coordinates = /** @type {import(\"./geom/SimpleGeometry.js\").default} */ (\n geometry\n ).getCoordinates();\n for (i = 0, ii = coordinates.length; i < ii; ++i) {\n coords = coordinates[i];\n for (j = 0, jj = coords.length; j < jj; ++j) {\n length += getLengthInternal(coords[j], radius);\n }\n }\n break;\n }\n case 'GeometryCollection': {\n const geometries =\n /** @type {import(\"./geom/GeometryCollection.js\").default} */ (\n geometry\n ).getGeometries();\n for (i = 0, ii = geometries.length; i < ii; ++i) {\n length += getLength(geometries[i], options);\n }\n break;\n }\n default: {\n throw new Error('Unsupported geometry type: ' + type);\n }\n }\n return length;\n}\n\n/**\n * Returns the spherical area for a list of coordinates.\n *\n * [Reference](https://trs.jpl.nasa.gov/handle/2014/40409)\n * Robert. G. Chamberlain and William H. Duquette, \"Some Algorithms for\n * Polygons on a Sphere\", JPL Publication 07-03, Jet Propulsion\n * Laboratory, Pasadena, CA, June 2007\n *\n * @param {Array} coordinates List of coordinates of a linear\n * ring. If the ring is oriented clockwise, the area will be positive,\n * otherwise it will be negative.\n * @param {number} radius The sphere radius.\n * @return {number} Area (in square meters).\n */\nfunction getAreaInternal(coordinates, radius) {\n let area = 0;\n const len = coordinates.length;\n let x1 = coordinates[len - 1][0];\n let y1 = coordinates[len - 1][1];\n for (let i = 0; i < len; i++) {\n const x2 = coordinates[i][0];\n const y2 = coordinates[i][1];\n area +=\n toRadians(x2 - x1) *\n (2 + Math.sin(toRadians(y1)) + Math.sin(toRadians(y2)));\n x1 = x2;\n y1 = y2;\n }\n return (area * radius * radius) / 2.0;\n}\n\n/**\n * Get the spherical area of a geometry. This is the area (in meters) assuming\n * that polygon edges are segments of great circles on a sphere.\n * @param {import(\"./geom/Geometry.js\").default} geometry A geometry.\n * @param {SphereMetricOptions} [options] Options for the area\n * calculation. By default, geometries are assumed to be in 'EPSG:3857'.\n * You can change this by providing a `projection` option.\n * @return {number} The spherical area (in square meters).\n * @api\n */\nexport function getArea(geometry, options) {\n options = options || {};\n const radius = options.radius || DEFAULT_RADIUS;\n const projection = options.projection || 'EPSG:3857';\n const type = geometry.getType();\n if (type !== 'GeometryCollection') {\n geometry = geometry.clone().transform(projection, 'EPSG:4326');\n }\n let area = 0;\n let coordinates, coords, i, ii, j, jj;\n switch (type) {\n case 'Point':\n case 'MultiPoint':\n case 'LineString':\n case 'MultiLineString':\n case 'LinearRing': {\n break;\n }\n case 'Polygon': {\n coordinates = /** @type {import(\"./geom/Polygon.js\").default} */ (\n geometry\n ).getCoordinates();\n area = Math.abs(getAreaInternal(coordinates[0], radius));\n for (i = 1, ii = coordinates.length; i < ii; ++i) {\n area -= Math.abs(getAreaInternal(coordinates[i], radius));\n }\n break;\n }\n case 'MultiPolygon': {\n coordinates = /** @type {import(\"./geom/SimpleGeometry.js\").default} */ (\n geometry\n ).getCoordinates();\n for (i = 0, ii = coordinates.length; i < ii; ++i) {\n coords = coordinates[i];\n area += Math.abs(getAreaInternal(coords[0], radius));\n for (j = 1, jj = coords.length; j < jj; ++j) {\n area -= Math.abs(getAreaInternal(coords[j], radius));\n }\n }\n break;\n }\n case 'GeometryCollection': {\n const geometries =\n /** @type {import(\"./geom/GeometryCollection.js\").default} */ (\n geometry\n ).getGeometries();\n for (i = 0, ii = geometries.length; i < ii; ++i) {\n area += getArea(geometries[i], options);\n }\n break;\n }\n default: {\n throw new Error('Unsupported geometry type: ' + type);\n }\n }\n return area;\n}\n\n/**\n * Returns the coordinate at the given distance and bearing from `c1`.\n *\n * @param {import(\"./coordinate.js\").Coordinate} c1 The origin point (`[lon, lat]` in degrees).\n * @param {number} distance The great-circle distance between the origin\n * point and the target point.\n * @param {number} bearing The bearing (in radians).\n * @param {number} [radius] The sphere radius to use. Defaults to the Earth's\n * mean radius using the WGS84 ellipsoid.\n * @return {import(\"./coordinate.js\").Coordinate} The target point.\n */\nexport function offset(c1, distance, bearing, radius) {\n radius = radius || DEFAULT_RADIUS;\n const lat1 = toRadians(c1[1]);\n const lon1 = toRadians(c1[0]);\n const dByR = distance / radius;\n const lat = Math.asin(\n Math.sin(lat1) * Math.cos(dByR) +\n Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing)\n );\n const lon =\n lon1 +\n Math.atan2(\n Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1),\n Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat)\n );\n return [toDegrees(lon), toDegrees(lat)];\n}\n", "/**\n * @module ol/console\n */\n\n/**\n * @typedef {'info'|'warn'|'error'|'none'} Level\n */\n\n/**\n * @type {Object}\n */\nconst levels = {\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\n/**\n * @type {number}\n */\nlet level = levels.info;\n\n/**\n * Set the logging level. By default, the level is set to 'info' and all\n * messages will be logged. Set to 'warn' to only display warnings and errors.\n * Set to 'error' to only display errors. Set to 'none' to silence all messages.\n *\n * @param {Level} l The new level.\n */\nexport function setLevel(l) {\n level = levels[l];\n}\n\nexport function log(...args) {\n if (level > levels.info) {\n return;\n }\n console.log(...args); // eslint-disable-line no-console\n}\n\nexport function warn(...args) {\n if (level > levels.warn) {\n return;\n }\n console.warn(...args); // eslint-disable-line no-console\n}\n\nexport function error(...args) {\n if (level > levels.error) {\n return;\n }\n console.error(...args); // eslint-disable-line no-console\n}\n", "/**\n * @module ol/proj\n */\n\n/**\n * The ol/proj module stores:\n * * a list of {@link module:ol/proj/Projection~Projection}\n * objects, one for each projection supported by the application\n * * a list of transform functions needed to convert coordinates in one projection\n * into another.\n *\n * The static functions are the methods used to maintain these.\n * Each transform function can handle not only simple coordinate pairs, but also\n * large arrays of coordinates such as vector geometries.\n *\n * When loaded, the library adds projection objects for EPSG:4326 (WGS84\n * geographic coordinates) and EPSG:3857 (Web or Spherical Mercator, as used\n * for example by Bing Maps or OpenStreetMap), together with the relevant\n * transform functions.\n *\n * Additional transforms may be added by using the http://proj4js.org/\n * library (version 2.2 or later). You can use the full build supplied by\n * Proj4js, or create a custom build to support those projections you need; see\n * the Proj4js website for how to do this. You also need the Proj4js definitions\n * for the required projections. These definitions can be obtained from\n * https://epsg.io/, and are a JS function, so can be loaded in a script\n * tag (as in the examples) or pasted into your application.\n *\n * After all required projection definitions are added to proj4's registry (by\n * using `proj4.defs()`), simply call `register(proj4)` from the `ol/proj/proj4`\n * package. Existing transforms are not changed by this function. See\n * examples/wms-image-custom-proj for an example of this.\n *\n * Additional projection definitions can be registered with `proj4.defs()` any\n * time. Just make sure to call `register(proj4)` again; for example, with user-supplied data where you don't\n * know in advance what projections are needed, you can initially load minimal\n * support and then load whichever are requested.\n *\n * Note that Proj4js does not support projection extents. If you want to add\n * one for creating default tile grids, you can add it after the Projection\n * object has been created with `setExtent`, for example,\n * `get('EPSG:1234').setExtent(extent)`.\n *\n * In addition to Proj4js support, any transform functions can be added with\n * {@link module:ol/proj.addCoordinateTransforms}. To use this, you must first create\n * a {@link module:ol/proj/Projection~Projection} object for the new projection and add it with\n * {@link module:ol/proj.addProjection}. You can then add the forward and inverse\n * functions with {@link module:ol/proj.addCoordinateTransforms}. See\n * examples/wms-custom-proj for an example of this.\n *\n * Note that if no transforms are needed and you only need to define the\n * projection, just add a {@link module:ol/proj/Projection~Projection} with\n * {@link module:ol/proj.addProjection}. See examples/wms-no-proj for an example of\n * this.\n */\nimport Projection from './proj/Projection.js';\nimport {\n PROJECTIONS as EPSG3857_PROJECTIONS,\n fromEPSG4326,\n toEPSG4326,\n} from './proj/epsg3857.js';\nimport {PROJECTIONS as EPSG4326_PROJECTIONS} from './proj/epsg4326.js';\nimport {METERS_PER_UNIT} from './proj/Units.js';\nimport {\n add as addProj,\n clear as clearProj,\n get as getProj,\n} from './proj/projections.js';\nimport {\n add as addTransformFunc,\n clear as clearTransformFuncs,\n get as getTransformFunc,\n} from './proj/transforms.js';\nimport {applyTransform, getWidth} from './extent.js';\nimport {clamp, modulo} from './math.js';\nimport {equals, getWorldsAway} from './coordinate.js';\nimport {getDistance} from './sphere.js';\nimport {warn} from './console.js';\n\n/**\n * A projection as {@link module:ol/proj/Projection~Projection}, SRS identifier\n * string or undefined.\n * @typedef {Projection|string|undefined} ProjectionLike\n * @api\n */\n\n/**\n * A transform function accepts an array of input coordinate values, an optional\n * output array, and an optional dimension (default should be 2). The function\n * transforms the input coordinate values, populates the output array, and\n * returns the output array.\n *\n * @typedef {function(Array, Array=, number=): Array} TransformFunction\n * @api\n */\n\nexport {METERS_PER_UNIT};\n\nexport {Projection};\n\nlet showCoordinateWarning = true;\n\n/**\n * @param {boolean} [disable = true] Disable console info about `useGeographic()`\n */\nexport function disableCoordinateWarning(disable) {\n const hide = disable === undefined ? true : disable;\n showCoordinateWarning = !hide;\n}\n\n/**\n * @param {Array} input Input coordinate array.\n * @param {Array} [output] Output array of coordinate values.\n * @return {Array} Output coordinate array (new array, same coordinate\n * values).\n */\nexport function cloneTransform(input, output) {\n if (output !== undefined) {\n for (let i = 0, ii = input.length; i < ii; ++i) {\n output[i] = input[i];\n }\n output = output;\n } else {\n output = input.slice();\n }\n return output;\n}\n\n/**\n * @param {Array} input Input coordinate array.\n * @param {Array} [output] Output array of coordinate values.\n * @return {Array} Input coordinate array (same array as input).\n */\nexport function identityTransform(input, output) {\n if (output !== undefined && input !== output) {\n for (let i = 0, ii = input.length; i < ii; ++i) {\n output[i] = input[i];\n }\n input = output;\n }\n return input;\n}\n\n/**\n * Add a Projection object to the list of supported projections that can be\n * looked up by their code.\n *\n * @param {Projection} projection Projection instance.\n * @api\n */\nexport function addProjection(projection) {\n addProj(projection.getCode(), projection);\n addTransformFunc(projection, projection, cloneTransform);\n}\n\n/**\n * @param {Array} projections Projections.\n */\nexport function addProjections(projections) {\n projections.forEach(addProjection);\n}\n\n/**\n * Fetches a Projection object for the code specified.\n *\n * @param {ProjectionLike} projectionLike Either a code string which is\n * a combination of authority and identifier such as \"EPSG:4326\", or an\n * existing projection object, or undefined.\n * @return {Projection|null} Projection object, or null if not in list.\n * @api\n */\nexport function get(projectionLike) {\n return typeof projectionLike === 'string'\n ? getProj(/** @type {string} */ (projectionLike))\n : /** @type {Projection} */ (projectionLike) || null;\n}\n\n/**\n * Get the resolution of the point in degrees or distance units.\n * For projections with degrees as the unit this will simply return the\n * provided resolution. For other projections the point resolution is\n * by default estimated by transforming the `point` pixel to EPSG:4326,\n * measuring its width and height on the normal sphere,\n * and taking the average of the width and height.\n * A custom function can be provided for a specific projection, either\n * by setting the `getPointResolution` option in the\n * {@link module:ol/proj/Projection~Projection} constructor or by using\n * {@link module:ol/proj/Projection~Projection#setGetPointResolution} to change an existing\n * projection object.\n * @param {ProjectionLike} projection The projection.\n * @param {number} resolution Nominal resolution in projection units.\n * @param {import(\"./coordinate.js\").Coordinate} point Point to find adjusted resolution at.\n * @param {import(\"./proj/Units.js\").Units} [units] Units to get the point resolution in.\n * Default is the projection's units.\n * @return {number} Point resolution.\n * @api\n */\nexport function getPointResolution(projection, resolution, point, units) {\n projection = get(projection);\n let pointResolution;\n const getter = projection.getPointResolutionFunc();\n if (getter) {\n pointResolution = getter(resolution, point);\n if (units && units !== projection.getUnits()) {\n const metersPerUnit = projection.getMetersPerUnit();\n if (metersPerUnit) {\n pointResolution =\n (pointResolution * metersPerUnit) / METERS_PER_UNIT[units];\n }\n }\n } else {\n const projUnits = projection.getUnits();\n if ((projUnits == 'degrees' && !units) || units == 'degrees') {\n pointResolution = resolution;\n } else {\n // Estimate point resolution by transforming the center pixel to EPSG:4326,\n // measuring its width and height on the normal sphere, and taking the\n // average of the width and height.\n const toEPSG4326 = getTransformFromProjections(\n projection,\n get('EPSG:4326')\n );\n if (toEPSG4326 === identityTransform && projUnits !== 'degrees') {\n // no transform is available\n pointResolution = resolution * projection.getMetersPerUnit();\n } else {\n let vertices = [\n point[0] - resolution / 2,\n point[1],\n point[0] + resolution / 2,\n point[1],\n point[0],\n point[1] - resolution / 2,\n point[0],\n point[1] + resolution / 2,\n ];\n vertices = toEPSG4326(vertices, vertices, 2);\n const width = getDistance(vertices.slice(0, 2), vertices.slice(2, 4));\n const height = getDistance(vertices.slice(4, 6), vertices.slice(6, 8));\n pointResolution = (width + height) / 2;\n }\n const metersPerUnit = units\n ? METERS_PER_UNIT[units]\n : projection.getMetersPerUnit();\n if (metersPerUnit !== undefined) {\n pointResolution /= metersPerUnit;\n }\n }\n }\n return pointResolution;\n}\n\n/**\n * Registers transformation functions that don't alter coordinates. Those allow\n * to transform between projections with equal meaning.\n *\n * @param {Array} projections Projections.\n * @api\n */\nexport function addEquivalentProjections(projections) {\n addProjections(projections);\n projections.forEach(function (source) {\n projections.forEach(function (destination) {\n if (source !== destination) {\n addTransformFunc(source, destination, cloneTransform);\n }\n });\n });\n}\n\n/**\n * Registers transformation functions to convert coordinates in any projection\n * in projection1 to any projection in projection2.\n *\n * @param {Array} projections1 Projections with equal\n * meaning.\n * @param {Array} projections2 Projections with equal\n * meaning.\n * @param {TransformFunction} forwardTransform Transformation from any\n * projection in projection1 to any projection in projection2.\n * @param {TransformFunction} inverseTransform Transform from any projection\n * in projection2 to any projection in projection1..\n */\nexport function addEquivalentTransforms(\n projections1,\n projections2,\n forwardTransform,\n inverseTransform\n) {\n projections1.forEach(function (projection1) {\n projections2.forEach(function (projection2) {\n addTransformFunc(projection1, projection2, forwardTransform);\n addTransformFunc(projection2, projection1, inverseTransform);\n });\n });\n}\n\n/**\n * Clear all cached projections and transforms.\n */\nexport function clearAllProjections() {\n clearProj();\n clearTransformFuncs();\n}\n\n/**\n * @param {Projection|string|undefined} projection Projection.\n * @param {string} defaultCode Default code.\n * @return {Projection} Projection.\n */\nexport function createProjection(projection, defaultCode) {\n if (!projection) {\n return get(defaultCode);\n }\n if (typeof projection === 'string') {\n return get(projection);\n }\n return /** @type {Projection} */ (projection);\n}\n\n/**\n * Creates a {@link module:ol/proj~TransformFunction} from a simple 2D coordinate transform\n * function.\n * @param {function(import(\"./coordinate.js\").Coordinate): import(\"./coordinate.js\").Coordinate} coordTransform Coordinate\n * transform.\n * @return {TransformFunction} Transform function.\n */\nexport function createTransformFromCoordinateTransform(coordTransform) {\n return (\n /**\n * @param {Array} input Input.\n * @param {Array} [output] Output.\n * @param {number} [dimension] Dimension.\n * @return {Array} Output.\n */\n function (input, output, dimension) {\n const length = input.length;\n dimension = dimension !== undefined ? dimension : 2;\n output = output !== undefined ? output : new Array(length);\n for (let i = 0; i < length; i += dimension) {\n const point = coordTransform(input.slice(i, i + dimension));\n const pointLength = point.length;\n for (let j = 0, jj = dimension; j < jj; ++j) {\n output[i + j] = j >= pointLength ? input[i + j] : point[j];\n }\n }\n return output;\n }\n );\n}\n\n/**\n * Registers coordinate transform functions to convert coordinates between the\n * source projection and the destination projection.\n * The forward and inverse functions convert coordinate pairs; this function\n * converts these into the functions used internally which also handle\n * extents and coordinate arrays.\n *\n * @param {ProjectionLike} source Source projection.\n * @param {ProjectionLike} destination Destination projection.\n * @param {function(import(\"./coordinate.js\").Coordinate): import(\"./coordinate.js\").Coordinate} forward The forward transform\n * function (that is, from the source projection to the destination\n * projection) that takes a {@link module:ol/coordinate~Coordinate} as argument and returns\n * the transformed {@link module:ol/coordinate~Coordinate}.\n * @param {function(import(\"./coordinate.js\").Coordinate): import(\"./coordinate.js\").Coordinate} inverse The inverse transform\n * function (that is, from the destination projection to the source\n * projection) that takes a {@link module:ol/coordinate~Coordinate} as argument and returns\n * the transformed {@link module:ol/coordinate~Coordinate}. If the transform function can only\n * transform less dimensions than the input coordinate, it is supposeed to return a coordinate\n * with only the length it can transform. The other dimensions will be taken unchanged from the\n * source.\n * @api\n */\nexport function addCoordinateTransforms(source, destination, forward, inverse) {\n const sourceProj = get(source);\n const destProj = get(destination);\n addTransformFunc(\n sourceProj,\n destProj,\n createTransformFromCoordinateTransform(forward)\n );\n addTransformFunc(\n destProj,\n sourceProj,\n createTransformFromCoordinateTransform(inverse)\n );\n}\n\n/**\n * Transforms a coordinate from longitude/latitude to a different projection.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate as longitude and latitude, i.e.\n * an array with longitude as 1st and latitude as 2nd element.\n * @param {ProjectionLike} [projection] Target projection. The\n * default is Web Mercator, i.e. 'EPSG:3857'.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate projected to the target projection.\n * @api\n */\nexport function fromLonLat(coordinate, projection) {\n disableCoordinateWarning();\n return transform(\n coordinate,\n 'EPSG:4326',\n projection !== undefined ? projection : 'EPSG:3857'\n );\n}\n\n/**\n * Transforms a coordinate to longitude/latitude.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Projected coordinate.\n * @param {ProjectionLike} [projection] Projection of the coordinate.\n * The default is Web Mercator, i.e. 'EPSG:3857'.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate as longitude and latitude, i.e. an array\n * with longitude as 1st and latitude as 2nd element.\n * @api\n */\nexport function toLonLat(coordinate, projection) {\n const lonLat = transform(\n coordinate,\n projection !== undefined ? projection : 'EPSG:3857',\n 'EPSG:4326'\n );\n const lon = lonLat[0];\n if (lon < -180 || lon > 180) {\n lonLat[0] = modulo(lon + 180, 360) - 180;\n }\n return lonLat;\n}\n\n/**\n * Checks if two projections are the same, that is every coordinate in one\n * projection does represent the same geographic point as the same coordinate in\n * the other projection.\n *\n * @param {Projection} projection1 Projection 1.\n * @param {Projection} projection2 Projection 2.\n * @return {boolean} Equivalent.\n * @api\n */\nexport function equivalent(projection1, projection2) {\n if (projection1 === projection2) {\n return true;\n }\n const equalUnits = projection1.getUnits() === projection2.getUnits();\n if (projection1.getCode() === projection2.getCode()) {\n return equalUnits;\n }\n const transformFunc = getTransformFromProjections(projection1, projection2);\n return transformFunc === cloneTransform && equalUnits;\n}\n\n/**\n * Searches in the list of transform functions for the function for converting\n * coordinates from the source projection to the destination projection.\n *\n * @param {Projection} sourceProjection Source Projection object.\n * @param {Projection} destinationProjection Destination Projection\n * object.\n * @return {TransformFunction} Transform function.\n */\nexport function getTransformFromProjections(\n sourceProjection,\n destinationProjection\n) {\n const sourceCode = sourceProjection.getCode();\n const destinationCode = destinationProjection.getCode();\n let transformFunc = getTransformFunc(sourceCode, destinationCode);\n if (!transformFunc) {\n transformFunc = identityTransform;\n }\n return transformFunc;\n}\n\n/**\n * Given the projection-like objects, searches for a transformation\n * function to convert a coordinates array from the source projection to the\n * destination projection.\n *\n * @param {ProjectionLike} source Source.\n * @param {ProjectionLike} destination Destination.\n * @return {TransformFunction} Transform function.\n * @api\n */\nexport function getTransform(source, destination) {\n const sourceProjection = get(source);\n const destinationProjection = get(destination);\n return getTransformFromProjections(sourceProjection, destinationProjection);\n}\n\n/**\n * Transforms a coordinate from source projection to destination projection.\n * This returns a new coordinate (and does not modify the original).\n *\n * See {@link module:ol/proj.transformExtent} for extent transformation.\n * See the transform method of {@link module:ol/geom/Geometry~Geometry} and its\n * subclasses for geometry transforms.\n *\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {ProjectionLike} source Source projection-like.\n * @param {ProjectionLike} destination Destination projection-like.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate.\n * @api\n */\nexport function transform(coordinate, source, destination) {\n const transformFunc = getTransform(source, destination);\n return transformFunc(coordinate, undefined, coordinate.length);\n}\n\n/**\n * Transforms an extent from source projection to destination projection. This\n * returns a new extent (and does not modify the original).\n *\n * @param {import(\"./extent.js\").Extent} extent The extent to transform.\n * @param {ProjectionLike} source Source projection-like.\n * @param {ProjectionLike} destination Destination projection-like.\n * @param {number} [stops] Number of stops per side used for the transform.\n * By default only the corners are used.\n * @return {import(\"./extent.js\").Extent} The transformed extent.\n * @api\n */\nexport function transformExtent(extent, source, destination, stops) {\n const transformFunc = getTransform(source, destination);\n return applyTransform(extent, transformFunc, undefined, stops);\n}\n\n/**\n * Transforms the given point to the destination projection.\n *\n * @param {import(\"./coordinate.js\").Coordinate} point Point.\n * @param {Projection} sourceProjection Source projection.\n * @param {Projection} destinationProjection Destination projection.\n * @return {import(\"./coordinate.js\").Coordinate} Point.\n */\nexport function transformWithProjections(\n point,\n sourceProjection,\n destinationProjection\n) {\n const transformFunc = getTransformFromProjections(\n sourceProjection,\n destinationProjection\n );\n return transformFunc(point);\n}\n\n/**\n * @type {Projection|null}\n */\nlet userProjection = null;\n\n/**\n * Set the projection for coordinates supplied from and returned by API methods.\n * This includes all API methods except for those interacting with tile grids,\n * plus {@link import(\"./Map.js\").FrameState} and {@link import(\"./View.js\").State}.\n * @param {ProjectionLike} projection The user projection.\n * @api\n */\nexport function setUserProjection(projection) {\n userProjection = get(projection);\n}\n\n/**\n * Clear the user projection if set.\n * @api\n */\nexport function clearUserProjection() {\n userProjection = null;\n}\n\n/**\n * Get the projection for coordinates supplied from and returned by API methods.\n * @return {Projection|null} The user projection (or null if not set).\n * @api\n */\nexport function getUserProjection() {\n return userProjection;\n}\n\n/**\n * Use geographic coordinates (WGS-84 datum) in API methods.\n * This includes all API methods except for those interacting with tile grids,\n * plus {@link import(\"./Map.js\").FrameState} and {@link import(\"./View.js\").State}.\n * @api\n */\nexport function useGeographic() {\n setUserProjection('EPSG:4326');\n}\n\n/**\n * Return a coordinate transformed into the user projection. If no user projection\n * is set, the original coordinate is returned.\n * @param {Array} coordinate Input coordinate.\n * @param {ProjectionLike} sourceProjection The input coordinate projection.\n * @return {Array} The input coordinate in the user projection.\n */\nexport function toUserCoordinate(coordinate, sourceProjection) {\n if (!userProjection) {\n return coordinate;\n }\n return transform(coordinate, sourceProjection, userProjection);\n}\n\n/**\n * Return a coordinate transformed from the user projection. If no user projection\n * is set, the original coordinate is returned.\n * @param {Array} coordinate Input coordinate.\n * @param {ProjectionLike} destProjection The destination projection.\n * @return {Array} The input coordinate transformed.\n */\nexport function fromUserCoordinate(coordinate, destProjection) {\n if (!userProjection) {\n if (\n showCoordinateWarning &&\n !equals(coordinate, [0, 0]) &&\n coordinate[0] >= -180 &&\n coordinate[0] <= 180 &&\n coordinate[1] >= -90 &&\n coordinate[1] <= 90\n ) {\n showCoordinateWarning = false;\n warn(\n 'Call useGeographic() from ol/proj once to work with [longitude, latitude] coordinates.'\n );\n }\n return coordinate;\n }\n return transform(coordinate, userProjection, destProjection);\n}\n\n/**\n * Return an extent transformed into the user projection. If no user projection\n * is set, the original extent is returned.\n * @param {import(\"./extent.js\").Extent} extent Input extent.\n * @param {ProjectionLike} sourceProjection The input extent projection.\n * @return {import(\"./extent.js\").Extent} The input extent in the user projection.\n */\nexport function toUserExtent(extent, sourceProjection) {\n if (!userProjection) {\n return extent;\n }\n return transformExtent(extent, sourceProjection, userProjection);\n}\n\n/**\n * Return an extent transformed from the user projection. If no user projection\n * is set, the original extent is returned.\n * @param {import(\"./extent.js\").Extent} extent Input extent.\n * @param {ProjectionLike} destProjection The destination projection.\n * @return {import(\"./extent.js\").Extent} The input extent transformed.\n */\nexport function fromUserExtent(extent, destProjection) {\n if (!userProjection) {\n return extent;\n }\n return transformExtent(extent, userProjection, destProjection);\n}\n\n/**\n * Return the resolution in user projection units per pixel. If no user projection\n * is set, or source or user projection are missing units, the original resolution\n * is returned.\n * @param {number} resolution Resolution in input projection units per pixel.\n * @param {ProjectionLike} sourceProjection The input projection.\n * @return {number} Resolution in user projection units per pixel.\n */\nexport function toUserResolution(resolution, sourceProjection) {\n if (!userProjection) {\n return resolution;\n }\n const sourceUnits = get(sourceProjection).getUnits();\n const userUnits = userProjection.getUnits();\n return sourceUnits && userUnits\n ? (resolution * METERS_PER_UNIT[sourceUnits]) / METERS_PER_UNIT[userUnits]\n : resolution;\n}\n\n/**\n * Return the resolution in user projection units per pixel. If no user projection\n * is set, or source or user projection are missing units, the original resolution\n * is returned.\n * @param {number} resolution Resolution in user projection units per pixel.\n * @param {ProjectionLike} destProjection The destination projection.\n * @return {number} Resolution in destination projection units per pixel.\n */\nexport function fromUserResolution(resolution, destProjection) {\n if (!userProjection) {\n return resolution;\n }\n const sourceUnits = get(destProjection).getUnits();\n const userUnits = userProjection.getUnits();\n return sourceUnits && userUnits\n ? (resolution * METERS_PER_UNIT[userUnits]) / METERS_PER_UNIT[sourceUnits]\n : resolution;\n}\n\n/**\n * Creates a safe coordinate transform function from a coordinate transform function.\n * \"Safe\" means that it can handle wrapping of x-coordinates for global projections,\n * and that coordinates exceeding the source projection validity extent's range will be\n * clamped to the validity range.\n * @param {Projection} sourceProj Source projection.\n * @param {Projection} destProj Destination projection.\n * @param {function(import(\"./coordinate.js\").Coordinate): import(\"./coordinate.js\").Coordinate} transform Transform function (source to destination).\n * @return {function(import(\"./coordinate.js\").Coordinate): import(\"./coordinate.js\").Coordinate} Safe transform function (source to destination).\n */\nexport function createSafeCoordinateTransform(sourceProj, destProj, transform) {\n return function (coord) {\n let transformed, worldsAway;\n if (sourceProj.canWrapX()) {\n const sourceExtent = sourceProj.getExtent();\n const sourceExtentWidth = getWidth(sourceExtent);\n coord = coord.slice(0);\n worldsAway = getWorldsAway(coord, sourceProj, sourceExtentWidth);\n if (worldsAway) {\n // Move x to the real world\n coord[0] = coord[0] - worldsAway * sourceExtentWidth;\n }\n coord[0] = clamp(coord[0], sourceExtent[0], sourceExtent[2]);\n coord[1] = clamp(coord[1], sourceExtent[1], sourceExtent[3]);\n transformed = transform(coord);\n } else {\n transformed = transform(coord);\n }\n if (worldsAway && destProj.canWrapX()) {\n // Move transformed coordinate back to the offset world\n transformed[0] += worldsAway * getWidth(destProj.getExtent());\n }\n return transformed;\n };\n}\n\n/**\n * Add transforms to and from EPSG:4326 and EPSG:3857. This function is called\n * by when this module is executed and should only need to be called again after\n * `clearAllProjections()` is called (e.g. in tests).\n */\nexport function addCommon() {\n // Add transformations that don't alter coordinates to convert within set of\n // projections with equal meaning.\n addEquivalentProjections(EPSG3857_PROJECTIONS);\n addEquivalentProjections(EPSG4326_PROJECTIONS);\n // Add transformations to convert EPSG:4326 like coordinates to EPSG:3857 like\n // coordinates and back.\n addEquivalentTransforms(\n EPSG4326_PROJECTIONS,\n EPSG3857_PROJECTIONS,\n fromEPSG4326,\n toEPSG4326\n );\n}\n\naddCommon();\n", "/**\n * @module ol/centerconstraint\n */\nimport {clamp} from './math.js';\n\n/**\n * @typedef {function((import(\"./coordinate.js\").Coordinate|undefined), number, import(\"./size.js\").Size, boolean=, Array=): (import(\"./coordinate.js\").Coordinate|undefined)} Type\n */\n\n/**\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {boolean} onlyCenter If true, the constraint will only apply to the view center.\n * @param {boolean} smooth If true, the view will be able to go slightly out of the given extent\n * (only during interaction and animation).\n * @return {Type} The constraint.\n */\nexport function createExtent(extent, onlyCenter, smooth) {\n return (\n /**\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center Center.\n * @param {number|undefined} resolution Resolution.\n * @param {import(\"./size.js\").Size} size Viewport size; unused if `onlyCenter` was specified.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @param {Array} [centerShift] Shift between map center and viewport center.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center.\n */\n function (center, resolution, size, isMoving, centerShift) {\n if (!center) {\n return undefined;\n }\n if (!resolution && !onlyCenter) {\n return center;\n }\n const viewWidth = onlyCenter ? 0 : size[0] * resolution;\n const viewHeight = onlyCenter ? 0 : size[1] * resolution;\n const shiftX = centerShift ? centerShift[0] : 0;\n const shiftY = centerShift ? centerShift[1] : 0;\n let minX = extent[0] + viewWidth / 2 + shiftX;\n let maxX = extent[2] - viewWidth / 2 + shiftX;\n let minY = extent[1] + viewHeight / 2 + shiftY;\n let maxY = extent[3] - viewHeight / 2 + shiftY;\n\n // note: when zooming out of bounds, min and max values for x and y may\n // end up inverted (min > max); this has to be accounted for\n if (minX > maxX) {\n minX = (maxX + minX) / 2;\n maxX = minX;\n }\n if (minY > maxY) {\n minY = (maxY + minY) / 2;\n maxY = minY;\n }\n\n let x = clamp(center[0], minX, maxX);\n let y = clamp(center[1], minY, maxY);\n\n // during an interaction, allow some overscroll\n if (isMoving && smooth && resolution) {\n const ratio = 30 * resolution;\n x +=\n -ratio * Math.log(1 + Math.max(0, minX - center[0]) / ratio) +\n ratio * Math.log(1 + Math.max(0, center[0] - maxX) / ratio);\n y +=\n -ratio * Math.log(1 + Math.max(0, minY - center[1]) / ratio) +\n ratio * Math.log(1 + Math.max(0, center[1] - maxY) / ratio);\n }\n\n return [x, y];\n }\n );\n}\n\n/**\n * @param {import(\"./coordinate.js\").Coordinate} [center] Center.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center.\n */\nexport function none(center) {\n return center;\n}\n", "/**\n * @module ol/resolutionconstraint\n */\nimport {clamp} from './math.js';\nimport {getHeight, getWidth} from './extent.js';\nimport {linearFindNearest} from './array.js';\n\n/**\n * @typedef {function((number|undefined), number, import(\"./size.js\").Size, boolean=): (number|undefined)} Type\n */\n\n/**\n * Returns a modified resolution taking into account the viewport size and maximum\n * allowed extent.\n * @param {number} resolution Resolution\n * @param {import(\"./extent.js\").Extent} maxExtent Maximum allowed extent.\n * @param {import(\"./size.js\").Size} viewportSize Viewport size.\n * @param {boolean} showFullExtent Whether to show the full extent.\n * @return {number} Capped resolution.\n */\nfunction getViewportClampedResolution(\n resolution,\n maxExtent,\n viewportSize,\n showFullExtent\n) {\n const xResolution = getWidth(maxExtent) / viewportSize[0];\n const yResolution = getHeight(maxExtent) / viewportSize[1];\n\n if (showFullExtent) {\n return Math.min(resolution, Math.max(xResolution, yResolution));\n }\n return Math.min(resolution, Math.min(xResolution, yResolution));\n}\n\n/**\n * Returns a modified resolution to be between maxResolution and minResolution while\n * still allowing the value to be slightly out of bounds.\n * Note: the computation is based on the logarithm function (ln):\n * - at 1, ln(x) is 0\n * - above 1, ln(x) keeps increasing but at a much slower pace than x\n * The final result is clamped to prevent getting too far away from bounds.\n * @param {number} resolution Resolution.\n * @param {number} maxResolution Max resolution.\n * @param {number} minResolution Min resolution.\n * @return {number} Smoothed resolution.\n */\nfunction getSmoothClampedResolution(resolution, maxResolution, minResolution) {\n let result = Math.min(resolution, maxResolution);\n const ratio = 50;\n\n result *=\n Math.log(1 + ratio * Math.max(0, resolution / maxResolution - 1)) / ratio +\n 1;\n if (minResolution) {\n result = Math.max(result, minResolution);\n result /=\n Math.log(1 + ratio * Math.max(0, minResolution / resolution - 1)) /\n ratio +\n 1;\n }\n return clamp(result, minResolution / 2, maxResolution * 2);\n}\n\n/**\n * @param {Array} resolutions Resolutions.\n * @param {boolean} [smooth] If true, the view will be able to slightly exceed resolution limits. Default: true.\n * @param {import(\"./extent.js\").Extent} [maxExtent] Maximum allowed extent.\n * @param {boolean} [showFullExtent] If true, allows us to show the full extent. Default: false.\n * @return {Type} Zoom function.\n */\nexport function createSnapToResolutions(\n resolutions,\n smooth,\n maxExtent,\n showFullExtent\n) {\n smooth = smooth !== undefined ? smooth : true;\n return (\n /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function (resolution, direction, size, isMoving) {\n if (resolution !== undefined) {\n const maxResolution = resolutions[0];\n const minResolution = resolutions[resolutions.length - 1];\n const cappedMaxRes = maxExtent\n ? getViewportClampedResolution(\n maxResolution,\n maxExtent,\n size,\n showFullExtent\n )\n : maxResolution;\n\n // during interacting or animating, allow intermediary values\n if (isMoving) {\n if (!smooth) {\n return clamp(resolution, minResolution, cappedMaxRes);\n }\n return getSmoothClampedResolution(\n resolution,\n cappedMaxRes,\n minResolution\n );\n }\n\n const capped = Math.min(cappedMaxRes, resolution);\n const z = Math.floor(linearFindNearest(resolutions, capped, direction));\n if (resolutions[z] > cappedMaxRes && z < resolutions.length - 1) {\n return resolutions[z + 1];\n }\n return resolutions[z];\n }\n return undefined;\n }\n );\n}\n\n/**\n * @param {number} power Power.\n * @param {number} maxResolution Maximum resolution.\n * @param {number} [minResolution] Minimum resolution.\n * @param {boolean} [smooth] If true, the view will be able to slightly exceed resolution limits. Default: true.\n * @param {import(\"./extent.js\").Extent} [maxExtent] Maximum allowed extent.\n * @param {boolean} [showFullExtent] If true, allows us to show the full extent. Default: false.\n * @return {Type} Zoom function.\n */\nexport function createSnapToPower(\n power,\n maxResolution,\n minResolution,\n smooth,\n maxExtent,\n showFullExtent\n) {\n smooth = smooth !== undefined ? smooth : true;\n minResolution = minResolution !== undefined ? minResolution : 0;\n\n return (\n /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function (resolution, direction, size, isMoving) {\n if (resolution !== undefined) {\n const cappedMaxRes = maxExtent\n ? getViewportClampedResolution(\n maxResolution,\n maxExtent,\n size,\n showFullExtent\n )\n : maxResolution;\n\n // during interacting or animating, allow intermediary values\n if (isMoving) {\n if (!smooth) {\n return clamp(resolution, minResolution, cappedMaxRes);\n }\n return getSmoothClampedResolution(\n resolution,\n cappedMaxRes,\n minResolution\n );\n }\n\n const tolerance = 1e-9;\n const minZoomLevel = Math.ceil(\n Math.log(maxResolution / cappedMaxRes) / Math.log(power) - tolerance\n );\n const offset = -direction * (0.5 - tolerance) + 0.5;\n const capped = Math.min(cappedMaxRes, resolution);\n const cappedZoomLevel = Math.floor(\n Math.log(maxResolution / capped) / Math.log(power) + offset\n );\n const zoomLevel = Math.max(minZoomLevel, cappedZoomLevel);\n const newResolution = maxResolution / Math.pow(power, zoomLevel);\n return clamp(newResolution, minResolution, cappedMaxRes);\n }\n return undefined;\n }\n );\n}\n\n/**\n * @param {number} maxResolution Max resolution.\n * @param {number} minResolution Min resolution.\n * @param {boolean} [smooth] If true, the view will be able to slightly exceed resolution limits. Default: true.\n * @param {import(\"./extent.js\").Extent} [maxExtent] Maximum allowed extent.\n * @param {boolean} [showFullExtent] If true, allows us to show the full extent. Default: false.\n * @return {Type} Zoom function.\n */\nexport function createMinMaxResolution(\n maxResolution,\n minResolution,\n smooth,\n maxExtent,\n showFullExtent\n) {\n smooth = smooth !== undefined ? smooth : true;\n\n return (\n /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function (resolution, direction, size, isMoving) {\n if (resolution !== undefined) {\n const cappedMaxRes = maxExtent\n ? getViewportClampedResolution(\n maxResolution,\n maxExtent,\n size,\n showFullExtent\n )\n : maxResolution;\n\n if (!smooth || !isMoving) {\n return clamp(resolution, minResolution, cappedMaxRes);\n }\n return getSmoothClampedResolution(\n resolution,\n cappedMaxRes,\n minResolution\n );\n }\n return undefined;\n }\n );\n}\n", "/**\n * @module ol/rotationconstraint\n */\nimport {toRadians} from './math.js';\n\n/**\n * @typedef {function((number|undefined), boolean=): (number|undefined)} Type\n */\n\n/**\n * @param {number|undefined} rotation Rotation.\n * @return {number|undefined} Rotation.\n */\nexport function disable(rotation) {\n if (rotation !== undefined) {\n return 0;\n }\n return undefined;\n}\n\n/**\n * @param {number|undefined} rotation Rotation.\n * @return {number|undefined} Rotation.\n */\nexport function none(rotation) {\n if (rotation !== undefined) {\n return rotation;\n }\n return undefined;\n}\n\n/**\n * @param {number} n N.\n * @return {Type} Rotation constraint.\n */\nexport function createSnapToN(n) {\n const theta = (2 * Math.PI) / n;\n return (\n /**\n * @param {number|undefined} rotation Rotation.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Rotation.\n */\n function (rotation, isMoving) {\n if (isMoving) {\n return rotation;\n }\n\n if (rotation !== undefined) {\n rotation = Math.floor(rotation / theta + 0.5) * theta;\n return rotation;\n }\n return undefined;\n }\n );\n}\n\n/**\n * @param {number} [tolerance] Tolerance.\n * @return {Type} Rotation constraint.\n */\nexport function createSnapToZero(tolerance) {\n tolerance = tolerance || toRadians(5);\n return (\n /**\n * @param {number|undefined} rotation Rotation.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Rotation.\n */\n function (rotation, isMoving) {\n if (isMoving) {\n return rotation;\n }\n\n if (rotation !== undefined) {\n if (Math.abs(rotation) <= tolerance) {\n return 0;\n }\n return rotation;\n }\n return undefined;\n }\n );\n}\n", "/**\n * @module ol/easing\n */\n\n/**\n * Start slow and speed up.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nexport function easeIn(t) {\n return Math.pow(t, 3);\n}\n\n/**\n * Start fast and slow down.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nexport function easeOut(t) {\n return 1 - easeIn(1 - t);\n}\n\n/**\n * Start slow, speed up, and then slow down again.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nexport function inAndOut(t) {\n return 3 * t * t - 2 * t * t * t;\n}\n\n/**\n * Maintain a constant speed over time.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nexport function linear(t) {\n return t;\n}\n\n/**\n * Start slow, speed up, and at the very end slow down again. This has the\n * same general behavior as {@link module:ol/easing.inAndOut}, but the final\n * slowdown is delayed.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nexport function upAndDown(t) {\n if (t < 0.5) {\n return inAndOut(2 * t);\n }\n return 1 - inAndOut(2 * (t - 0.5));\n}\n", "/**\n * @module ol/geom/flat/transform\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import(\"../../transform.js\").Transform} transform Transform.\n * @param {Array} [dest] Destination.\n * @return {Array} Transformed coordinates.\n */\nexport function transform2D(\n flatCoordinates,\n offset,\n end,\n stride,\n transform,\n dest\n) {\n dest = dest ? dest : [];\n let i = 0;\n for (let j = offset; j < end; j += stride) {\n const x = flatCoordinates[j];\n const y = flatCoordinates[j + 1];\n dest[i++] = transform[0] * x + transform[2] * y + transform[4];\n dest[i++] = transform[1] * x + transform[3] * y + transform[5];\n }\n if (dest && dest.length != i) {\n dest.length = i;\n }\n return dest;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} angle Angle.\n * @param {Array} anchor Rotation anchor point.\n * @param {Array} [dest] Destination.\n * @return {Array} Transformed coordinates.\n */\nexport function rotate(\n flatCoordinates,\n offset,\n end,\n stride,\n angle,\n anchor,\n dest\n) {\n dest = dest ? dest : [];\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const anchorX = anchor[0];\n const anchorY = anchor[1];\n let i = 0;\n for (let j = offset; j < end; j += stride) {\n const deltaX = flatCoordinates[j] - anchorX;\n const deltaY = flatCoordinates[j + 1] - anchorY;\n dest[i++] = anchorX + deltaX * cos - deltaY * sin;\n dest[i++] = anchorY + deltaX * sin + deltaY * cos;\n for (let k = j + 2; k < j + stride; ++k) {\n dest[i++] = flatCoordinates[k];\n }\n }\n if (dest && dest.length != i) {\n dest.length = i;\n }\n return dest;\n}\n\n/**\n * Scale the coordinates.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} sx Scale factor in the x-direction.\n * @param {number} sy Scale factor in the y-direction.\n * @param {Array} anchor Scale anchor point.\n * @param {Array} [dest] Destination.\n * @return {Array} Transformed coordinates.\n */\nexport function scale(\n flatCoordinates,\n offset,\n end,\n stride,\n sx,\n sy,\n anchor,\n dest\n) {\n dest = dest ? dest : [];\n const anchorX = anchor[0];\n const anchorY = anchor[1];\n let i = 0;\n for (let j = offset; j < end; j += stride) {\n const deltaX = flatCoordinates[j] - anchorX;\n const deltaY = flatCoordinates[j + 1] - anchorY;\n dest[i++] = anchorX + sx * deltaX;\n dest[i++] = anchorY + sy * deltaY;\n for (let k = j + 2; k < j + stride; ++k) {\n dest[i++] = flatCoordinates[k];\n }\n }\n if (dest && dest.length != i) {\n dest.length = i;\n }\n return dest;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @param {Array} [dest] Destination.\n * @return {Array} Transformed coordinates.\n */\nexport function translate(\n flatCoordinates,\n offset,\n end,\n stride,\n deltaX,\n deltaY,\n dest\n) {\n dest = dest ? dest : [];\n let i = 0;\n for (let j = offset; j < end; j += stride) {\n dest[i++] = flatCoordinates[j] + deltaX;\n dest[i++] = flatCoordinates[j + 1] + deltaY;\n for (let k = j + 2; k < j + stride; ++k) {\n dest[i++] = flatCoordinates[k];\n }\n }\n if (dest && dest.length != i) {\n dest.length = i;\n }\n return dest;\n}\n", "/**\n * @module ol/geom/Geometry\n */\nimport BaseObject from '../Object.js';\nimport {abstract} from '../util.js';\nimport {\n compose as composeTransform,\n create as createTransform,\n} from '../transform.js';\nimport {\n createEmpty,\n createOrUpdateEmpty,\n getHeight,\n returnOrUpdate,\n} from '../extent.js';\nimport {get as getProjection, getTransform} from '../proj.js';\nimport {memoizeOne} from '../functions.js';\nimport {transform2D} from './flat/transform.js';\n\n/**\n * @typedef {'XY' | 'XYZ' | 'XYM' | 'XYZM'} GeometryLayout\n * The coordinate layout for geometries, indicating whether a 3rd or 4th z ('Z')\n * or measure ('M') coordinate is available.\n */\n\n/**\n * @typedef {'Point' | 'LineString' | 'LinearRing' | 'Polygon' | 'MultiPoint' | 'MultiLineString' | 'MultiPolygon' | 'GeometryCollection' | 'Circle'} Type\n * The geometry type. One of `'Point'`, `'LineString'`, `'LinearRing'`,\n * `'Polygon'`, `'MultiPoint'`, `'MultiLineString'`, `'MultiPolygon'`,\n * `'GeometryCollection'`, or `'Circle'`.\n */\n\n/**\n * @type {import(\"../transform.js\").Transform}\n */\nconst tmpTransform = createTransform();\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Base class for vector geometries.\n *\n * To get notified of changes to the geometry, register a listener for the\n * generic `change` event on your geometry instance.\n *\n * @abstract\n * @api\n */\nclass Geometry extends BaseObject {\n constructor() {\n super();\n\n /**\n * @private\n * @type {import(\"../extent.js\").Extent}\n */\n this.extent_ = createEmpty();\n\n /**\n * @private\n * @type {number}\n */\n this.extentRevision_ = -1;\n\n /**\n * @protected\n * @type {number}\n */\n this.simplifiedGeometryMaxMinSquaredTolerance = 0;\n\n /**\n * @protected\n * @type {number}\n */\n this.simplifiedGeometryRevision = 0;\n\n /**\n * Get a transformed and simplified version of the geometry.\n * @abstract\n * @param {number} revision The geometry revision.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {import(\"../proj.js\").TransformFunction} [transform] Optional transform function.\n * @return {Geometry} Simplified geometry.\n */\n this.simplifyTransformedInternal = memoizeOne(function (\n revision,\n squaredTolerance,\n transform\n ) {\n if (!transform) {\n return this.getSimplifiedGeometry(squaredTolerance);\n }\n const clone = this.clone();\n clone.applyTransform(transform);\n return clone.getSimplifiedGeometry(squaredTolerance);\n });\n }\n\n /**\n * Get a transformed and simplified version of the geometry.\n * @abstract\n * @param {number} squaredTolerance Squared tolerance.\n * @param {import(\"../proj.js\").TransformFunction} [transform] Optional transform function.\n * @return {Geometry} Simplified geometry.\n */\n simplifyTransformed(squaredTolerance, transform) {\n return this.simplifyTransformedInternal(\n this.getRevision(),\n squaredTolerance,\n transform\n );\n }\n\n /**\n * Make a complete copy of the geometry.\n * @abstract\n * @return {!Geometry} Clone.\n */\n clone() {\n return abstract();\n }\n\n /**\n * @abstract\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(x, y, closestPoint, minSquaredDistance) {\n return abstract();\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n containsXY(x, y) {\n const coord = this.getClosestPoint([x, y]);\n return coord[0] === x && coord[1] === y;\n }\n\n /**\n * Return the closest point of the geometry to the passed point as\n * {@link module:ol/coordinate~Coordinate coordinate}.\n * @param {import(\"../coordinate.js\").Coordinate} point Point.\n * @param {import(\"../coordinate.js\").Coordinate} [closestPoint] Closest point.\n * @return {import(\"../coordinate.js\").Coordinate} Closest point.\n * @api\n */\n getClosestPoint(point, closestPoint) {\n closestPoint = closestPoint ? closestPoint : [NaN, NaN];\n this.closestPointXY(point[0], point[1], closestPoint, Infinity);\n return closestPoint;\n }\n\n /**\n * Returns true if this geometry includes the specified coordinate. If the\n * coordinate is on the boundary of the geometry, returns false.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {boolean} Contains coordinate.\n * @api\n */\n intersectsCoordinate(coordinate) {\n return this.containsXY(coordinate[0], coordinate[1]);\n }\n\n /**\n * @abstract\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(extent) {\n return abstract();\n }\n\n /**\n * Get the extent of the geometry.\n * @param {import(\"../extent.js\").Extent} [extent] Extent.\n * @return {import(\"../extent.js\").Extent} extent Extent.\n * @api\n */\n getExtent(extent) {\n if (this.extentRevision_ != this.getRevision()) {\n const extent = this.computeExtent(this.extent_);\n if (isNaN(extent[0]) || isNaN(extent[1])) {\n createOrUpdateEmpty(extent);\n }\n this.extentRevision_ = this.getRevision();\n }\n return returnOrUpdate(this.extent_, extent);\n }\n\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @abstract\n * @param {number} angle Rotation angle in radians.\n * @param {import(\"../coordinate.js\").Coordinate} anchor The rotation center.\n * @api\n */\n rotate(angle, anchor) {\n abstract();\n }\n\n /**\n * Scale the geometry (with an optional origin). This modifies the geometry\n * coordinates in place.\n * @abstract\n * @param {number} sx The scaling factor in the x-direction.\n * @param {number} [sy] The scaling factor in the y-direction (defaults to sx).\n * @param {import(\"../coordinate.js\").Coordinate} [anchor] The scale origin (defaults to the center\n * of the geometry extent).\n * @api\n */\n scale(sx, sy, anchor) {\n abstract();\n }\n\n /**\n * Create a simplified version of this geometry. For linestrings, this uses\n * the [Douglas Peucker](https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm)\n * algorithm. For polygons, a quantization-based\n * simplification is used to preserve topology.\n * @param {number} tolerance The tolerance distance for simplification.\n * @return {Geometry} A new, simplified version of the original geometry.\n * @api\n */\n simplify(tolerance) {\n return this.getSimplifiedGeometry(tolerance * tolerance);\n }\n\n /**\n * Create a simplified version of this geometry using the Douglas Peucker\n * algorithm.\n * See https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm.\n * @abstract\n * @param {number} squaredTolerance Squared tolerance.\n * @return {Geometry} Simplified geometry.\n */\n getSimplifiedGeometry(squaredTolerance) {\n return abstract();\n }\n\n /**\n * Get the type of this geometry.\n * @abstract\n * @return {Type} Geometry type.\n */\n getType() {\n return abstract();\n }\n\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @abstract\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform function.\n * Called with a flat array of geometry coordinates.\n */\n applyTransform(transformFn) {\n abstract();\n }\n\n /**\n * Test if the geometry and the passed extent intersect.\n * @abstract\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n */\n intersectsExtent(extent) {\n return abstract();\n }\n\n /**\n * Translate the geometry. This modifies the geometry coordinates in place. If\n * instead you want a new geometry, first `clone()` this geometry.\n * @abstract\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @api\n */\n translate(deltaX, deltaY) {\n abstract();\n }\n\n /**\n * Transform each coordinate of the geometry from one coordinate reference\n * system to another. The geometry is modified in place.\n * For example, a line will be transformed to a line and a circle to a circle.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n *\n * @param {import(\"../proj.js\").ProjectionLike} source The current projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @param {import(\"../proj.js\").ProjectionLike} destination The desired projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @return {Geometry} This geometry. Note that original geometry is\n * modified in place.\n * @api\n */\n transform(source, destination) {\n /** @type {import(\"../proj/Projection.js\").default} */\n const sourceProj = getProjection(source);\n const transformFn =\n sourceProj.getUnits() == 'tile-pixels'\n ? function (inCoordinates, outCoordinates, stride) {\n const pixelExtent = sourceProj.getExtent();\n const projectedExtent = sourceProj.getWorldExtent();\n const scale = getHeight(projectedExtent) / getHeight(pixelExtent);\n composeTransform(\n tmpTransform,\n projectedExtent[0],\n projectedExtent[3],\n scale,\n -scale,\n 0,\n 0,\n 0\n );\n transform2D(\n inCoordinates,\n 0,\n inCoordinates.length,\n stride,\n tmpTransform,\n outCoordinates\n );\n return getTransform(sourceProj, destination)(\n inCoordinates,\n outCoordinates,\n stride\n );\n }\n : getTransform(sourceProj, destination);\n this.applyTransform(transformFn);\n return this;\n }\n}\n\nexport default Geometry;\n", "/**\n * @module ol/geom/SimpleGeometry\n */\nimport Geometry from './Geometry.js';\nimport {abstract} from '../util.js';\nimport {createOrUpdateFromFlatCoordinates, getCenter} from '../extent.js';\nimport {rotate, scale, transform2D, translate} from './flat/transform.js';\n\n/**\n * @classdesc\n * Abstract base class; only used for creating subclasses; do not instantiate\n * in apps, as cannot be rendered.\n *\n * @abstract\n * @api\n */\nclass SimpleGeometry extends Geometry {\n constructor() {\n super();\n\n /**\n * @protected\n * @type {import(\"./Geometry.js\").GeometryLayout}\n */\n this.layout = 'XY';\n\n /**\n * @protected\n * @type {number}\n */\n this.stride = 2;\n\n /**\n * @protected\n * @type {Array}\n */\n this.flatCoordinates = null;\n }\n\n /**\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(extent) {\n return createOrUpdateFromFlatCoordinates(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n extent\n );\n }\n\n /**\n * @abstract\n * @return {Array<*> | null} Coordinates.\n */\n getCoordinates() {\n return abstract();\n }\n\n /**\n * Return the first coordinate of the geometry.\n * @return {import(\"../coordinate.js\").Coordinate} First coordinate.\n * @api\n */\n getFirstCoordinate() {\n return this.flatCoordinates.slice(0, this.stride);\n }\n\n /**\n * @return {Array} Flat coordinates.\n */\n getFlatCoordinates() {\n return this.flatCoordinates;\n }\n\n /**\n * Return the last coordinate of the geometry.\n * @return {import(\"../coordinate.js\").Coordinate} Last point.\n * @api\n */\n getLastCoordinate() {\n return this.flatCoordinates.slice(\n this.flatCoordinates.length - this.stride\n );\n }\n\n /**\n * Return the {@link import(\"./Geometry.js\").GeometryLayout layout} of the geometry.\n * @return {import(\"./Geometry.js\").GeometryLayout} Layout.\n * @api\n */\n getLayout() {\n return this.layout;\n }\n\n /**\n * Create a simplified version of this geometry using the Douglas Peucker algorithm.\n * @param {number} squaredTolerance Squared tolerance.\n * @return {SimpleGeometry} Simplified geometry.\n */\n getSimplifiedGeometry(squaredTolerance) {\n if (this.simplifiedGeometryRevision !== this.getRevision()) {\n this.simplifiedGeometryMaxMinSquaredTolerance = 0;\n this.simplifiedGeometryRevision = this.getRevision();\n }\n // If squaredTolerance is negative or if we know that simplification will not\n // have any effect then just return this.\n if (\n squaredTolerance < 0 ||\n (this.simplifiedGeometryMaxMinSquaredTolerance !== 0 &&\n squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance)\n ) {\n return this;\n }\n\n const simplifiedGeometry =\n this.getSimplifiedGeometryInternal(squaredTolerance);\n const simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates();\n if (simplifiedFlatCoordinates.length < this.flatCoordinates.length) {\n return simplifiedGeometry;\n }\n // Simplification did not actually remove any coordinates. We now know\n // that any calls to getSimplifiedGeometry with a squaredTolerance less\n // than or equal to the current squaredTolerance will also not have any\n // effect. This allows us to short circuit simplification (saving CPU\n // cycles) and prevents the cache of simplified geometries from filling\n // up with useless identical copies of this geometry (saving memory).\n this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance;\n return this;\n }\n\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {SimpleGeometry} Simplified geometry.\n * @protected\n */\n getSimplifiedGeometryInternal(squaredTolerance) {\n return this;\n }\n\n /**\n * @return {number} Stride.\n */\n getStride() {\n return this.stride;\n }\n\n /**\n * @param {import(\"./Geometry.js\").GeometryLayout} layout Layout.\n * @param {Array} flatCoordinates Flat coordinates.\n */\n setFlatCoordinates(layout, flatCoordinates) {\n this.stride = getStrideForLayout(layout);\n this.layout = layout;\n this.flatCoordinates = flatCoordinates;\n }\n\n /**\n * @abstract\n * @param {!Array<*>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n setCoordinates(coordinates, layout) {\n abstract();\n }\n\n /**\n * @param {import(\"./Geometry.js\").GeometryLayout|undefined} layout Layout.\n * @param {Array<*>} coordinates Coordinates.\n * @param {number} nesting Nesting.\n * @protected\n */\n setLayout(layout, coordinates, nesting) {\n /** @type {number} */\n let stride;\n if (layout) {\n stride = getStrideForLayout(layout);\n } else {\n for (let i = 0; i < nesting; ++i) {\n if (coordinates.length === 0) {\n this.layout = 'XY';\n this.stride = 2;\n return;\n }\n coordinates = /** @type {Array} */ (coordinates[0]);\n }\n stride = coordinates.length;\n layout = getLayoutForStride(stride);\n }\n this.layout = layout;\n this.stride = stride;\n }\n\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform function.\n * Called with a flat array of geometry coordinates.\n * @api\n */\n applyTransform(transformFn) {\n if (this.flatCoordinates) {\n transformFn(this.flatCoordinates, this.flatCoordinates, this.stride);\n this.changed();\n }\n }\n\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @param {number} angle Rotation angle in counter-clockwise radians.\n * @param {import(\"../coordinate.js\").Coordinate} anchor The rotation center.\n * @api\n */\n rotate(angle, anchor) {\n const flatCoordinates = this.getFlatCoordinates();\n if (flatCoordinates) {\n const stride = this.getStride();\n rotate(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n angle,\n anchor,\n flatCoordinates\n );\n this.changed();\n }\n }\n\n /**\n * Scale the geometry (with an optional origin). This modifies the geometry\n * coordinates in place.\n * @param {number} sx The scaling factor in the x-direction.\n * @param {number} [sy] The scaling factor in the y-direction (defaults to sx).\n * @param {import(\"../coordinate.js\").Coordinate} [anchor] The scale origin (defaults to the center\n * of the geometry extent).\n * @api\n */\n scale(sx, sy, anchor) {\n if (sy === undefined) {\n sy = sx;\n }\n if (!anchor) {\n anchor = getCenter(this.getExtent());\n }\n const flatCoordinates = this.getFlatCoordinates();\n if (flatCoordinates) {\n const stride = this.getStride();\n scale(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n sx,\n sy,\n anchor,\n flatCoordinates\n );\n this.changed();\n }\n }\n\n /**\n * Translate the geometry. This modifies the geometry coordinates in place. If\n * instead you want a new geometry, first `clone()` this geometry.\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @api\n */\n translate(deltaX, deltaY) {\n const flatCoordinates = this.getFlatCoordinates();\n if (flatCoordinates) {\n const stride = this.getStride();\n translate(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n deltaX,\n deltaY,\n flatCoordinates\n );\n this.changed();\n }\n }\n}\n\n/**\n * @param {number} stride Stride.\n * @return {import(\"./Geometry.js\").GeometryLayout} layout Layout.\n */\nfunction getLayoutForStride(stride) {\n let layout;\n if (stride == 2) {\n layout = 'XY';\n } else if (stride == 3) {\n layout = 'XYZ';\n } else if (stride == 4) {\n layout = 'XYZM';\n }\n return /** @type {import(\"./Geometry.js\").GeometryLayout} */ (layout);\n}\n\n/**\n * @param {import(\"./Geometry.js\").GeometryLayout} layout Layout.\n * @return {number} Stride.\n */\nexport function getStrideForLayout(layout) {\n let stride;\n if (layout == 'XY') {\n stride = 2;\n } else if (layout == 'XYZ' || layout == 'XYM') {\n stride = 3;\n } else if (layout == 'XYZM') {\n stride = 4;\n }\n return /** @type {number} */ (stride);\n}\n\n/**\n * @param {SimpleGeometry} simpleGeometry Simple geometry.\n * @param {import(\"../transform.js\").Transform} transform Transform.\n * @param {Array} [dest] Destination.\n * @return {Array} Transformed flat coordinates.\n */\nexport function transformGeom2D(simpleGeometry, transform, dest) {\n const flatCoordinates = simpleGeometry.getFlatCoordinates();\n if (!flatCoordinates) {\n return null;\n }\n const stride = simpleGeometry.getStride();\n return transform2D(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n transform,\n dest\n );\n}\n\nexport default SimpleGeometry;\n", "/**\n * @module ol/geom/flat/closest\n */\nimport {lerp, squaredDistance as squaredDx} from '../../math.js';\n\n/**\n * Returns the point on the 2D line segment flatCoordinates[offset1] to\n * flatCoordinates[offset2] that is closest to the point (x, y). Extra\n * dimensions are linearly interpolated.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset1 Offset 1.\n * @param {number} offset2 Offset 2.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n */\nfunction assignClosest(\n flatCoordinates,\n offset1,\n offset2,\n stride,\n x,\n y,\n closestPoint\n) {\n const x1 = flatCoordinates[offset1];\n const y1 = flatCoordinates[offset1 + 1];\n const dx = flatCoordinates[offset2] - x1;\n const dy = flatCoordinates[offset2 + 1] - y1;\n let offset;\n if (dx === 0 && dy === 0) {\n offset = offset1;\n } else {\n const t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);\n if (t > 1) {\n offset = offset2;\n } else if (t > 0) {\n for (let i = 0; i < stride; ++i) {\n closestPoint[i] = lerp(\n flatCoordinates[offset1 + i],\n flatCoordinates[offset2 + i],\n t\n );\n }\n closestPoint.length = stride;\n return;\n } else {\n offset = offset1;\n }\n }\n for (let i = 0; i < stride; ++i) {\n closestPoint[i] = flatCoordinates[offset + i];\n }\n closestPoint.length = stride;\n}\n\n/**\n * Return the squared of the largest distance between any pair of consecutive\n * coordinates.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} max Max squared delta.\n * @return {number} Max squared delta.\n */\nexport function maxSquaredDelta(flatCoordinates, offset, end, stride, max) {\n let x1 = flatCoordinates[offset];\n let y1 = flatCoordinates[offset + 1];\n for (offset += stride; offset < end; offset += stride) {\n const x2 = flatCoordinates[offset];\n const y2 = flatCoordinates[offset + 1];\n const squaredDelta = squaredDx(x1, y1, x2, y2);\n if (squaredDelta > max) {\n max = squaredDelta;\n }\n x1 = x2;\n y1 = y2;\n }\n return max;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} max Max squared delta.\n * @return {number} Max squared delta.\n */\nexport function arrayMaxSquaredDelta(\n flatCoordinates,\n offset,\n ends,\n stride,\n max\n) {\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n max = maxSquaredDelta(flatCoordinates, offset, end, stride, max);\n offset = end;\n }\n return max;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} max Max squared delta.\n * @return {number} Max squared delta.\n */\nexport function multiArrayMaxSquaredDelta(\n flatCoordinates,\n offset,\n endss,\n stride,\n max\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n max = arrayMaxSquaredDelta(flatCoordinates, offset, ends, stride, max);\n offset = ends[ends.length - 1];\n }\n return max;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} maxDelta Max delta.\n * @param {boolean} isRing Is ring.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @param {Array} [tmpPoint] Temporary point object.\n * @return {number} Minimum squared distance.\n */\nexport function assignClosestPoint(\n flatCoordinates,\n offset,\n end,\n stride,\n maxDelta,\n isRing,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n tmpPoint\n) {\n if (offset == end) {\n return minSquaredDistance;\n }\n let i, squaredDistance;\n if (maxDelta === 0) {\n // All points are identical, so just test the first point.\n squaredDistance = squaredDx(\n x,\n y,\n flatCoordinates[offset],\n flatCoordinates[offset + 1]\n );\n if (squaredDistance < minSquaredDistance) {\n for (i = 0; i < stride; ++i) {\n closestPoint[i] = flatCoordinates[offset + i];\n }\n closestPoint.length = stride;\n return squaredDistance;\n }\n return minSquaredDistance;\n }\n tmpPoint = tmpPoint ? tmpPoint : [NaN, NaN];\n let index = offset + stride;\n while (index < end) {\n assignClosest(\n flatCoordinates,\n index - stride,\n index,\n stride,\n x,\n y,\n tmpPoint\n );\n squaredDistance = squaredDx(x, y, tmpPoint[0], tmpPoint[1]);\n if (squaredDistance < minSquaredDistance) {\n minSquaredDistance = squaredDistance;\n for (i = 0; i < stride; ++i) {\n closestPoint[i] = tmpPoint[i];\n }\n closestPoint.length = stride;\n index += stride;\n } else {\n // Skip ahead multiple points, because we know that all the skipped\n // points cannot be any closer than the closest point we have found so\n // far. We know this because we know how close the current point is, how\n // close the closest point we have found so far is, and the maximum\n // distance between consecutive points. For example, if we're currently\n // at distance 10, the best we've found so far is 3, and that the maximum\n // distance between consecutive points is 2, then we'll need to skip at\n // least (10 - 3) / 2 == 3 (rounded down) points to have any chance of\n // finding a closer point. We use Math.max(..., 1) to ensure that we\n // always advance at least one point, to avoid an infinite loop.\n index +=\n stride *\n Math.max(\n ((Math.sqrt(squaredDistance) - Math.sqrt(minSquaredDistance)) /\n maxDelta) |\n 0,\n 1\n );\n }\n }\n if (isRing) {\n // Check the closing segment.\n assignClosest(\n flatCoordinates,\n end - stride,\n offset,\n stride,\n x,\n y,\n tmpPoint\n );\n squaredDistance = squaredDx(x, y, tmpPoint[0], tmpPoint[1]);\n if (squaredDistance < minSquaredDistance) {\n minSquaredDistance = squaredDistance;\n for (i = 0; i < stride; ++i) {\n closestPoint[i] = tmpPoint[i];\n }\n closestPoint.length = stride;\n }\n }\n return minSquaredDistance;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} maxDelta Max delta.\n * @param {boolean} isRing Is ring.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @param {Array} [tmpPoint] Temporary point object.\n * @return {number} Minimum squared distance.\n */\nexport function assignClosestArrayPoint(\n flatCoordinates,\n offset,\n ends,\n stride,\n maxDelta,\n isRing,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n tmpPoint\n) {\n tmpPoint = tmpPoint ? tmpPoint : [NaN, NaN];\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n minSquaredDistance = assignClosestPoint(\n flatCoordinates,\n offset,\n end,\n stride,\n maxDelta,\n isRing,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n tmpPoint\n );\n offset = end;\n }\n return minSquaredDistance;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} maxDelta Max delta.\n * @param {boolean} isRing Is ring.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @param {Array} [tmpPoint] Temporary point object.\n * @return {number} Minimum squared distance.\n */\nexport function assignClosestMultiArrayPoint(\n flatCoordinates,\n offset,\n endss,\n stride,\n maxDelta,\n isRing,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n tmpPoint\n) {\n tmpPoint = tmpPoint ? tmpPoint : [NaN, NaN];\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n minSquaredDistance = assignClosestArrayPoint(\n flatCoordinates,\n offset,\n ends,\n stride,\n maxDelta,\n isRing,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n tmpPoint\n );\n offset = ends[ends.length - 1];\n }\n return minSquaredDistance;\n}\n", "/**\n * @module ol/geom/flat/deflate\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {import(\"../../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} stride Stride.\n * @return {number} offset Offset.\n */\nexport function deflateCoordinate(flatCoordinates, offset, coordinate, stride) {\n for (let i = 0, ii = coordinate.length; i < ii; ++i) {\n flatCoordinates[offset++] = coordinate[i];\n }\n return offset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} coordinates Coordinates.\n * @param {number} stride Stride.\n * @return {number} offset Offset.\n */\nexport function deflateCoordinates(\n flatCoordinates,\n offset,\n coordinates,\n stride\n) {\n for (let i = 0, ii = coordinates.length; i < ii; ++i) {\n const coordinate = coordinates[i];\n for (let j = 0; j < stride; ++j) {\n flatCoordinates[offset++] = coordinate[j];\n }\n }\n return offset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} coordinatess Coordinatess.\n * @param {number} stride Stride.\n * @param {Array} [ends] Ends.\n * @return {Array} Ends.\n */\nexport function deflateCoordinatesArray(\n flatCoordinates,\n offset,\n coordinatess,\n stride,\n ends\n) {\n ends = ends ? ends : [];\n let i = 0;\n for (let j = 0, jj = coordinatess.length; j < jj; ++j) {\n const end = deflateCoordinates(\n flatCoordinates,\n offset,\n coordinatess[j],\n stride\n );\n ends[i++] = end;\n offset = end;\n }\n ends.length = i;\n return ends;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>>} coordinatesss Coordinatesss.\n * @param {number} stride Stride.\n * @param {Array>} [endss] Endss.\n * @return {Array>} Endss.\n */\nexport function deflateMultiCoordinatesArray(\n flatCoordinates,\n offset,\n coordinatesss,\n stride,\n endss\n) {\n endss = endss ? endss : [];\n let i = 0;\n for (let j = 0, jj = coordinatesss.length; j < jj; ++j) {\n const ends = deflateCoordinatesArray(\n flatCoordinates,\n offset,\n coordinatesss[j],\n stride,\n endss[i]\n );\n if (ends.length === 0) {\n ends[0] = offset;\n }\n endss[i++] = ends;\n offset = ends[ends.length - 1];\n }\n endss.length = i;\n return endss;\n}\n", "/**\n * @module ol/geom/flat/simplify\n */\n// Based on simplify-js https://github.com/mourner/simplify-js\n// Copyright (c) 2012, Vladimir Agafonkin\n// All rights reserved.\n//\n// Redistribution and use in source and binary forms, with or without\n// modification, are permitted provided that the following conditions are met:\n//\n// 1. Redistributions of source code must retain the above copyright notice,\n// this list of conditions and the following disclaimer.\n//\n// 2. Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\n//\n// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\nimport {squaredDistance, squaredSegmentDistance} from '../../math.js';\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {boolean} highQuality Highest quality.\n * @param {Array} [simplifiedFlatCoordinates] Simplified flat\n * coordinates.\n * @return {Array} Simplified line string.\n */\nexport function simplifyLineString(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n highQuality,\n simplifiedFlatCoordinates\n) {\n simplifiedFlatCoordinates =\n simplifiedFlatCoordinates !== undefined ? simplifiedFlatCoordinates : [];\n if (!highQuality) {\n end = radialDistance(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n 0\n );\n flatCoordinates = simplifiedFlatCoordinates;\n offset = 0;\n stride = 2;\n }\n simplifiedFlatCoordinates.length = douglasPeucker(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n 0\n );\n return simplifiedFlatCoordinates;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @return {number} Simplified offset.\n */\nexport function douglasPeucker(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset\n) {\n const n = (end - offset) / stride;\n if (n < 3) {\n for (; offset < end; offset += stride) {\n simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset];\n simplifiedFlatCoordinates[simplifiedOffset++] =\n flatCoordinates[offset + 1];\n }\n return simplifiedOffset;\n }\n /** @type {Array} */\n const markers = new Array(n);\n markers[0] = 1;\n markers[n - 1] = 1;\n /** @type {Array} */\n const stack = [offset, end - stride];\n let index = 0;\n while (stack.length > 0) {\n const last = stack.pop();\n const first = stack.pop();\n let maxSquaredDistance = 0;\n const x1 = flatCoordinates[first];\n const y1 = flatCoordinates[first + 1];\n const x2 = flatCoordinates[last];\n const y2 = flatCoordinates[last + 1];\n for (let i = first + stride; i < last; i += stride) {\n const x = flatCoordinates[i];\n const y = flatCoordinates[i + 1];\n const squaredDistance = squaredSegmentDistance(x, y, x1, y1, x2, y2);\n if (squaredDistance > maxSquaredDistance) {\n index = i;\n maxSquaredDistance = squaredDistance;\n }\n }\n if (maxSquaredDistance > squaredTolerance) {\n markers[(index - offset) / stride] = 1;\n if (first + stride < index) {\n stack.push(first, index);\n }\n if (index + stride < last) {\n stack.push(index, last);\n }\n }\n }\n for (let i = 0; i < n; ++i) {\n if (markers[i]) {\n simplifiedFlatCoordinates[simplifiedOffset++] =\n flatCoordinates[offset + i * stride];\n simplifiedFlatCoordinates[simplifiedOffset++] =\n flatCoordinates[offset + i * stride + 1];\n }\n }\n return simplifiedOffset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array} simplifiedEnds Simplified ends.\n * @return {number} Simplified offset.\n */\nexport function douglasPeuckerArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEnds\n) {\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n simplifiedOffset = douglasPeucker(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset\n );\n simplifiedEnds.push(simplifiedOffset);\n offset = end;\n }\n return simplifiedOffset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array>} simplifiedEndss Simplified endss.\n * @return {number} Simplified offset.\n */\nexport function douglasPeuckerMultiArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEndss\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n const simplifiedEnds = [];\n simplifiedOffset = douglasPeuckerArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEnds\n );\n simplifiedEndss.push(simplifiedEnds);\n offset = ends[ends.length - 1];\n }\n return simplifiedOffset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @return {number} Simplified offset.\n */\nexport function radialDistance(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset\n) {\n if (end <= offset + stride) {\n // zero or one point, no simplification possible, so copy and return\n for (; offset < end; offset += stride) {\n simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset];\n simplifiedFlatCoordinates[simplifiedOffset++] =\n flatCoordinates[offset + 1];\n }\n return simplifiedOffset;\n }\n let x1 = flatCoordinates[offset];\n let y1 = flatCoordinates[offset + 1];\n // copy first point\n simplifiedFlatCoordinates[simplifiedOffset++] = x1;\n simplifiedFlatCoordinates[simplifiedOffset++] = y1;\n let x2 = x1;\n let y2 = y1;\n for (offset += stride; offset < end; offset += stride) {\n x2 = flatCoordinates[offset];\n y2 = flatCoordinates[offset + 1];\n if (squaredDistance(x1, y1, x2, y2) > squaredTolerance) {\n // copy point at offset\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n x1 = x2;\n y1 = y2;\n }\n }\n if (x2 != x1 || y2 != y1) {\n // copy last point\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n }\n return simplifiedOffset;\n}\n\n/**\n * @param {number} value Value.\n * @param {number} tolerance Tolerance.\n * @return {number} Rounded value.\n */\nexport function snap(value, tolerance) {\n return tolerance * Math.round(value / tolerance);\n}\n\n/**\n * Simplifies a line string using an algorithm designed by Tim Schaub.\n * Coordinates are snapped to the nearest value in a virtual grid and\n * consecutive duplicate coordinates are discarded. This effectively preserves\n * topology as the simplification of any subsection of a line string is\n * independent of the rest of the line string. This means that, for examples,\n * the common edge between two polygons will be simplified to the same line\n * string independently in both polygons. This implementation uses a single\n * pass over the coordinates and eliminates intermediate collinear points.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} tolerance Tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @return {number} Simplified offset.\n */\nexport function quantize(\n flatCoordinates,\n offset,\n end,\n stride,\n tolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset\n) {\n // do nothing if the line is empty\n if (offset == end) {\n return simplifiedOffset;\n }\n // snap the first coordinate (P1)\n let x1 = snap(flatCoordinates[offset], tolerance);\n let y1 = snap(flatCoordinates[offset + 1], tolerance);\n offset += stride;\n // add the first coordinate to the output\n simplifiedFlatCoordinates[simplifiedOffset++] = x1;\n simplifiedFlatCoordinates[simplifiedOffset++] = y1;\n // find the next coordinate that does not snap to the same value as the first\n // coordinate (P2)\n let x2, y2;\n do {\n x2 = snap(flatCoordinates[offset], tolerance);\n y2 = snap(flatCoordinates[offset + 1], tolerance);\n offset += stride;\n if (offset == end) {\n // all coordinates snap to the same value, the line collapses to a point\n // push the last snapped value anyway to ensure that the output contains\n // at least two points\n // FIXME should we really return at least two points anyway?\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n return simplifiedOffset;\n }\n } while (x2 == x1 && y2 == y1);\n while (offset < end) {\n // snap the next coordinate (P3)\n const x3 = snap(flatCoordinates[offset], tolerance);\n const y3 = snap(flatCoordinates[offset + 1], tolerance);\n offset += stride;\n // skip P3 if it is equal to P2\n if (x3 == x2 && y3 == y2) {\n continue;\n }\n // calculate the delta between P1 and P2\n const dx1 = x2 - x1;\n const dy1 = y2 - y1;\n // calculate the delta between P3 and P1\n const dx2 = x3 - x1;\n const dy2 = y3 - y1;\n // if P1, P2, and P3 are colinear and P3 is further from P1 than P2 is from\n // P1 in the same direction then P2 is on the straight line between P1 and\n // P3\n if (\n dx1 * dy2 == dy1 * dx2 &&\n ((dx1 < 0 && dx2 < dx1) || dx1 == dx2 || (dx1 > 0 && dx2 > dx1)) &&\n ((dy1 < 0 && dy2 < dy1) || dy1 == dy2 || (dy1 > 0 && dy2 > dy1))\n ) {\n // discard P2 and set P2 = P3\n x2 = x3;\n y2 = y3;\n continue;\n }\n // either P1, P2, and P3 are not colinear, or they are colinear but P3 is\n // between P3 and P1 or on the opposite half of the line to P2. add P2,\n // and continue with P1 = P2 and P2 = P3\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n x1 = x2;\n y1 = y2;\n x2 = x3;\n y2 = y3;\n }\n // add the last point (P2)\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n return simplifiedOffset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} tolerance Tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array} simplifiedEnds Simplified ends.\n * @return {number} Simplified offset.\n */\nexport function quantizeArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n tolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEnds\n) {\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n simplifiedOffset = quantize(\n flatCoordinates,\n offset,\n end,\n stride,\n tolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset\n );\n simplifiedEnds.push(simplifiedOffset);\n offset = end;\n }\n return simplifiedOffset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} tolerance Tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array>} simplifiedEndss Simplified endss.\n * @return {number} Simplified offset.\n */\nexport function quantizeMultiArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n tolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEndss\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n const simplifiedEnds = [];\n simplifiedOffset = quantizeArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n tolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEnds\n );\n simplifiedEndss.push(simplifiedEnds);\n offset = ends[ends.length - 1];\n }\n return simplifiedOffset;\n}\n", "/**\n * @module ol/geom/flat/inflate\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {Array} [coordinates] Coordinates.\n * @return {Array} Coordinates.\n */\nexport function inflateCoordinates(\n flatCoordinates,\n offset,\n end,\n stride,\n coordinates\n) {\n coordinates = coordinates !== undefined ? coordinates : [];\n let i = 0;\n for (let j = offset; j < end; j += stride) {\n coordinates[i++] = flatCoordinates.slice(j, j + stride);\n }\n coordinates.length = i;\n return coordinates;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {Array>} [coordinatess] Coordinatess.\n * @return {Array>} Coordinatess.\n */\nexport function inflateCoordinatesArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n coordinatess\n) {\n coordinatess = coordinatess !== undefined ? coordinatess : [];\n let i = 0;\n for (let j = 0, jj = ends.length; j < jj; ++j) {\n const end = ends[j];\n coordinatess[i++] = inflateCoordinates(\n flatCoordinates,\n offset,\n end,\n stride,\n coordinatess[i]\n );\n offset = end;\n }\n coordinatess.length = i;\n return coordinatess;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {Array>>} [coordinatesss]\n * Coordinatesss.\n * @return {Array>>} Coordinatesss.\n */\nexport function inflateMultiCoordinatesArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n coordinatesss\n) {\n coordinatesss = coordinatesss !== undefined ? coordinatesss : [];\n let i = 0;\n for (let j = 0, jj = endss.length; j < jj; ++j) {\n const ends = endss[j];\n coordinatesss[i++] =\n ends.length === 1 && ends[0] === offset\n ? []\n : inflateCoordinatesArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n coordinatesss[i]\n );\n offset = ends[ends.length - 1];\n }\n coordinatesss.length = i;\n return coordinatesss;\n}\n", "/**\n * @module ol/geom/flat/area\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {number} Area.\n */\nexport function linearRing(flatCoordinates, offset, end, stride) {\n let twiceArea = 0;\n let x1 = flatCoordinates[end - stride];\n let y1 = flatCoordinates[end - stride + 1];\n for (; offset < end; offset += stride) {\n const x2 = flatCoordinates[offset];\n const y2 = flatCoordinates[offset + 1];\n twiceArea += y1 * x2 - x1 * y2;\n x1 = x2;\n y1 = y2;\n }\n return twiceArea / 2;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @return {number} Area.\n */\nexport function linearRings(flatCoordinates, offset, ends, stride) {\n let area = 0;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n area += linearRing(flatCoordinates, offset, end, stride);\n offset = end;\n }\n return area;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @return {number} Area.\n */\nexport function linearRingss(flatCoordinates, offset, endss, stride) {\n let area = 0;\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n area += linearRings(flatCoordinates, offset, ends, stride);\n offset = ends[ends.length - 1];\n }\n return area;\n}\n", "/**\n * @module ol/geom/LinearRing\n */\nimport SimpleGeometry from './SimpleGeometry.js';\nimport {assignClosestPoint, maxSquaredDelta} from './flat/closest.js';\nimport {closestSquaredDistanceXY} from '../extent.js';\nimport {deflateCoordinates} from './flat/deflate.js';\nimport {douglasPeucker} from './flat/simplify.js';\nimport {inflateCoordinates} from './flat/inflate.js';\nimport {linearRing as linearRingArea} from './flat/area.js';\n\n/**\n * @classdesc\n * Linear ring geometry. Only used as part of polygon; cannot be rendered\n * on its own.\n *\n * @api\n */\nclass LinearRing extends SimpleGeometry {\n /**\n * @param {Array|Array} coordinates Coordinates.\n * For internal use, flat coordinates in combination with `layout` are also accepted.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n constructor(coordinates, layout) {\n super();\n\n /**\n * @private\n * @type {number}\n */\n this.maxDelta_ = -1;\n\n /**\n * @private\n * @type {number}\n */\n this.maxDeltaRevision_ = -1;\n\n if (layout !== undefined && !Array.isArray(coordinates[0])) {\n this.setFlatCoordinates(\n layout,\n /** @type {Array} */ (coordinates)\n );\n } else {\n this.setCoordinates(\n /** @type {Array} */ (\n coordinates\n ),\n layout\n );\n }\n }\n\n /**\n * Make a complete copy of the geometry.\n * @return {!LinearRing} Clone.\n * @api\n */\n clone() {\n return new LinearRing(this.flatCoordinates.slice(), this.layout);\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(x, y, closestPoint, minSquaredDistance) {\n if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {\n return minSquaredDistance;\n }\n if (this.maxDeltaRevision_ != this.getRevision()) {\n this.maxDelta_ = Math.sqrt(\n maxSquaredDelta(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n 0\n )\n );\n this.maxDeltaRevision_ = this.getRevision();\n }\n return assignClosestPoint(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n this.maxDelta_,\n true,\n x,\n y,\n closestPoint,\n minSquaredDistance\n );\n }\n\n /**\n * Return the area of the linear ring on projected plane.\n * @return {number} Area (on projected plane).\n * @api\n */\n getArea() {\n return linearRingArea(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride\n );\n }\n\n /**\n * Return the coordinates of the linear ring.\n * @return {Array} Coordinates.\n * @api\n */\n getCoordinates() {\n return inflateCoordinates(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride\n );\n }\n\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {LinearRing} Simplified LinearRing.\n * @protected\n */\n getSimplifiedGeometryInternal(squaredTolerance) {\n const simplifiedFlatCoordinates = [];\n simplifiedFlatCoordinates.length = douglasPeucker(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n 0\n );\n return new LinearRing(simplifiedFlatCoordinates, 'XY');\n }\n\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n */\n getType() {\n return 'LinearRing';\n }\n\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n intersectsExtent(extent) {\n return false;\n }\n\n /**\n * Set the coordinates of the linear ring.\n * @param {!Array} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n */\n setCoordinates(coordinates, layout) {\n this.setLayout(layout, coordinates, 1);\n if (!this.flatCoordinates) {\n this.flatCoordinates = [];\n }\n this.flatCoordinates.length = deflateCoordinates(\n this.flatCoordinates,\n 0,\n coordinates,\n this.stride\n );\n this.changed();\n }\n}\n\nexport default LinearRing;\n", "/**\n * @module ol/geom/Point\n */\nimport SimpleGeometry from './SimpleGeometry.js';\nimport {containsXY, createOrUpdateFromCoordinate} from '../extent.js';\nimport {deflateCoordinate} from './flat/deflate.js';\nimport {squaredDistance as squaredDx} from '../math.js';\n\n/**\n * @classdesc\n * Point geometry.\n *\n * @api\n */\nclass Point extends SimpleGeometry {\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n constructor(coordinates, layout) {\n super();\n this.setCoordinates(coordinates, layout);\n }\n\n /**\n * Make a complete copy of the geometry.\n * @return {!Point} Clone.\n * @api\n */\n clone() {\n const point = new Point(this.flatCoordinates.slice(), this.layout);\n point.applyProperties(this);\n return point;\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(x, y, closestPoint, minSquaredDistance) {\n const flatCoordinates = this.flatCoordinates;\n const squaredDistance = squaredDx(\n x,\n y,\n flatCoordinates[0],\n flatCoordinates[1]\n );\n if (squaredDistance < minSquaredDistance) {\n const stride = this.stride;\n for (let i = 0; i < stride; ++i) {\n closestPoint[i] = flatCoordinates[i];\n }\n closestPoint.length = stride;\n return squaredDistance;\n }\n return minSquaredDistance;\n }\n\n /**\n * Return the coordinate of the point.\n * @return {import(\"../coordinate.js\").Coordinate} Coordinates.\n * @api\n */\n getCoordinates() {\n return !this.flatCoordinates ? [] : this.flatCoordinates.slice();\n }\n\n /**\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(extent) {\n return createOrUpdateFromCoordinate(this.flatCoordinates, extent);\n }\n\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n */\n getType() {\n return 'Point';\n }\n\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n intersectsExtent(extent) {\n return containsXY(extent, this.flatCoordinates[0], this.flatCoordinates[1]);\n }\n\n /**\n * @param {!Array<*>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n */\n setCoordinates(coordinates, layout) {\n this.setLayout(layout, coordinates, 0);\n if (!this.flatCoordinates) {\n this.flatCoordinates = [];\n }\n this.flatCoordinates.length = deflateCoordinate(\n this.flatCoordinates,\n 0,\n coordinates,\n this.stride\n );\n this.changed();\n }\n}\n\nexport default Point;\n", "/**\n * @module ol/geom/flat/contains\n */\nimport {forEachCorner} from '../../extent.js';\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} Contains extent.\n */\nexport function linearRingContainsExtent(\n flatCoordinates,\n offset,\n end,\n stride,\n extent\n) {\n const outside = forEachCorner(\n extent,\n /**\n * @param {import(\"../../coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {boolean} Contains (x, y).\n */\n function (coordinate) {\n return !linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n coordinate[0],\n coordinate[1]\n );\n }\n );\n return !outside;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\nexport function linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n x,\n y\n) {\n // https://geomalgorithms.com/a03-_inclusion.html\n // Copyright 2000 softSurfer, 2012 Dan Sunday\n // This code may be freely used and modified for any purpose\n // providing that this copyright notice is included with it.\n // SoftSurfer makes no warranty for this code, and cannot be held\n // liable for any real or imagined damage resulting from its use.\n // Users of this code must verify correctness for their application.\n let wn = 0;\n let x1 = flatCoordinates[end - stride];\n let y1 = flatCoordinates[end - stride + 1];\n for (; offset < end; offset += stride) {\n const x2 = flatCoordinates[offset];\n const y2 = flatCoordinates[offset + 1];\n if (y1 <= y) {\n if (y2 > y && (x2 - x1) * (y - y1) - (x - x1) * (y2 - y1) > 0) {\n wn++;\n }\n } else if (y2 <= y && (x2 - x1) * (y - y1) - (x - x1) * (y2 - y1) < 0) {\n wn--;\n }\n x1 = x2;\n y1 = y2;\n }\n return wn !== 0;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\nexport function linearRingsContainsXY(\n flatCoordinates,\n offset,\n ends,\n stride,\n x,\n y\n) {\n if (ends.length === 0) {\n return false;\n }\n if (!linearRingContainsXY(flatCoordinates, offset, ends[0], stride, x, y)) {\n return false;\n }\n for (let i = 1, ii = ends.length; i < ii; ++i) {\n if (\n linearRingContainsXY(flatCoordinates, ends[i - 1], ends[i], stride, x, y)\n ) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\nexport function linearRingssContainsXY(\n flatCoordinates,\n offset,\n endss,\n stride,\n x,\n y\n) {\n if (endss.length === 0) {\n return false;\n }\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n if (linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y)) {\n return true;\n }\n offset = ends[ends.length - 1];\n }\n return false;\n}\n", "/**\n * @module ol/geom/flat/interiorpoint\n */\nimport {ascending} from '../../array.js';\nimport {linearRingsContainsXY} from './contains.js';\n\n/**\n * Calculates a point that is likely to lie in the interior of the linear rings.\n * Inspired by JTS's com.vividsolutions.jts.geom.Geometry#getInteriorPoint.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {Array} flatCenters Flat centers.\n * @param {number} flatCentersOffset Flat center offset.\n * @param {Array} [dest] Destination.\n * @return {Array} Destination point as XYM coordinate, where M is the\n * length of the horizontal intersection that the point belongs to.\n */\nexport function getInteriorPointOfArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n flatCenters,\n flatCentersOffset,\n dest\n) {\n let i, ii, x, x1, x2, y1, y2;\n const y = flatCenters[flatCentersOffset + 1];\n /** @type {Array} */\n const intersections = [];\n // Calculate intersections with the horizontal line\n for (let r = 0, rr = ends.length; r < rr; ++r) {\n const end = ends[r];\n x1 = flatCoordinates[end - stride];\n y1 = flatCoordinates[end - stride + 1];\n for (i = offset; i < end; i += stride) {\n x2 = flatCoordinates[i];\n y2 = flatCoordinates[i + 1];\n if ((y <= y1 && y2 <= y) || (y1 <= y && y <= y2)) {\n x = ((y - y1) / (y2 - y1)) * (x2 - x1) + x1;\n intersections.push(x);\n }\n x1 = x2;\n y1 = y2;\n }\n }\n // Find the longest segment of the horizontal line that has its center point\n // inside the linear ring.\n let pointX = NaN;\n let maxSegmentLength = -Infinity;\n intersections.sort(ascending);\n x1 = intersections[0];\n for (i = 1, ii = intersections.length; i < ii; ++i) {\n x2 = intersections[i];\n const segmentLength = Math.abs(x2 - x1);\n if (segmentLength > maxSegmentLength) {\n x = (x1 + x2) / 2;\n if (linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y)) {\n pointX = x;\n maxSegmentLength = segmentLength;\n }\n }\n x1 = x2;\n }\n if (isNaN(pointX)) {\n // There is no horizontal line that has its center point inside the linear\n // ring. Use the center of the the linear ring's extent.\n pointX = flatCenters[flatCentersOffset];\n }\n if (dest) {\n dest.push(pointX, y, maxSegmentLength);\n return dest;\n }\n return [pointX, y, maxSegmentLength];\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {Array} flatCenters Flat centers.\n * @return {Array} Interior points as XYM coordinates, where M is the\n * length of the horizontal intersection that the point belongs to.\n */\nexport function getInteriorPointsOfMultiArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n flatCenters\n) {\n let interiorPoints = [];\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n interiorPoints = getInteriorPointOfArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n flatCenters,\n 2 * i,\n interiorPoints\n );\n offset = ends[ends.length - 1];\n }\n return interiorPoints;\n}\n", "/**\n * @module ol/geom/flat/segments\n */\n\n/**\n * This function calls `callback` for each segment of the flat coordinates\n * array. If the callback returns a truthy value the function returns that\n * value immediately. Otherwise the function returns `false`.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {function(import(\"../../coordinate.js\").Coordinate, import(\"../../coordinate.js\").Coordinate): T} callback Function\n * called for each segment.\n * @return {T|boolean} Value.\n * @template T\n */\nexport function forEach(flatCoordinates, offset, end, stride, callback) {\n let ret;\n offset += stride;\n for (; offset < end; offset += stride) {\n ret = callback(\n flatCoordinates.slice(offset - stride, offset),\n flatCoordinates.slice(offset, offset + stride)\n );\n if (ret) {\n return ret;\n }\n }\n return false;\n}\n", "/**\n * @module ol/geom/flat/intersectsextent\n */\nimport {\n containsExtent,\n createEmpty,\n extendFlatCoordinates,\n intersects,\n intersectsSegment,\n} from '../../extent.js';\nimport {forEach as forEachSegment} from './segments.js';\nimport {linearRingContainsExtent, linearRingContainsXY} from './contains.js';\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\nexport function intersectsLineString(\n flatCoordinates,\n offset,\n end,\n stride,\n extent\n) {\n const coordinatesExtent = extendFlatCoordinates(\n createEmpty(),\n flatCoordinates,\n offset,\n end,\n stride\n );\n if (!intersects(extent, coordinatesExtent)) {\n return false;\n }\n if (containsExtent(extent, coordinatesExtent)) {\n return true;\n }\n if (coordinatesExtent[0] >= extent[0] && coordinatesExtent[2] <= extent[2]) {\n return true;\n }\n if (coordinatesExtent[1] >= extent[1] && coordinatesExtent[3] <= extent[3]) {\n return true;\n }\n return forEachSegment(\n flatCoordinates,\n offset,\n end,\n stride,\n /**\n * @param {import(\"../../coordinate.js\").Coordinate} point1 Start point.\n * @param {import(\"../../coordinate.js\").Coordinate} point2 End point.\n * @return {boolean} `true` if the segment and the extent intersect,\n * `false` otherwise.\n */\n function (point1, point2) {\n return intersectsSegment(extent, point1, point2);\n }\n );\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\nexport function intersectsLineStringArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n extent\n) {\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n if (\n intersectsLineString(flatCoordinates, offset, ends[i], stride, extent)\n ) {\n return true;\n }\n offset = ends[i];\n }\n return false;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\nexport function intersectsLinearRing(\n flatCoordinates,\n offset,\n end,\n stride,\n extent\n) {\n if (intersectsLineString(flatCoordinates, offset, end, stride, extent)) {\n return true;\n }\n if (\n linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n extent[0],\n extent[1]\n )\n ) {\n return true;\n }\n if (\n linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n extent[0],\n extent[3]\n )\n ) {\n return true;\n }\n if (\n linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n extent[2],\n extent[1]\n )\n ) {\n return true;\n }\n if (\n linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n extent[2],\n extent[3]\n )\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\nexport function intersectsLinearRingArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n extent\n) {\n if (!intersectsLinearRing(flatCoordinates, offset, ends[0], stride, extent)) {\n return false;\n }\n if (ends.length === 1) {\n return true;\n }\n for (let i = 1, ii = ends.length; i < ii; ++i) {\n if (\n linearRingContainsExtent(\n flatCoordinates,\n ends[i - 1],\n ends[i],\n stride,\n extent\n )\n ) {\n if (\n !intersectsLineString(\n flatCoordinates,\n ends[i - 1],\n ends[i],\n stride,\n extent\n )\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\nexport function intersectsLinearRingMultiArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n extent\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n if (\n intersectsLinearRingArray(flatCoordinates, offset, ends, stride, extent)\n ) {\n return true;\n }\n offset = ends[ends.length - 1];\n }\n return false;\n}\n", "/**\n * @module ol/geom/flat/reverse\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n */\nexport function coordinates(flatCoordinates, offset, end, stride) {\n while (offset < end - stride) {\n for (let i = 0; i < stride; ++i) {\n const tmp = flatCoordinates[offset + i];\n flatCoordinates[offset + i] = flatCoordinates[end - stride + i];\n flatCoordinates[end - stride + i] = tmp;\n }\n offset += stride;\n end -= stride;\n }\n}\n", "/**\n * @module ol/geom/flat/orient\n */\nimport {coordinates as reverseCoordinates} from './reverse.js';\n\n/**\n * Is the linear ring oriented clockwise in a coordinate system with a bottom-left\n * coordinate origin? For a coordinate system with a top-left coordinate origin,\n * the ring's orientation is clockwise when this function returns false.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {boolean} Is clockwise.\n */\nexport function linearRingIsClockwise(flatCoordinates, offset, end, stride) {\n // https://stackoverflow.com/q/1165647/clockwise-method#1165943\n // https://github.com/OSGeo/gdal/blob/master/gdal/ogr/ogrlinearring.cpp\n let edge = 0;\n let x1 = flatCoordinates[end - stride];\n let y1 = flatCoordinates[end - stride + 1];\n for (; offset < end; offset += stride) {\n const x2 = flatCoordinates[offset];\n const y2 = flatCoordinates[offset + 1];\n edge += (x2 - x1) * (y2 + y1);\n x1 = x2;\n y1 = y2;\n }\n return edge === 0 ? undefined : edge > 0;\n}\n\n/**\n * Determines if linear rings are oriented. By default, left-hand orientation\n * is tested (first ring must be clockwise, remaining rings counter-clockwise).\n * To test for right-hand orientation, use the `right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Array of end indexes.\n * @param {number} stride Stride.\n * @param {boolean} [right] Test for right-hand orientation\n * (counter-clockwise exterior ring and clockwise interior rings).\n * @return {boolean} Rings are correctly oriented.\n */\nexport function linearRingsAreOriented(\n flatCoordinates,\n offset,\n ends,\n stride,\n right\n) {\n right = right !== undefined ? right : false;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n const isClockwise = linearRingIsClockwise(\n flatCoordinates,\n offset,\n end,\n stride\n );\n if (i === 0) {\n if ((right && isClockwise) || (!right && !isClockwise)) {\n return false;\n }\n } else {\n if ((right && !isClockwise) || (!right && isClockwise)) {\n return false;\n }\n }\n offset = end;\n }\n return true;\n}\n\n/**\n * Determines if linear rings are oriented. By default, left-hand orientation\n * is tested (first ring must be clockwise, remaining rings counter-clockwise).\n * To test for right-hand orientation, use the `right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Array of array of end indexes.\n * @param {number} stride Stride.\n * @param {boolean} [right] Test for right-hand orientation\n * (counter-clockwise exterior ring and clockwise interior rings).\n * @return {boolean} Rings are correctly oriented.\n */\nexport function linearRingssAreOriented(\n flatCoordinates,\n offset,\n endss,\n stride,\n right\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n if (!linearRingsAreOriented(flatCoordinates, offset, ends, stride, right)) {\n return false;\n }\n if (ends.length) {\n offset = ends[ends.length - 1];\n }\n }\n return true;\n}\n\n/**\n * Orient coordinates in a flat array of linear rings. By default, rings\n * are oriented following the left-hand rule (clockwise for exterior and\n * counter-clockwise for interior rings). To orient according to the\n * right-hand rule, use the `right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {boolean} [right] Follow the right-hand rule for orientation.\n * @return {number} End.\n */\nexport function orientLinearRings(\n flatCoordinates,\n offset,\n ends,\n stride,\n right\n) {\n right = right !== undefined ? right : false;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n const isClockwise = linearRingIsClockwise(\n flatCoordinates,\n offset,\n end,\n stride\n );\n const reverse =\n i === 0\n ? (right && isClockwise) || (!right && !isClockwise)\n : (right && !isClockwise) || (!right && isClockwise);\n if (reverse) {\n reverseCoordinates(flatCoordinates, offset, end, stride);\n }\n offset = end;\n }\n return offset;\n}\n\n/**\n * Orient coordinates in a flat array of linear rings. By default, rings\n * are oriented following the left-hand rule (clockwise for exterior and\n * counter-clockwise for interior rings). To orient according to the\n * right-hand rule, use the `right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Array of array of end indexes.\n * @param {number} stride Stride.\n * @param {boolean} [right] Follow the right-hand rule for orientation.\n * @return {number} End.\n */\nexport function orientLinearRingsArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n right\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n offset = orientLinearRings(\n flatCoordinates,\n offset,\n endss[i],\n stride,\n right\n );\n }\n return offset;\n}\n\n/**\n * Return a two-dimensional endss\n * @param {Array} flatCoordinates Flat coordinates\n * @param {Array} ends Linear ring end indexes\n * @return {Array>} Two dimensional endss array that can\n * be used to construct a MultiPolygon\n */\nexport function inflateEnds(flatCoordinates, ends) {\n const endss = [];\n let offset = 0;\n let prevEndIndex = 0;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n // classifies an array of rings into polygons with outer rings and holes\n if (!linearRingIsClockwise(flatCoordinates, offset, end, 2)) {\n endss.push(ends.slice(prevEndIndex, i + 1));\n } else {\n if (endss.length === 0) {\n continue;\n }\n endss[endss.length - 1].push(ends[prevEndIndex]);\n }\n prevEndIndex = i + 1;\n offset = end;\n }\n return endss;\n}\n", "/**\n * @module ol/geom/Polygon\n */\nimport LinearRing from './LinearRing.js';\nimport Point from './Point.js';\nimport SimpleGeometry from './SimpleGeometry.js';\nimport {arrayMaxSquaredDelta, assignClosestArrayPoint} from './flat/closest.js';\nimport {closestSquaredDistanceXY, getCenter, isEmpty} from '../extent.js';\nimport {deflateCoordinatesArray} from './flat/deflate.js';\nimport {extend} from '../array.js';\nimport {getInteriorPointOfArray} from './flat/interiorpoint.js';\nimport {inflateCoordinatesArray} from './flat/inflate.js';\nimport {intersectsLinearRingArray} from './flat/intersectsextent.js';\nimport {linearRingsAreOriented, orientLinearRings} from './flat/orient.js';\nimport {linearRings as linearRingsArea} from './flat/area.js';\nimport {linearRingsContainsXY} from './flat/contains.js';\nimport {modulo} from '../math.js';\nimport {quantizeArray} from './flat/simplify.js';\nimport {offset as sphereOffset} from '../sphere.js';\n\n/**\n * @classdesc\n * Polygon geometry.\n *\n * @api\n */\nclass Polygon extends SimpleGeometry {\n /**\n * @param {!Array>|!Array} coordinates\n * Array of linear rings that define the polygon. The first linear ring of the\n * array defines the outer-boundary or surface of the polygon. Each subsequent\n * linear ring defines a hole in the surface of the polygon. A linear ring is\n * an array of vertices' coordinates where the first coordinate and the last are\n * equivalent. (For internal use, flat coordinates in combination with\n * `layout` and `ends` are also accepted.)\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @param {Array} [ends] Ends (for internal use with flat coordinates).\n */\n constructor(coordinates, layout, ends) {\n super();\n\n /**\n * @type {Array}\n * @private\n */\n this.ends_ = [];\n\n /**\n * @private\n * @type {number}\n */\n this.flatInteriorPointRevision_ = -1;\n\n /**\n * @private\n * @type {import(\"../coordinate.js\").Coordinate}\n */\n this.flatInteriorPoint_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.maxDelta_ = -1;\n\n /**\n * @private\n * @type {number}\n */\n this.maxDeltaRevision_ = -1;\n\n /**\n * @private\n * @type {number}\n */\n this.orientedRevision_ = -1;\n\n /**\n * @private\n * @type {Array}\n */\n this.orientedFlatCoordinates_ = null;\n\n if (layout !== undefined && ends) {\n this.setFlatCoordinates(\n layout,\n /** @type {Array} */ (coordinates)\n );\n this.ends_ = ends;\n } else {\n this.setCoordinates(\n /** @type {Array>} */ (\n coordinates\n ),\n layout\n );\n }\n }\n\n /**\n * Append the passed linear ring to this polygon.\n * @param {LinearRing} linearRing Linear ring.\n * @api\n */\n appendLinearRing(linearRing) {\n if (!this.flatCoordinates) {\n this.flatCoordinates = linearRing.getFlatCoordinates().slice();\n } else {\n extend(this.flatCoordinates, linearRing.getFlatCoordinates());\n }\n this.ends_.push(this.flatCoordinates.length);\n this.changed();\n }\n\n /**\n * Make a complete copy of the geometry.\n * @return {!Polygon} Clone.\n * @api\n */\n clone() {\n const polygon = new Polygon(\n this.flatCoordinates.slice(),\n this.layout,\n this.ends_.slice()\n );\n polygon.applyProperties(this);\n return polygon;\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(x, y, closestPoint, minSquaredDistance) {\n if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {\n return minSquaredDistance;\n }\n if (this.maxDeltaRevision_ != this.getRevision()) {\n this.maxDelta_ = Math.sqrt(\n arrayMaxSquaredDelta(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n 0\n )\n );\n this.maxDeltaRevision_ = this.getRevision();\n }\n return assignClosestArrayPoint(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n this.maxDelta_,\n true,\n x,\n y,\n closestPoint,\n minSquaredDistance\n );\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n containsXY(x, y) {\n return linearRingsContainsXY(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n x,\n y\n );\n }\n\n /**\n * Return the area of the polygon on projected plane.\n * @return {number} Area (on projected plane).\n * @api\n */\n getArea() {\n return linearRingsArea(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride\n );\n }\n\n /**\n * Get the coordinate array for this geometry. This array has the structure\n * of a GeoJSON coordinate array for polygons.\n *\n * @param {boolean} [right] Orient coordinates according to the right-hand\n * rule (counter-clockwise for exterior and clockwise for interior rings).\n * If `false`, coordinates will be oriented according to the left-hand rule\n * (clockwise for exterior and counter-clockwise for interior rings).\n * By default, coordinate orientation will depend on how the geometry was\n * constructed.\n * @return {Array>} Coordinates.\n * @api\n */\n getCoordinates(right) {\n let flatCoordinates;\n if (right !== undefined) {\n flatCoordinates = this.getOrientedFlatCoordinates().slice();\n orientLinearRings(flatCoordinates, 0, this.ends_, this.stride, right);\n } else {\n flatCoordinates = this.flatCoordinates;\n }\n\n return inflateCoordinatesArray(flatCoordinates, 0, this.ends_, this.stride);\n }\n\n /**\n * @return {Array} Ends.\n */\n getEnds() {\n return this.ends_;\n }\n\n /**\n * @return {Array} Interior point.\n */\n getFlatInteriorPoint() {\n if (this.flatInteriorPointRevision_ != this.getRevision()) {\n const flatCenter = getCenter(this.getExtent());\n this.flatInteriorPoint_ = getInteriorPointOfArray(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n flatCenter,\n 0\n );\n this.flatInteriorPointRevision_ = this.getRevision();\n }\n return this.flatInteriorPoint_;\n }\n\n /**\n * Return an interior point of the polygon.\n * @return {Point} Interior point as XYM coordinate, where M is the\n * length of the horizontal intersection that the point belongs to.\n * @api\n */\n getInteriorPoint() {\n return new Point(this.getFlatInteriorPoint(), 'XYM');\n }\n\n /**\n * Return the number of rings of the polygon, this includes the exterior\n * ring and any interior rings.\n *\n * @return {number} Number of rings.\n * @api\n */\n getLinearRingCount() {\n return this.ends_.length;\n }\n\n /**\n * Return the Nth linear ring of the polygon geometry. Return `null` if the\n * given index is out of range.\n * The exterior linear ring is available at index `0` and the interior rings\n * at index `1` and beyond.\n *\n * @param {number} index Index.\n * @return {LinearRing|null} Linear ring.\n * @api\n */\n getLinearRing(index) {\n if (index < 0 || this.ends_.length <= index) {\n return null;\n }\n return new LinearRing(\n this.flatCoordinates.slice(\n index === 0 ? 0 : this.ends_[index - 1],\n this.ends_[index]\n ),\n this.layout\n );\n }\n\n /**\n * Return the linear rings of the polygon.\n * @return {Array} Linear rings.\n * @api\n */\n getLinearRings() {\n const layout = this.layout;\n const flatCoordinates = this.flatCoordinates;\n const ends = this.ends_;\n const linearRings = [];\n let offset = 0;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n const linearRing = new LinearRing(\n flatCoordinates.slice(offset, end),\n layout\n );\n linearRings.push(linearRing);\n offset = end;\n }\n return linearRings;\n }\n\n /**\n * @return {Array} Oriented flat coordinates.\n */\n getOrientedFlatCoordinates() {\n if (this.orientedRevision_ != this.getRevision()) {\n const flatCoordinates = this.flatCoordinates;\n if (linearRingsAreOriented(flatCoordinates, 0, this.ends_, this.stride)) {\n this.orientedFlatCoordinates_ = flatCoordinates;\n } else {\n this.orientedFlatCoordinates_ = flatCoordinates.slice();\n this.orientedFlatCoordinates_.length = orientLinearRings(\n this.orientedFlatCoordinates_,\n 0,\n this.ends_,\n this.stride\n );\n }\n this.orientedRevision_ = this.getRevision();\n }\n return this.orientedFlatCoordinates_;\n }\n\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {Polygon} Simplified Polygon.\n * @protected\n */\n getSimplifiedGeometryInternal(squaredTolerance) {\n const simplifiedFlatCoordinates = [];\n const simplifiedEnds = [];\n simplifiedFlatCoordinates.length = quantizeArray(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n Math.sqrt(squaredTolerance),\n simplifiedFlatCoordinates,\n 0,\n simplifiedEnds\n );\n return new Polygon(simplifiedFlatCoordinates, 'XY', simplifiedEnds);\n }\n\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n */\n getType() {\n return 'Polygon';\n }\n\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n */\n intersectsExtent(extent) {\n return intersectsLinearRingArray(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n extent\n );\n }\n\n /**\n * Set the coordinates of the polygon.\n * @param {!Array>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n */\n setCoordinates(coordinates, layout) {\n this.setLayout(layout, coordinates, 2);\n if (!this.flatCoordinates) {\n this.flatCoordinates = [];\n }\n const ends = deflateCoordinatesArray(\n this.flatCoordinates,\n 0,\n coordinates,\n this.stride,\n this.ends_\n );\n this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1];\n this.changed();\n }\n}\n\nexport default Polygon;\n\n/**\n * Create an approximation of a circle on the surface of a sphere.\n * @param {import(\"../coordinate.js\").Coordinate} center Center (`[lon, lat]` in degrees).\n * @param {number} radius The great-circle distance from the center to\n * the polygon vertices in meters.\n * @param {number} [n] Optional number of vertices for the resulting\n * polygon. Default is `32`.\n * @param {number} [sphereRadius] Optional radius for the sphere (defaults to\n * the Earth's mean radius using the WGS84 ellipsoid).\n * @return {Polygon} The \"circular\" polygon.\n * @api\n */\nexport function circular(center, radius, n, sphereRadius) {\n n = n ? n : 32;\n /** @type {Array} */\n const flatCoordinates = [];\n for (let i = 0; i < n; ++i) {\n extend(\n flatCoordinates,\n sphereOffset(center, radius, (2 * Math.PI * i) / n, sphereRadius)\n );\n }\n flatCoordinates.push(flatCoordinates[0], flatCoordinates[1]);\n return new Polygon(flatCoordinates, 'XY', [flatCoordinates.length]);\n}\n\n/**\n * Create a polygon from an extent. The layout used is `XY`.\n * @param {import(\"../extent.js\").Extent} extent The extent.\n * @return {Polygon} The polygon.\n * @api\n */\nexport function fromExtent(extent) {\n if (isEmpty(extent)) {\n throw new Error('Cannot create polygon from empty extent');\n }\n const minX = extent[0];\n const minY = extent[1];\n const maxX = extent[2];\n const maxY = extent[3];\n const flatCoordinates = [\n minX,\n minY,\n minX,\n maxY,\n maxX,\n maxY,\n maxX,\n minY,\n minX,\n minY,\n ];\n return new Polygon(flatCoordinates, 'XY', [flatCoordinates.length]);\n}\n\n/**\n * Create a regular polygon from a circle.\n * @param {import(\"./Circle.js\").default} circle Circle geometry.\n * @param {number} [sides] Number of sides of the polygon. Default is 32.\n * @param {number} [angle] Start angle for the first vertex of the polygon in\n * counter-clockwise radians. 0 means East. Default is 0.\n * @return {Polygon} Polygon geometry.\n * @api\n */\nexport function fromCircle(circle, sides, angle) {\n sides = sides ? sides : 32;\n const stride = circle.getStride();\n const layout = circle.getLayout();\n const center = circle.getCenter();\n const arrayLength = stride * (sides + 1);\n const flatCoordinates = new Array(arrayLength);\n for (let i = 0; i < arrayLength; i += stride) {\n flatCoordinates[i] = 0;\n flatCoordinates[i + 1] = 0;\n for (let j = 2; j < stride; j++) {\n flatCoordinates[i + j] = center[j];\n }\n }\n const ends = [flatCoordinates.length];\n const polygon = new Polygon(flatCoordinates, layout, ends);\n makeRegular(polygon, center, circle.getRadius(), angle);\n return polygon;\n}\n\n/**\n * Modify the coordinates of a polygon to make it a regular polygon.\n * @param {Polygon} polygon Polygon geometry.\n * @param {import(\"../coordinate.js\").Coordinate} center Center of the regular polygon.\n * @param {number} radius Radius of the regular polygon.\n * @param {number} [angle] Start angle for the first vertex of the polygon in\n * counter-clockwise radians. 0 means East. Default is 0.\n */\nexport function makeRegular(polygon, center, radius, angle) {\n const flatCoordinates = polygon.getFlatCoordinates();\n const stride = polygon.getStride();\n const sides = flatCoordinates.length / stride - 1;\n const startAngle = angle ? angle : 0;\n for (let i = 0; i <= sides; ++i) {\n const offset = i * stride;\n const angle = startAngle + (modulo(i, sides) * 2 * Math.PI) / sides;\n flatCoordinates[offset] = center[0] + radius * Math.cos(angle);\n flatCoordinates[offset + 1] = center[1] + radius * Math.sin(angle);\n }\n polygon.changed();\n}\n", "/**\n * @module ol/View\n */\nimport BaseObject from './Object.js';\nimport ViewHint from './ViewHint.js';\nimport ViewProperty from './ViewProperty.js';\nimport {DEFAULT_TILE_SIZE} from './tilegrid/common.js';\nimport {\n METERS_PER_UNIT,\n createProjection,\n disableCoordinateWarning,\n fromUserCoordinate,\n fromUserExtent,\n getUserProjection,\n toUserCoordinate,\n toUserExtent,\n} from './proj.js';\nimport {VOID} from './functions.js';\nimport {\n add as addCoordinate,\n equals as coordinatesEqual,\n equals,\n rotate as rotateCoordinate,\n} from './coordinate.js';\nimport {assert} from './asserts.js';\nimport {none as centerNone, createExtent} from './centerconstraint.js';\nimport {clamp, modulo} from './math.js';\nimport {\n createMinMaxResolution,\n createSnapToPower,\n createSnapToResolutions,\n} from './resolutionconstraint.js';\nimport {\n createSnapToN,\n createSnapToZero,\n disable,\n none as rotationNone,\n} from './rotationconstraint.js';\nimport {easeOut, inAndOut} from './easing.js';\nimport {\n getCenter,\n getForViewAndSize,\n getHeight,\n getWidth,\n isEmpty,\n} from './extent.js';\nimport {linearFindNearest} from './array.js';\nimport {fromExtent as polygonFromExtent} from './geom/Polygon.js';\n\n/**\n * An animation configuration\n *\n * @typedef {Object} Animation\n * @property {import(\"./coordinate.js\").Coordinate} [sourceCenter] Source center.\n * @property {import(\"./coordinate.js\").Coordinate} [targetCenter] Target center.\n * @property {number} [sourceResolution] Source resolution.\n * @property {number} [targetResolution] Target resolution.\n * @property {number} [sourceRotation] Source rotation.\n * @property {number} [targetRotation] Target rotation.\n * @property {import(\"./coordinate.js\").Coordinate} [anchor] Anchor.\n * @property {number} start Start.\n * @property {number} duration Duration.\n * @property {boolean} complete Complete.\n * @property {function(number):number} easing Easing.\n * @property {function(boolean):void} callback Callback.\n */\n\n/**\n * @typedef {Object} Constraints\n * @property {import(\"./centerconstraint.js\").Type} center Center.\n * @property {import(\"./resolutionconstraint.js\").Type} resolution Resolution.\n * @property {import(\"./rotationconstraint.js\").Type} rotation Rotation.\n */\n\n/**\n * @typedef {Object} FitOptions\n * @property {import(\"./size.js\").Size} [size] The size in pixels of the box to fit\n * the extent into. Default is the current size of the first map in the DOM that\n * uses this view, or `[100, 100]` if no such map is found.\n * @property {!Array} [padding=[0, 0, 0, 0]] Padding (in pixels) to be\n * cleared inside the view. Values in the array are top, right, bottom and left\n * padding.\n * @property {boolean} [nearest=false] If the view `constrainResolution` option is `true`,\n * get the nearest extent instead of the closest that actually fits the view.\n * @property {number} [minResolution=0] Minimum resolution that we zoom to.\n * @property {number} [maxZoom] Maximum zoom level that we zoom to. If\n * `minResolution` is given, this property is ignored.\n * @property {number} [duration] The duration of the animation in milliseconds.\n * By default, there is no animation to the target extent.\n * @property {function(number):number} [easing] The easing function used during\n * the animation (defaults to {@link module:ol/easing.inAndOut}).\n * The function will be called for each frame with a number representing a\n * fraction of the animation's duration. The function should return a number\n * between 0 and 1 representing the progress toward the destination state.\n * @property {function(boolean):void} [callback] Function called when the view is in\n * its final position. The callback will be called with `true` if the animation\n * series completed on its own or `false` if it was cancelled.\n */\n\n/**\n * @typedef {Object} ViewOptions\n * @property {import(\"./coordinate.js\").Coordinate} [center] The initial center for\n * the view. If a user projection is not set, the coordinate system for the center is\n * specified with the `projection` option. Layer sources will not be fetched if this\n * is not set, but the center can be set later with {@link #setCenter}.\n * @property {boolean|number} [constrainRotation=true] Rotation constraint.\n * `false` means no constraint. `true` means no constraint, but snap to zero\n * near zero. A number constrains the rotation to that number of values. For\n * example, `4` will constrain the rotation to 0, 90, 180, and 270 degrees.\n * @property {boolean} [enableRotation=true] Enable rotation.\n * If `false`, a rotation constraint that always sets the rotation to zero is\n * used. The `constrainRotation` option has no effect if `enableRotation` is\n * `false`.\n * @property {import(\"./extent.js\").Extent} [extent] The extent that constrains the\n * view, in other words, nothing outside of this extent can be visible on the map.\n * @property {boolean} [constrainOnlyCenter=false] If true, the extent\n * constraint will only apply to the view center and not the whole extent.\n * @property {boolean} [smoothExtentConstraint=true] If true, the extent\n * constraint will be applied smoothly, i.e. allow the view to go slightly outside\n * of the given `extent`.\n * @property {number} [maxResolution] The maximum resolution used to determine\n * the resolution constraint. It is used together with `minResolution` (or\n * `maxZoom`) and `zoomFactor`. If unspecified it is calculated in such a way\n * that the projection's validity extent fits in a 256x256 px tile. If the\n * projection is Spherical Mercator (the default) then `maxResolution` defaults\n * to `40075016.68557849 / 256 = 156543.03392804097`.\n * @property {number} [minResolution] The minimum resolution used to determine\n * the resolution constraint. It is used together with `maxResolution` (or\n * `minZoom`) and `zoomFactor`. If unspecified it is calculated assuming 29\n * zoom levels (with a factor of 2). If the projection is Spherical Mercator\n * (the default) then `minResolution` defaults to\n * `40075016.68557849 / 256 / Math.pow(2, 28) = 0.0005831682455839253`.\n * @property {number} [maxZoom=28] The maximum zoom level used to determine the\n * resolution constraint. It is used together with `minZoom` (or\n * `maxResolution`) and `zoomFactor`. Note that if `minResolution` is also\n * provided, it is given precedence over `maxZoom`.\n * @property {number} [minZoom=0] The minimum zoom level used to determine the\n * resolution constraint. It is used together with `maxZoom` (or\n * `minResolution`) and `zoomFactor`. Note that if `maxResolution` is also\n * provided, it is given precedence over `minZoom`.\n * @property {boolean} [multiWorld=false] If `false` the view is constrained so\n * only one world is visible, and you cannot pan off the edge. If `true` the map\n * may show multiple worlds at low zoom levels. Only used if the `projection` is\n * global. Note that if `extent` is also provided it is given precedence.\n * @property {boolean} [constrainResolution=false] If true, the view will always\n * animate to the closest zoom level after an interaction; false means\n * intermediary zoom levels are allowed.\n * @property {boolean} [smoothResolutionConstraint=true] If true, the resolution\n * min/max values will be applied smoothly, i. e. allow the view to exceed slightly\n * the given resolution or zoom bounds.\n * @property {boolean} [showFullExtent=false] Allow the view to be zoomed out to\n * show the full configured extent. By default, when a view is configured with an\n * extent, users will not be able to zoom out so the viewport exceeds the extent in\n * either dimension. This means the full extent may not be visible if the viewport\n * is taller or wider than the aspect ratio of the configured extent. If\n * showFullExtent is true, the user will be able to zoom out so that the viewport\n * exceeds the height or width of the configured extent, but not both, allowing the\n * full extent to be shown.\n * @property {import(\"./proj.js\").ProjectionLike} [projection='EPSG:3857'] The\n * projection. The default is Spherical Mercator.\n * @property {number} [resolution] The initial resolution for the view. The\n * units are `projection` units per pixel (e.g. meters per pixel). An\n * alternative to setting this is to set `zoom`. Layer sources will not be\n * fetched if neither this nor `zoom` are defined, but they can be set later\n * with {@link #setZoom} or {@link #setResolution}.\n * @property {Array} [resolutions] Resolutions that determine the\n * zoom levels if specified. The index in the array corresponds to the zoom level,\n * therefore the resolution values have to be in descending order. It also constrains\n * the resolution by the minimum and maximum value. If set the `maxResolution`,\n * `minResolution`, `minZoom`, `maxZoom`, and `zoomFactor` options are ignored.\n * @property {number} [rotation=0] The initial rotation for the view in radians\n * (positive rotation clockwise, 0 means North).\n * @property {number} [zoom] Only used if `resolution` is not defined. Zoom\n * level used to calculate the initial resolution for the view.\n * @property {number} [zoomFactor=2] The zoom factor used to compute the\n * corresponding resolution.\n * @property {!Array} [padding=[0, 0, 0, 0]] Padding (in css pixels).\n * If the map viewport is partially covered with other content (overlays) along\n * its edges, this setting allows to shift the center of the viewport away from\n * that content. The order of the values is top, right, bottom, left.\n */\n\n/**\n * @typedef {Object} AnimationOptions\n * @property {import(\"./coordinate.js\").Coordinate} [center] The center of the view at the end of\n * the animation.\n * @property {number} [zoom] The zoom level of the view at the end of the\n * animation. This takes precedence over `resolution`.\n * @property {number} [resolution] The resolution of the view at the end\n * of the animation. If `zoom` is also provided, this option will be ignored.\n * @property {number} [rotation] The rotation of the view at the end of\n * the animation.\n * @property {import(\"./coordinate.js\").Coordinate} [anchor] Optional anchor to remain fixed\n * during a rotation or resolution animation.\n * @property {number} [duration=1000] The duration of the animation in milliseconds.\n * @property {function(number):number} [easing] The easing function used\n * during the animation (defaults to {@link module:ol/easing.inAndOut}).\n * The function will be called for each frame with a number representing a\n * fraction of the animation's duration. The function should return a number\n * between 0 and 1 representing the progress toward the destination state.\n */\n\n/**\n * @typedef {Object} State\n * @property {import(\"./coordinate.js\").Coordinate} center Center (in view projection coordinates).\n * @property {import(\"./proj/Projection.js\").default} projection Projection.\n * @property {number} resolution Resolution.\n * @property {import(\"./coordinate.js\").Coordinate} [nextCenter] The next center during an animation series.\n * @property {number} [nextResolution] The next resolution during an animation series.\n * @property {number} [nextRotation] The next rotation during an animation series.\n * @property {number} rotation Rotation.\n * @property {number} zoom Zoom.\n */\n\n/**\n * Like {@link import(\"./Map.js\").FrameState}, but just `viewState` and `extent`.\n * @typedef {Object} ViewStateLayerStateExtent\n * @property {State} viewState View state.\n * @property {import(\"./extent.js\").Extent} extent Extent (in user projection coordinates).\n * @property {Array} [layerStatesArray] Layer states.\n */\n\n/**\n * Default min zoom level for the map view.\n * @type {number}\n */\nconst DEFAULT_MIN_ZOOM = 0;\n\n/**\n * @typedef {import(\"./ObjectEventType\").Types|'change:center'|'change:resolution'|'change:rotation'} ViewObjectEventTypes\n */\n\n/***\n * @template Return\n * @typedef {import(\"./Observable\").OnSignature &\n * import(\"./Observable\").OnSignature &\n * import(\"./Observable\").CombinedOnSignature} ViewOnSignature\n */\n\n/**\n * @classdesc\n * A View object represents a simple 2D view of the map.\n *\n * This is the object to act upon to change the center, resolution,\n * and rotation of the map.\n *\n * A View has a `projection`. The projection determines the\n * coordinate system of the center, and its units determine the units of the\n * resolution (projection units per pixel). The default projection is\n * Web Mercator (EPSG:3857).\n *\n * ### The view states\n *\n * A View is determined by three states: `center`, `resolution`,\n * and `rotation`. Each state has a corresponding getter and setter, e.g.\n * `getCenter` and `setCenter` for the `center` state.\n *\n * The `zoom` state is actually not saved on the view: all computations\n * internally use the `resolution` state. Still, the `setZoom` and `getZoom`\n * methods are available, as well as `getResolutionForZoom` and\n * `getZoomForResolution` to switch from one system to the other.\n *\n * ### The constraints\n *\n * `setCenter`, `setResolution` and `setRotation` can be used to change the\n * states of the view, but any constraint defined in the constructor will\n * be applied along the way.\n *\n * A View object can have a *resolution constraint*, a *rotation constraint*\n * and a *center constraint*.\n *\n * The *resolution constraint* typically restricts min/max values and\n * snaps to specific resolutions. It is determined by the following\n * options: `resolutions`, `maxResolution`, `maxZoom` and `zoomFactor`.\n * If `resolutions` is set, the other three options are ignored. See\n * documentation for each option for more information. By default, the view\n * only has a min/max restriction and allow intermediary zoom levels when\n * pinch-zooming for example.\n *\n * The *rotation constraint* snaps to specific angles. It is determined\n * by the following options: `enableRotation` and `constrainRotation`.\n * By default rotation is allowed and its value is snapped to zero when approaching the\n * horizontal.\n *\n * The *center constraint* is determined by the `extent` option. By\n * default the view center is not constrained at all.\n *\n * ### Changing the view state\n *\n * It is important to note that `setZoom`, `setResolution`, `setCenter` and\n * `setRotation` are subject to the above mentioned constraints. As such, it\n * may sometimes not be possible to know in advance the resulting state of the\n * View. For example, calling `setResolution(10)` does not guarantee that\n * `getResolution()` will return `10`.\n *\n * A consequence of this is that, when applying a delta on the view state, one\n * should use `adjustCenter`, `adjustRotation`, `adjustZoom` and `adjustResolution`\n * rather than the corresponding setters. This will let view do its internal\n * computations. Besides, the `adjust*` methods also take an `anchor`\n * argument which allows specifying an origin for the transformation.\n *\n * ### Interacting with the view\n *\n * View constraints are usually only applied when the view is *at rest*, meaning that\n * no interaction or animation is ongoing. As such, if the user puts the view in a\n * state that is not equivalent to a constrained one (e.g. rotating the view when\n * the snap angle is 0), an animation will be triggered at the interaction end to\n * put back the view to a stable state;\n *\n * @api\n */\nclass View extends BaseObject {\n /**\n * @param {ViewOptions} [options] View options.\n */\n constructor(options) {\n super();\n\n /***\n * @type {ViewOnSignature}\n */\n this.on;\n\n /***\n * @type {ViewOnSignature}\n */\n this.once;\n\n /***\n * @type {ViewOnSignature}\n */\n this.un;\n\n options = Object.assign({}, options);\n\n /**\n * @private\n * @type {Array}\n */\n this.hints_ = [0, 0];\n\n /**\n * @private\n * @type {Array>}\n */\n this.animations_ = [];\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.updateAnimationKey_;\n\n /**\n * @private\n * @const\n * @type {import(\"./proj/Projection.js\").default}\n */\n this.projection_ = createProjection(options.projection, 'EPSG:3857');\n\n /**\n * @private\n * @type {import(\"./size.js\").Size}\n */\n this.viewportSize_ = [100, 100];\n\n /**\n * @private\n * @type {import(\"./coordinate.js\").Coordinate|undefined}\n */\n this.targetCenter_ = null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.targetResolution_;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.targetRotation_;\n\n /**\n * @private\n * @type {import(\"./coordinate.js\").Coordinate}\n */\n this.nextCenter_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.nextResolution_;\n\n /**\n * @private\n * @type {number}\n */\n this.nextRotation_;\n\n /**\n * @private\n * @type {import(\"./coordinate.js\").Coordinate|undefined}\n */\n this.cancelAnchor_ = undefined;\n\n if (options.projection) {\n disableCoordinateWarning();\n }\n if (options.center) {\n options.center = fromUserCoordinate(options.center, this.projection_);\n }\n if (options.extent) {\n options.extent = fromUserExtent(options.extent, this.projection_);\n }\n\n this.applyOptions_(options);\n }\n\n /**\n * Set up the view with the given options.\n * @param {ViewOptions} options View options.\n */\n applyOptions_(options) {\n const properties = Object.assign({}, options);\n for (const key in ViewProperty) {\n delete properties[key];\n }\n this.setProperties(properties, true);\n\n const resolutionConstraintInfo = createResolutionConstraint(options);\n\n /**\n * @private\n * @type {number}\n */\n this.maxResolution_ = resolutionConstraintInfo.maxResolution;\n\n /**\n * @private\n * @type {number}\n */\n this.minResolution_ = resolutionConstraintInfo.minResolution;\n\n /**\n * @private\n * @type {number}\n */\n this.zoomFactor_ = resolutionConstraintInfo.zoomFactor;\n\n /**\n * @private\n * @type {Array|undefined}\n */\n this.resolutions_ = options.resolutions;\n\n /**\n * @type {Array|undefined}\n * @private\n */\n this.padding_ = options.padding;\n\n /**\n * @private\n * @type {number}\n */\n this.minZoom_ = resolutionConstraintInfo.minZoom;\n\n const centerConstraint = createCenterConstraint(options);\n const resolutionConstraint = resolutionConstraintInfo.constraint;\n const rotationConstraint = createRotationConstraint(options);\n\n /**\n * @private\n * @type {Constraints}\n */\n this.constraints_ = {\n center: centerConstraint,\n resolution: resolutionConstraint,\n rotation: rotationConstraint,\n };\n\n this.setRotation(options.rotation !== undefined ? options.rotation : 0);\n this.setCenterInternal(\n options.center !== undefined ? options.center : null\n );\n if (options.resolution !== undefined) {\n this.setResolution(options.resolution);\n } else if (options.zoom !== undefined) {\n this.setZoom(options.zoom);\n }\n }\n\n /**\n * Padding (in css pixels).\n * If the map viewport is partially covered with other content (overlays) along\n * its edges, this setting allows to shift the center of the viewport away from that\n * content. The order of the values in the array is top, right, bottom, left.\n * The default is no padding, which is equivalent to `[0, 0, 0, 0]`.\n * @type {Array|undefined}\n * @api\n */\n get padding() {\n return this.padding_;\n }\n set padding(padding) {\n let oldPadding = this.padding_;\n this.padding_ = padding;\n const center = this.getCenterInternal();\n if (center) {\n const newPadding = padding || [0, 0, 0, 0];\n oldPadding = oldPadding || [0, 0, 0, 0];\n const resolution = this.getResolution();\n const offsetX =\n (resolution / 2) *\n (newPadding[3] - oldPadding[3] + oldPadding[1] - newPadding[1]);\n const offsetY =\n (resolution / 2) *\n (newPadding[0] - oldPadding[0] + oldPadding[2] - newPadding[2]);\n this.setCenterInternal([center[0] + offsetX, center[1] - offsetY]);\n }\n }\n\n /**\n * Get an updated version of the view options used to construct the view. The\n * current resolution (or zoom), center, and rotation are applied to any stored\n * options. The provided options can be used to apply new min/max zoom or\n * resolution limits.\n * @param {ViewOptions} newOptions New options to be applied.\n * @return {ViewOptions} New options updated with the current view state.\n */\n getUpdatedOptions_(newOptions) {\n const options = this.getProperties();\n\n // preserve resolution (or zoom)\n if (options.resolution !== undefined) {\n options.resolution = this.getResolution();\n } else {\n options.zoom = this.getZoom();\n }\n\n // preserve center\n options.center = this.getCenterInternal();\n\n // preserve rotation\n options.rotation = this.getRotation();\n\n return Object.assign({}, options, newOptions);\n }\n\n /**\n * Animate the view. The view's center, zoom (or resolution), and rotation\n * can be animated for smooth transitions between view states. For example,\n * to animate the view to a new zoom level:\n *\n * view.animate({zoom: view.getZoom() + 1});\n *\n * By default, the animation lasts one second and uses in-and-out easing. You\n * can customize this behavior by including `duration` (in milliseconds) and\n * `easing` options (see {@link module:ol/easing}).\n *\n * To chain together multiple animations, call the method with multiple\n * animation objects. For example, to first zoom and then pan:\n *\n * view.animate({zoom: 10}, {center: [0, 0]});\n *\n * If you provide a function as the last argument to the animate method, it\n * will get called at the end of an animation series. The callback will be\n * called with `true` if the animation series completed on its own or `false`\n * if it was cancelled.\n *\n * Animations are cancelled by user interactions (e.g. dragging the map) or by\n * calling `view.setCenter()`, `view.setResolution()`, or `view.setRotation()`\n * (or another method that calls one of these).\n *\n * @param {...(AnimationOptions|function(boolean): void)} var_args Animation\n * options. Multiple animations can be run in series by passing multiple\n * options objects. To run multiple animations in parallel, call the method\n * multiple times. An optional callback can be provided as a final\n * argument. The callback will be called with a boolean indicating whether\n * the animation completed without being cancelled.\n * @api\n */\n animate(var_args) {\n if (this.isDef() && !this.getAnimating()) {\n this.resolveConstraints(0);\n }\n const args = new Array(arguments.length);\n for (let i = 0; i < args.length; ++i) {\n let options = arguments[i];\n if (options.center) {\n options = Object.assign({}, options);\n options.center = fromUserCoordinate(\n options.center,\n this.getProjection()\n );\n }\n if (options.anchor) {\n options = Object.assign({}, options);\n options.anchor = fromUserCoordinate(\n options.anchor,\n this.getProjection()\n );\n }\n args[i] = options;\n }\n this.animateInternal.apply(this, args);\n }\n\n /**\n * @param {...(AnimationOptions|function(boolean): void)} var_args Animation options.\n */\n animateInternal(var_args) {\n let animationCount = arguments.length;\n let callback;\n if (\n animationCount > 1 &&\n typeof arguments[animationCount - 1] === 'function'\n ) {\n callback = arguments[animationCount - 1];\n --animationCount;\n }\n\n let i = 0;\n for (; i < animationCount && !this.isDef(); ++i) {\n // if view properties are not yet set, shortcut to the final state\n const state = arguments[i];\n if (state.center) {\n this.setCenterInternal(state.center);\n }\n if (state.zoom !== undefined) {\n this.setZoom(state.zoom);\n } else if (state.resolution) {\n this.setResolution(state.resolution);\n }\n if (state.rotation !== undefined) {\n this.setRotation(state.rotation);\n }\n }\n if (i === animationCount) {\n if (callback) {\n animationCallback(callback, true);\n }\n return;\n }\n\n let start = Date.now();\n let center = this.targetCenter_.slice();\n let resolution = this.targetResolution_;\n let rotation = this.targetRotation_;\n const series = [];\n for (; i < animationCount; ++i) {\n const options = /** @type {AnimationOptions} */ (arguments[i]);\n\n const animation = {\n start: start,\n complete: false,\n anchor: options.anchor,\n duration: options.duration !== undefined ? options.duration : 1000,\n easing: options.easing || inAndOut,\n callback: callback,\n };\n\n if (options.center) {\n animation.sourceCenter = center;\n animation.targetCenter = options.center.slice();\n center = animation.targetCenter;\n }\n\n if (options.zoom !== undefined) {\n animation.sourceResolution = resolution;\n animation.targetResolution = this.getResolutionForZoom(options.zoom);\n resolution = animation.targetResolution;\n } else if (options.resolution) {\n animation.sourceResolution = resolution;\n animation.targetResolution = options.resolution;\n resolution = animation.targetResolution;\n }\n\n if (options.rotation !== undefined) {\n animation.sourceRotation = rotation;\n const delta =\n modulo(options.rotation - rotation + Math.PI, 2 * Math.PI) - Math.PI;\n animation.targetRotation = rotation + delta;\n rotation = animation.targetRotation;\n }\n\n // check if animation is a no-op\n if (isNoopAnimation(animation)) {\n animation.complete = true;\n // we still push it onto the series for callback handling\n } else {\n start += animation.duration;\n }\n series.push(animation);\n }\n this.animations_.push(series);\n this.setHint(ViewHint.ANIMATING, 1);\n this.updateAnimations_();\n }\n\n /**\n * Determine if the view is being animated.\n * @return {boolean} The view is being animated.\n * @api\n */\n getAnimating() {\n return this.hints_[ViewHint.ANIMATING] > 0;\n }\n\n /**\n * Determine if the user is interacting with the view, such as panning or zooming.\n * @return {boolean} The view is being interacted with.\n * @api\n */\n getInteracting() {\n return this.hints_[ViewHint.INTERACTING] > 0;\n }\n\n /**\n * Cancel any ongoing animations.\n * @api\n */\n cancelAnimations() {\n this.setHint(ViewHint.ANIMATING, -this.hints_[ViewHint.ANIMATING]);\n let anchor;\n for (let i = 0, ii = this.animations_.length; i < ii; ++i) {\n const series = this.animations_[i];\n if (series[0].callback) {\n animationCallback(series[0].callback, false);\n }\n if (!anchor) {\n for (let j = 0, jj = series.length; j < jj; ++j) {\n const animation = series[j];\n if (!animation.complete) {\n anchor = animation.anchor;\n break;\n }\n }\n }\n }\n this.animations_.length = 0;\n this.cancelAnchor_ = anchor;\n this.nextCenter_ = null;\n this.nextResolution_ = NaN;\n this.nextRotation_ = NaN;\n }\n\n /**\n * Update all animations.\n */\n updateAnimations_() {\n if (this.updateAnimationKey_ !== undefined) {\n cancelAnimationFrame(this.updateAnimationKey_);\n this.updateAnimationKey_ = undefined;\n }\n if (!this.getAnimating()) {\n return;\n }\n const now = Date.now();\n let more = false;\n for (let i = this.animations_.length - 1; i >= 0; --i) {\n const series = this.animations_[i];\n let seriesComplete = true;\n for (let j = 0, jj = series.length; j < jj; ++j) {\n const animation = series[j];\n if (animation.complete) {\n continue;\n }\n const elapsed = now - animation.start;\n let fraction =\n animation.duration > 0 ? elapsed / animation.duration : 1;\n if (fraction >= 1) {\n animation.complete = true;\n fraction = 1;\n } else {\n seriesComplete = false;\n }\n const progress = animation.easing(fraction);\n if (animation.sourceCenter) {\n const x0 = animation.sourceCenter[0];\n const y0 = animation.sourceCenter[1];\n const x1 = animation.targetCenter[0];\n const y1 = animation.targetCenter[1];\n this.nextCenter_ = animation.targetCenter;\n const x = x0 + progress * (x1 - x0);\n const y = y0 + progress * (y1 - y0);\n this.targetCenter_ = [x, y];\n }\n if (animation.sourceResolution && animation.targetResolution) {\n const resolution =\n progress === 1\n ? animation.targetResolution\n : animation.sourceResolution +\n progress *\n (animation.targetResolution - animation.sourceResolution);\n if (animation.anchor) {\n const size = this.getViewportSize_(this.getRotation());\n const constrainedResolution = this.constraints_.resolution(\n resolution,\n 0,\n size,\n true\n );\n this.targetCenter_ = this.calculateCenterZoom(\n constrainedResolution,\n animation.anchor\n );\n }\n this.nextResolution_ = animation.targetResolution;\n this.targetResolution_ = resolution;\n this.applyTargetState_(true);\n }\n if (\n animation.sourceRotation !== undefined &&\n animation.targetRotation !== undefined\n ) {\n const rotation =\n progress === 1\n ? modulo(animation.targetRotation + Math.PI, 2 * Math.PI) -\n Math.PI\n : animation.sourceRotation +\n progress *\n (animation.targetRotation - animation.sourceRotation);\n if (animation.anchor) {\n const constrainedRotation = this.constraints_.rotation(\n rotation,\n true\n );\n this.targetCenter_ = this.calculateCenterRotate(\n constrainedRotation,\n animation.anchor\n );\n }\n this.nextRotation_ = animation.targetRotation;\n this.targetRotation_ = rotation;\n }\n this.applyTargetState_(true);\n more = true;\n if (!animation.complete) {\n break;\n }\n }\n if (seriesComplete) {\n this.animations_[i] = null;\n this.setHint(ViewHint.ANIMATING, -1);\n this.nextCenter_ = null;\n this.nextResolution_ = NaN;\n this.nextRotation_ = NaN;\n const callback = series[0].callback;\n if (callback) {\n animationCallback(callback, true);\n }\n }\n }\n // prune completed series\n this.animations_ = this.animations_.filter(Boolean);\n if (more && this.updateAnimationKey_ === undefined) {\n this.updateAnimationKey_ = requestAnimationFrame(\n this.updateAnimations_.bind(this)\n );\n }\n }\n\n /**\n * @param {number} rotation Target rotation.\n * @param {import(\"./coordinate.js\").Coordinate} anchor Rotation anchor.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center for rotation and anchor.\n */\n calculateCenterRotate(rotation, anchor) {\n let center;\n const currentCenter = this.getCenterInternal();\n if (currentCenter !== undefined) {\n center = [currentCenter[0] - anchor[0], currentCenter[1] - anchor[1]];\n rotateCoordinate(center, rotation - this.getRotation());\n addCoordinate(center, anchor);\n }\n return center;\n }\n\n /**\n * @param {number} resolution Target resolution.\n * @param {import(\"./coordinate.js\").Coordinate} anchor Zoom anchor.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center for resolution and anchor.\n */\n calculateCenterZoom(resolution, anchor) {\n let center;\n const currentCenter = this.getCenterInternal();\n const currentResolution = this.getResolution();\n if (currentCenter !== undefined && currentResolution !== undefined) {\n const x =\n anchor[0] -\n (resolution * (anchor[0] - currentCenter[0])) / currentResolution;\n const y =\n anchor[1] -\n (resolution * (anchor[1] - currentCenter[1])) / currentResolution;\n center = [x, y];\n }\n return center;\n }\n\n /**\n * Returns the current viewport size.\n * @private\n * @param {number} [rotation] Take into account the rotation of the viewport when giving the size\n * @return {import(\"./size.js\").Size} Viewport size or `[100, 100]` when no viewport is found.\n */\n getViewportSize_(rotation) {\n const size = this.viewportSize_;\n if (rotation) {\n const w = size[0];\n const h = size[1];\n return [\n Math.abs(w * Math.cos(rotation)) + Math.abs(h * Math.sin(rotation)),\n Math.abs(w * Math.sin(rotation)) + Math.abs(h * Math.cos(rotation)),\n ];\n }\n return size;\n }\n\n /**\n * Stores the viewport size on the view. The viewport size is not read every time from the DOM\n * to avoid performance hit and layout reflow.\n * This should be done on map size change.\n * Note: the constraints are not resolved during an animation to avoid stopping it\n * @param {import(\"./size.js\").Size} [size] Viewport size; if undefined, [100, 100] is assumed\n */\n setViewportSize(size) {\n this.viewportSize_ = Array.isArray(size) ? size.slice() : [100, 100];\n if (!this.getAnimating()) {\n this.resolveConstraints(0);\n }\n }\n\n /**\n * Get the view center.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} The center of the view.\n * @observable\n * @api\n */\n getCenter() {\n const center = this.getCenterInternal();\n if (!center) {\n return center;\n }\n return toUserCoordinate(center, this.getProjection());\n }\n\n /**\n * Get the view center without transforming to user projection.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} The center of the view.\n */\n getCenterInternal() {\n return /** @type {import(\"./coordinate.js\").Coordinate|undefined} */ (\n this.get(ViewProperty.CENTER)\n );\n }\n\n /**\n * @return {Constraints} Constraints.\n */\n getConstraints() {\n return this.constraints_;\n }\n\n /**\n * @return {boolean} Resolution constraint is set\n */\n getConstrainResolution() {\n return this.get('constrainResolution');\n }\n\n /**\n * @param {Array} [hints] Destination array.\n * @return {Array} Hint.\n */\n getHints(hints) {\n if (hints !== undefined) {\n hints[0] = this.hints_[0];\n hints[1] = this.hints_[1];\n return hints;\n }\n return this.hints_.slice();\n }\n\n /**\n * Calculate the extent for the current view state and the passed size.\n * The size is the pixel dimensions of the box into which the calculated extent\n * should fit. In most cases you want to get the extent of the entire map,\n * that is `map.getSize()`.\n * @param {import(\"./size.js\").Size} [size] Box pixel size. If not provided, the size\n * of the map that uses this view will be used.\n * @return {import(\"./extent.js\").Extent} Extent.\n * @api\n */\n calculateExtent(size) {\n const extent = this.calculateExtentInternal(size);\n return toUserExtent(extent, this.getProjection());\n }\n\n /**\n * @param {import(\"./size.js\").Size} [size] Box pixel size. If not provided,\n * the map's last known viewport size will be used.\n * @return {import(\"./extent.js\").Extent} Extent.\n */\n calculateExtentInternal(size) {\n size = size || this.getViewportSizeMinusPadding_();\n const center = /** @type {!import(\"./coordinate.js\").Coordinate} */ (\n this.getCenterInternal()\n );\n assert(center, 1); // The view center is not defined\n const resolution = /** @type {!number} */ (this.getResolution());\n assert(resolution !== undefined, 2); // The view resolution is not defined\n const rotation = /** @type {!number} */ (this.getRotation());\n assert(rotation !== undefined, 3); // The view rotation is not defined\n\n return getForViewAndSize(center, resolution, rotation, size);\n }\n\n /**\n * Get the maximum resolution of the view.\n * @return {number} The maximum resolution of the view.\n * @api\n */\n getMaxResolution() {\n return this.maxResolution_;\n }\n\n /**\n * Get the minimum resolution of the view.\n * @return {number} The minimum resolution of the view.\n * @api\n */\n getMinResolution() {\n return this.minResolution_;\n }\n\n /**\n * Get the maximum zoom level for the view.\n * @return {number} The maximum zoom level.\n * @api\n */\n getMaxZoom() {\n return /** @type {number} */ (\n this.getZoomForResolution(this.minResolution_)\n );\n }\n\n /**\n * Set a new maximum zoom level for the view.\n * @param {number} zoom The maximum zoom level.\n * @api\n */\n setMaxZoom(zoom) {\n this.applyOptions_(this.getUpdatedOptions_({maxZoom: zoom}));\n }\n\n /**\n * Get the minimum zoom level for the view.\n * @return {number} The minimum zoom level.\n * @api\n */\n getMinZoom() {\n return /** @type {number} */ (\n this.getZoomForResolution(this.maxResolution_)\n );\n }\n\n /**\n * Set a new minimum zoom level for the view.\n * @param {number} zoom The minimum zoom level.\n * @api\n */\n setMinZoom(zoom) {\n this.applyOptions_(this.getUpdatedOptions_({minZoom: zoom}));\n }\n\n /**\n * Set whether the view should allow intermediary zoom levels.\n * @param {boolean} enabled Whether the resolution is constrained.\n * @api\n */\n setConstrainResolution(enabled) {\n this.applyOptions_(this.getUpdatedOptions_({constrainResolution: enabled}));\n }\n\n /**\n * Get the view projection.\n * @return {import(\"./proj/Projection.js\").default} The projection of the view.\n * @api\n */\n getProjection() {\n return this.projection_;\n }\n\n /**\n * Get the view resolution.\n * @return {number|undefined} The resolution of the view.\n * @observable\n * @api\n */\n getResolution() {\n return /** @type {number|undefined} */ (this.get(ViewProperty.RESOLUTION));\n }\n\n /**\n * Get the resolutions for the view. This returns the array of resolutions\n * passed to the constructor of the View, or undefined if none were given.\n * @return {Array|undefined} The resolutions of the view.\n * @api\n */\n getResolutions() {\n return this.resolutions_;\n }\n\n /**\n * Get the resolution for a provided extent (in map units) and size (in pixels).\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {import(\"./size.js\").Size} [size] Box pixel size.\n * @return {number} The resolution at which the provided extent will render at\n * the given size.\n * @api\n */\n getResolutionForExtent(extent, size) {\n return this.getResolutionForExtentInternal(\n fromUserExtent(extent, this.getProjection()),\n size\n );\n }\n\n /**\n * Get the resolution for a provided extent (in map units) and size (in pixels).\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {import(\"./size.js\").Size} [size] Box pixel size.\n * @return {number} The resolution at which the provided extent will render at\n * the given size.\n */\n getResolutionForExtentInternal(extent, size) {\n size = size || this.getViewportSizeMinusPadding_();\n const xResolution = getWidth(extent) / size[0];\n const yResolution = getHeight(extent) / size[1];\n return Math.max(xResolution, yResolution);\n }\n\n /**\n * Return a function that returns a value between 0 and 1 for a\n * resolution. Exponential scaling is assumed.\n * @param {number} [power] Power.\n * @return {function(number): number} Resolution for value function.\n */\n getResolutionForValueFunction(power) {\n power = power || 2;\n const maxResolution = this.getConstrainedResolution(this.maxResolution_);\n const minResolution = this.minResolution_;\n const max = Math.log(maxResolution / minResolution) / Math.log(power);\n return (\n /**\n * @param {number} value Value.\n * @return {number} Resolution.\n */\n function (value) {\n const resolution = maxResolution / Math.pow(power, value * max);\n return resolution;\n }\n );\n }\n\n /**\n * Get the view rotation.\n * @return {number} The rotation of the view in radians.\n * @observable\n * @api\n */\n getRotation() {\n return /** @type {number} */ (this.get(ViewProperty.ROTATION));\n }\n\n /**\n * Return a function that returns a resolution for a value between\n * 0 and 1. Exponential scaling is assumed.\n * @param {number} [power] Power.\n * @return {function(number): number} Value for resolution function.\n */\n getValueForResolutionFunction(power) {\n const logPower = Math.log(power || 2);\n const maxResolution = this.getConstrainedResolution(this.maxResolution_);\n const minResolution = this.minResolution_;\n const max = Math.log(maxResolution / minResolution) / logPower;\n return (\n /**\n * @param {number} resolution Resolution.\n * @return {number} Value.\n */\n function (resolution) {\n const value = Math.log(maxResolution / resolution) / logPower / max;\n return value;\n }\n );\n }\n\n /**\n * Returns the size of the viewport minus padding.\n * @private\n * @param {number} [rotation] Take into account the rotation of the viewport when giving the size\n * @return {import(\"./size.js\").Size} Viewport size reduced by the padding.\n */\n getViewportSizeMinusPadding_(rotation) {\n let size = this.getViewportSize_(rotation);\n const padding = this.padding_;\n if (padding) {\n size = [\n size[0] - padding[1] - padding[3],\n size[1] - padding[0] - padding[2],\n ];\n }\n return size;\n }\n\n /**\n * @return {State} View state.\n */\n getState() {\n const projection = this.getProjection();\n const resolution = this.getResolution();\n const rotation = this.getRotation();\n let center = /** @type {import(\"./coordinate.js\").Coordinate} */ (\n this.getCenterInternal()\n );\n const padding = this.padding_;\n if (padding) {\n const reducedSize = this.getViewportSizeMinusPadding_();\n center = calculateCenterOn(\n center,\n this.getViewportSize_(),\n [reducedSize[0] / 2 + padding[3], reducedSize[1] / 2 + padding[0]],\n resolution,\n rotation\n );\n }\n return {\n center: center.slice(0),\n projection: projection !== undefined ? projection : null,\n resolution: resolution,\n nextCenter: this.nextCenter_,\n nextResolution: this.nextResolution_,\n nextRotation: this.nextRotation_,\n rotation: rotation,\n zoom: this.getZoom(),\n };\n }\n\n /**\n * @return {ViewStateLayerStateExtent} Like `FrameState`, but just `viewState` and `extent`.\n */\n getViewStateAndExtent() {\n return {\n viewState: this.getState(),\n extent: this.calculateExtent(),\n };\n }\n\n /**\n * Get the current zoom level. This method may return non-integer zoom levels\n * if the view does not constrain the resolution, or if an interaction or\n * animation is underway.\n * @return {number|undefined} Zoom.\n * @api\n */\n getZoom() {\n let zoom;\n const resolution = this.getResolution();\n if (resolution !== undefined) {\n zoom = this.getZoomForResolution(resolution);\n }\n return zoom;\n }\n\n /**\n * Get the zoom level for a resolution.\n * @param {number} resolution The resolution.\n * @return {number|undefined} The zoom level for the provided resolution.\n * @api\n */\n getZoomForResolution(resolution) {\n let offset = this.minZoom_ || 0;\n let max, zoomFactor;\n if (this.resolutions_) {\n const nearest = linearFindNearest(this.resolutions_, resolution, 1);\n offset = nearest;\n max = this.resolutions_[nearest];\n if (nearest == this.resolutions_.length - 1) {\n zoomFactor = 2;\n } else {\n zoomFactor = max / this.resolutions_[nearest + 1];\n }\n } else {\n max = this.maxResolution_;\n zoomFactor = this.zoomFactor_;\n }\n return offset + Math.log(max / resolution) / Math.log(zoomFactor);\n }\n\n /**\n * Get the resolution for a zoom level.\n * @param {number} zoom Zoom level.\n * @return {number} The view resolution for the provided zoom level.\n * @api\n */\n getResolutionForZoom(zoom) {\n if (this.resolutions_) {\n if (this.resolutions_.length <= 1) {\n return 0;\n }\n const baseLevel = clamp(\n Math.floor(zoom),\n 0,\n this.resolutions_.length - 2\n );\n const zoomFactor =\n this.resolutions_[baseLevel] / this.resolutions_[baseLevel + 1];\n return (\n this.resolutions_[baseLevel] /\n Math.pow(zoomFactor, clamp(zoom - baseLevel, 0, 1))\n );\n }\n return (\n this.maxResolution_ / Math.pow(this.zoomFactor_, zoom - this.minZoom_)\n );\n }\n\n /**\n * Fit the given geometry or extent based on the given map size and border.\n * The size is pixel dimensions of the box to fit the extent into.\n * In most cases you will want to use the map size, that is `map.getSize()`.\n * Takes care of the map angle.\n * @param {import(\"./geom/SimpleGeometry.js\").default|import(\"./extent.js\").Extent} geometryOrExtent The geometry or\n * extent to fit the view to.\n * @param {FitOptions} [options] Options.\n * @api\n */\n fit(geometryOrExtent, options) {\n /** @type {import(\"./geom/SimpleGeometry.js\").default} */\n let geometry;\n assert(\n Array.isArray(geometryOrExtent) ||\n typeof (/** @type {?} */ (geometryOrExtent).getSimplifiedGeometry) ===\n 'function',\n 24\n ); // Invalid extent or geometry provided as `geometry`\n if (Array.isArray(geometryOrExtent)) {\n assert(!isEmpty(geometryOrExtent), 25); // Cannot fit empty extent provided as `geometry`\n const extent = fromUserExtent(geometryOrExtent, this.getProjection());\n geometry = polygonFromExtent(extent);\n } else if (geometryOrExtent.getType() === 'Circle') {\n const extent = fromUserExtent(\n geometryOrExtent.getExtent(),\n this.getProjection()\n );\n geometry = polygonFromExtent(extent);\n geometry.rotate(this.getRotation(), getCenter(extent));\n } else {\n const userProjection = getUserProjection();\n if (userProjection) {\n geometry = /** @type {import(\"./geom/SimpleGeometry.js\").default} */ (\n geometryOrExtent\n .clone()\n .transform(userProjection, this.getProjection())\n );\n } else {\n geometry = geometryOrExtent;\n }\n }\n\n this.fitInternal(geometry, options);\n }\n\n /**\n * Calculate rotated extent\n * @param {import(\"./geom/SimpleGeometry.js\").default} geometry The geometry.\n * @return {import(\"./extent\").Extent} The rotated extent for the geometry.\n */\n rotatedExtentForGeometry(geometry) {\n const rotation = this.getRotation();\n const cosAngle = Math.cos(rotation);\n const sinAngle = Math.sin(-rotation);\n const coords = geometry.getFlatCoordinates();\n const stride = geometry.getStride();\n let minRotX = +Infinity;\n let minRotY = +Infinity;\n let maxRotX = -Infinity;\n let maxRotY = -Infinity;\n for (let i = 0, ii = coords.length; i < ii; i += stride) {\n const rotX = coords[i] * cosAngle - coords[i + 1] * sinAngle;\n const rotY = coords[i] * sinAngle + coords[i + 1] * cosAngle;\n minRotX = Math.min(minRotX, rotX);\n minRotY = Math.min(minRotY, rotY);\n maxRotX = Math.max(maxRotX, rotX);\n maxRotY = Math.max(maxRotY, rotY);\n }\n return [minRotX, minRotY, maxRotX, maxRotY];\n }\n\n /**\n * @param {import(\"./geom/SimpleGeometry.js\").default} geometry The geometry.\n * @param {FitOptions} [options] Options.\n */\n fitInternal(geometry, options) {\n options = options || {};\n let size = options.size;\n if (!size) {\n size = this.getViewportSizeMinusPadding_();\n }\n const padding =\n options.padding !== undefined ? options.padding : [0, 0, 0, 0];\n const nearest = options.nearest !== undefined ? options.nearest : false;\n let minResolution;\n if (options.minResolution !== undefined) {\n minResolution = options.minResolution;\n } else if (options.maxZoom !== undefined) {\n minResolution = this.getResolutionForZoom(options.maxZoom);\n } else {\n minResolution = 0;\n }\n\n const rotatedExtent = this.rotatedExtentForGeometry(geometry);\n\n // calculate resolution\n let resolution = this.getResolutionForExtentInternal(rotatedExtent, [\n size[0] - padding[1] - padding[3],\n size[1] - padding[0] - padding[2],\n ]);\n resolution = isNaN(resolution)\n ? minResolution\n : Math.max(resolution, minResolution);\n resolution = this.getConstrainedResolution(resolution, nearest ? 0 : 1);\n\n // calculate center\n const rotation = this.getRotation();\n const sinAngle = Math.sin(rotation);\n const cosAngle = Math.cos(rotation);\n const centerRot = getCenter(rotatedExtent);\n centerRot[0] += ((padding[1] - padding[3]) / 2) * resolution;\n centerRot[1] += ((padding[0] - padding[2]) / 2) * resolution;\n const centerX = centerRot[0] * cosAngle - centerRot[1] * sinAngle;\n const centerY = centerRot[1] * cosAngle + centerRot[0] * sinAngle;\n const center = this.getConstrainedCenter([centerX, centerY], resolution);\n const callback = options.callback ? options.callback : VOID;\n\n if (options.duration !== undefined) {\n this.animateInternal(\n {\n resolution: resolution,\n center: center,\n duration: options.duration,\n easing: options.easing,\n },\n callback\n );\n } else {\n this.targetResolution_ = resolution;\n this.targetCenter_ = center;\n this.applyTargetState_(false, true);\n animationCallback(callback, true);\n }\n }\n\n /**\n * Center on coordinate and view position.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"./size.js\").Size} size Box pixel size.\n * @param {import(\"./pixel.js\").Pixel} position Position on the view to center on.\n * @api\n */\n centerOn(coordinate, size, position) {\n this.centerOnInternal(\n fromUserCoordinate(coordinate, this.getProjection()),\n size,\n position\n );\n }\n\n /**\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"./size.js\").Size} size Box pixel size.\n * @param {import(\"./pixel.js\").Pixel} position Position on the view to center on.\n */\n centerOnInternal(coordinate, size, position) {\n this.setCenterInternal(\n calculateCenterOn(\n coordinate,\n size,\n position,\n this.getResolution(),\n this.getRotation()\n )\n );\n }\n\n /**\n * Calculates the shift between map and viewport center.\n * @param {import(\"./coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {import(\"./size.js\").Size} size Size.\n * @return {Array|undefined} Center shift.\n */\n calculateCenterShift(center, resolution, rotation, size) {\n let centerShift;\n const padding = this.padding_;\n if (padding && center) {\n const reducedSize = this.getViewportSizeMinusPadding_(-rotation);\n const shiftedCenter = calculateCenterOn(\n center,\n size,\n [reducedSize[0] / 2 + padding[3], reducedSize[1] / 2 + padding[0]],\n resolution,\n rotation\n );\n centerShift = [\n center[0] - shiftedCenter[0],\n center[1] - shiftedCenter[1],\n ];\n }\n return centerShift;\n }\n\n /**\n * @return {boolean} Is defined.\n */\n isDef() {\n return !!this.getCenterInternal() && this.getResolution() !== undefined;\n }\n\n /**\n * Adds relative coordinates to the center of the view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate} deltaCoordinates Relative value to add.\n * @api\n */\n adjustCenter(deltaCoordinates) {\n const center = toUserCoordinate(this.targetCenter_, this.getProjection());\n this.setCenter([\n center[0] + deltaCoordinates[0],\n center[1] + deltaCoordinates[1],\n ]);\n }\n\n /**\n * Adds relative coordinates to the center of the view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate} deltaCoordinates Relative value to add.\n */\n adjustCenterInternal(deltaCoordinates) {\n const center = this.targetCenter_;\n this.setCenterInternal([\n center[0] + deltaCoordinates[0],\n center[1] + deltaCoordinates[1],\n ]);\n }\n\n /**\n * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} ratio The ratio to apply on the view resolution.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n adjustResolution(ratio, anchor) {\n anchor = anchor && fromUserCoordinate(anchor, this.getProjection());\n this.adjustResolutionInternal(ratio, anchor);\n }\n\n /**\n * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} ratio The ratio to apply on the view resolution.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n adjustResolutionInternal(ratio, anchor) {\n const isMoving = this.getAnimating() || this.getInteracting();\n const size = this.getViewportSize_(this.getRotation());\n const newResolution = this.constraints_.resolution(\n this.targetResolution_ * ratio,\n 0,\n size,\n isMoving\n );\n\n if (anchor) {\n this.targetCenter_ = this.calculateCenterZoom(newResolution, anchor);\n }\n\n this.targetResolution_ *= ratio;\n this.applyTargetState_();\n }\n\n /**\n * Adds a value to the view zoom level, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} delta Relative value to add to the zoom level.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n adjustZoom(delta, anchor) {\n this.adjustResolution(Math.pow(this.zoomFactor_, -delta), anchor);\n }\n\n /**\n * Adds a value to the view rotation, optionally using an anchor. Any rotation\n * constraint will apply.\n * @param {number} delta Relative value to add to the zoom rotation, in radians.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The rotation center.\n * @api\n */\n adjustRotation(delta, anchor) {\n if (anchor) {\n anchor = fromUserCoordinate(anchor, this.getProjection());\n }\n this.adjustRotationInternal(delta, anchor);\n }\n\n /**\n * @param {number} delta Relative value to add to the zoom rotation, in radians.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The rotation center.\n */\n adjustRotationInternal(delta, anchor) {\n const isMoving = this.getAnimating() || this.getInteracting();\n const newRotation = this.constraints_.rotation(\n this.targetRotation_ + delta,\n isMoving\n );\n if (anchor) {\n this.targetCenter_ = this.calculateCenterRotate(newRotation, anchor);\n }\n this.targetRotation_ += delta;\n this.applyTargetState_();\n }\n\n /**\n * Set the center of the current view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center The center of the view.\n * @observable\n * @api\n */\n setCenter(center) {\n this.setCenterInternal(\n center ? fromUserCoordinate(center, this.getProjection()) : center\n );\n }\n\n /**\n * Set the center using the view projection (not the user projection).\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center The center of the view.\n */\n setCenterInternal(center) {\n this.targetCenter_ = center;\n this.applyTargetState_();\n }\n\n /**\n * @param {import(\"./ViewHint.js\").default} hint Hint.\n * @param {number} delta Delta.\n * @return {number} New value.\n */\n setHint(hint, delta) {\n this.hints_[hint] += delta;\n this.changed();\n return this.hints_[hint];\n }\n\n /**\n * Set the resolution for this view. Any resolution constraint will apply.\n * @param {number|undefined} resolution The resolution of the view.\n * @observable\n * @api\n */\n setResolution(resolution) {\n this.targetResolution_ = resolution;\n this.applyTargetState_();\n }\n\n /**\n * Set the rotation for this view. Any rotation constraint will apply.\n * @param {number} rotation The rotation of the view in radians.\n * @observable\n * @api\n */\n setRotation(rotation) {\n this.targetRotation_ = rotation;\n this.applyTargetState_();\n }\n\n /**\n * Zoom to a specific zoom level. Any resolution constrain will apply.\n * @param {number} zoom Zoom level.\n * @api\n */\n setZoom(zoom) {\n this.setResolution(this.getResolutionForZoom(zoom));\n }\n\n /**\n * Recompute rotation/resolution/center based on target values.\n * Note: we have to compute rotation first, then resolution and center considering that\n * parameters can influence one another in case a view extent constraint is present.\n * @param {boolean} [doNotCancelAnims] Do not cancel animations.\n * @param {boolean} [forceMoving] Apply constraints as if the view is moving.\n * @private\n */\n applyTargetState_(doNotCancelAnims, forceMoving) {\n const isMoving =\n this.getAnimating() || this.getInteracting() || forceMoving;\n\n // compute rotation\n const newRotation = this.constraints_.rotation(\n this.targetRotation_,\n isMoving\n );\n const size = this.getViewportSize_(newRotation);\n const newResolution = this.constraints_.resolution(\n this.targetResolution_,\n 0,\n size,\n isMoving\n );\n const newCenter = this.constraints_.center(\n this.targetCenter_,\n newResolution,\n size,\n isMoving,\n this.calculateCenterShift(\n this.targetCenter_,\n newResolution,\n newRotation,\n size\n )\n );\n\n if (this.get(ViewProperty.ROTATION) !== newRotation) {\n this.set(ViewProperty.ROTATION, newRotation);\n }\n if (this.get(ViewProperty.RESOLUTION) !== newResolution) {\n this.set(ViewProperty.RESOLUTION, newResolution);\n this.set('zoom', this.getZoom(), true);\n }\n if (\n !newCenter ||\n !this.get(ViewProperty.CENTER) ||\n !equals(this.get(ViewProperty.CENTER), newCenter)\n ) {\n this.set(ViewProperty.CENTER, newCenter);\n }\n\n if (this.getAnimating() && !doNotCancelAnims) {\n this.cancelAnimations();\n }\n this.cancelAnchor_ = undefined;\n }\n\n /**\n * If any constraints need to be applied, an animation will be triggered.\n * This is typically done on interaction end.\n * Note: calling this with a duration of 0 will apply the constrained values straight away,\n * without animation.\n * @param {number} [duration] The animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n resolveConstraints(duration, resolutionDirection, anchor) {\n duration = duration !== undefined ? duration : 200;\n const direction = resolutionDirection || 0;\n\n const newRotation = this.constraints_.rotation(this.targetRotation_);\n const size = this.getViewportSize_(newRotation);\n const newResolution = this.constraints_.resolution(\n this.targetResolution_,\n direction,\n size\n );\n const newCenter = this.constraints_.center(\n this.targetCenter_,\n newResolution,\n size,\n false,\n this.calculateCenterShift(\n this.targetCenter_,\n newResolution,\n newRotation,\n size\n )\n );\n\n if (duration === 0 && !this.cancelAnchor_) {\n this.targetResolution_ = newResolution;\n this.targetRotation_ = newRotation;\n this.targetCenter_ = newCenter;\n this.applyTargetState_();\n return;\n }\n\n anchor = anchor || (duration === 0 ? this.cancelAnchor_ : undefined);\n this.cancelAnchor_ = undefined;\n\n if (\n this.getResolution() !== newResolution ||\n this.getRotation() !== newRotation ||\n !this.getCenterInternal() ||\n !equals(this.getCenterInternal(), newCenter)\n ) {\n if (this.getAnimating()) {\n this.cancelAnimations();\n }\n\n this.animateInternal({\n rotation: newRotation,\n center: newCenter,\n resolution: newResolution,\n duration: duration,\n easing: easeOut,\n anchor: anchor,\n });\n }\n }\n\n /**\n * Notify the View that an interaction has started.\n * The view state will be resolved to a stable one if needed\n * (depending on its constraints).\n * @api\n */\n beginInteraction() {\n this.resolveConstraints(0);\n\n this.setHint(ViewHint.INTERACTING, 1);\n }\n\n /**\n * Notify the View that an interaction has ended. The view state will be resolved\n * to a stable one if needed (depending on its constraints).\n * @param {number} [duration] Animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n endInteraction(duration, resolutionDirection, anchor) {\n anchor = anchor && fromUserCoordinate(anchor, this.getProjection());\n this.endInteractionInternal(duration, resolutionDirection, anchor);\n }\n\n /**\n * Notify the View that an interaction has ended. The view state will be resolved\n * to a stable one if needed (depending on its constraints).\n * @param {number} [duration] Animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n endInteractionInternal(duration, resolutionDirection, anchor) {\n if (!this.getInteracting()) {\n return;\n }\n this.setHint(ViewHint.INTERACTING, -1);\n this.resolveConstraints(duration, resolutionDirection, anchor);\n }\n\n /**\n * Get a valid position for the view center according to the current constraints.\n * @param {import(\"./coordinate.js\").Coordinate|undefined} targetCenter Target center position.\n * @param {number} [targetResolution] Target resolution. If not supplied, the current one will be used.\n * This is useful to guess a valid center position at a different zoom level.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Valid center position.\n */\n getConstrainedCenter(targetCenter, targetResolution) {\n const size = this.getViewportSize_(this.getRotation());\n return this.constraints_.center(\n targetCenter,\n targetResolution || this.getResolution(),\n size\n );\n }\n\n /**\n * Get a valid zoom level according to the current view constraints.\n * @param {number|undefined} targetZoom Target zoom.\n * @param {number} [direction=0] Indicate which resolution should be used\n * by a renderer if the view resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @return {number|undefined} Valid zoom level.\n */\n getConstrainedZoom(targetZoom, direction) {\n const targetRes = this.getResolutionForZoom(targetZoom);\n return this.getZoomForResolution(\n this.getConstrainedResolution(targetRes, direction)\n );\n }\n\n /**\n * Get a valid resolution according to the current view constraints.\n * @param {number|undefined} targetResolution Target resolution.\n * @param {number} [direction=0] Indicate which resolution should be used\n * by a renderer if the view resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @return {number|undefined} Valid resolution.\n */\n getConstrainedResolution(targetResolution, direction) {\n direction = direction || 0;\n const size = this.getViewportSize_(this.getRotation());\n\n return this.constraints_.resolution(targetResolution, direction, size);\n }\n}\n\n/**\n * @param {Function} callback Callback.\n * @param {*} returnValue Return value.\n */\nfunction animationCallback(callback, returnValue) {\n setTimeout(function () {\n callback(returnValue);\n }, 0);\n}\n\n/**\n * @param {ViewOptions} options View options.\n * @return {import(\"./centerconstraint.js\").Type} The constraint.\n */\nexport function createCenterConstraint(options) {\n if (options.extent !== undefined) {\n const smooth =\n options.smoothExtentConstraint !== undefined\n ? options.smoothExtentConstraint\n : true;\n return createExtent(options.extent, options.constrainOnlyCenter, smooth);\n }\n\n const projection = createProjection(options.projection, 'EPSG:3857');\n if (options.multiWorld !== true && projection.isGlobal()) {\n const extent = projection.getExtent().slice();\n extent[0] = -Infinity;\n extent[2] = Infinity;\n return createExtent(extent, false, false);\n }\n\n return centerNone;\n}\n\n/**\n * @param {ViewOptions} options View options.\n * @return {{constraint: import(\"./resolutionconstraint.js\").Type, maxResolution: number,\n * minResolution: number, minZoom: number, zoomFactor: number}} The constraint.\n */\nexport function createResolutionConstraint(options) {\n let resolutionConstraint;\n let maxResolution;\n let minResolution;\n\n // TODO: move these to be ol constants\n // see https://github.com/openlayers/openlayers/issues/2076\n const defaultMaxZoom = 28;\n const defaultZoomFactor = 2;\n\n let minZoom =\n options.minZoom !== undefined ? options.minZoom : DEFAULT_MIN_ZOOM;\n\n let maxZoom =\n options.maxZoom !== undefined ? options.maxZoom : defaultMaxZoom;\n\n const zoomFactor =\n options.zoomFactor !== undefined ? options.zoomFactor : defaultZoomFactor;\n\n const multiWorld =\n options.multiWorld !== undefined ? options.multiWorld : false;\n\n const smooth =\n options.smoothResolutionConstraint !== undefined\n ? options.smoothResolutionConstraint\n : true;\n\n const showFullExtent =\n options.showFullExtent !== undefined ? options.showFullExtent : false;\n\n const projection = createProjection(options.projection, 'EPSG:3857');\n const projExtent = projection.getExtent();\n let constrainOnlyCenter = options.constrainOnlyCenter;\n let extent = options.extent;\n if (!multiWorld && !extent && projection.isGlobal()) {\n constrainOnlyCenter = false;\n extent = projExtent;\n }\n\n if (options.resolutions !== undefined) {\n const resolutions = options.resolutions;\n maxResolution = resolutions[minZoom];\n minResolution =\n resolutions[maxZoom] !== undefined\n ? resolutions[maxZoom]\n : resolutions[resolutions.length - 1];\n\n if (options.constrainResolution) {\n resolutionConstraint = createSnapToResolutions(\n resolutions,\n smooth,\n !constrainOnlyCenter && extent,\n showFullExtent\n );\n } else {\n resolutionConstraint = createMinMaxResolution(\n maxResolution,\n minResolution,\n smooth,\n !constrainOnlyCenter && extent,\n showFullExtent\n );\n }\n } else {\n // calculate the default min and max resolution\n const size = !projExtent\n ? // use an extent that can fit the whole world if need be\n (360 * METERS_PER_UNIT.degrees) / projection.getMetersPerUnit()\n : Math.max(getWidth(projExtent), getHeight(projExtent));\n\n const defaultMaxResolution =\n size / DEFAULT_TILE_SIZE / Math.pow(defaultZoomFactor, DEFAULT_MIN_ZOOM);\n\n const defaultMinResolution =\n defaultMaxResolution /\n Math.pow(defaultZoomFactor, defaultMaxZoom - DEFAULT_MIN_ZOOM);\n\n // user provided maxResolution takes precedence\n maxResolution = options.maxResolution;\n if (maxResolution !== undefined) {\n minZoom = 0;\n } else {\n maxResolution = defaultMaxResolution / Math.pow(zoomFactor, minZoom);\n }\n\n // user provided minResolution takes precedence\n minResolution = options.minResolution;\n if (minResolution === undefined) {\n if (options.maxZoom !== undefined) {\n if (options.maxResolution !== undefined) {\n minResolution = maxResolution / Math.pow(zoomFactor, maxZoom);\n } else {\n minResolution = defaultMaxResolution / Math.pow(zoomFactor, maxZoom);\n }\n } else {\n minResolution = defaultMinResolution;\n }\n }\n\n // given discrete zoom levels, minResolution may be different than provided\n maxZoom =\n minZoom +\n Math.floor(\n Math.log(maxResolution / minResolution) / Math.log(zoomFactor)\n );\n minResolution = maxResolution / Math.pow(zoomFactor, maxZoom - minZoom);\n\n if (options.constrainResolution) {\n resolutionConstraint = createSnapToPower(\n zoomFactor,\n maxResolution,\n minResolution,\n smooth,\n !constrainOnlyCenter && extent,\n showFullExtent\n );\n } else {\n resolutionConstraint = createMinMaxResolution(\n maxResolution,\n minResolution,\n smooth,\n !constrainOnlyCenter && extent,\n showFullExtent\n );\n }\n }\n return {\n constraint: resolutionConstraint,\n maxResolution: maxResolution,\n minResolution: minResolution,\n minZoom: minZoom,\n zoomFactor: zoomFactor,\n };\n}\n\n/**\n * @param {ViewOptions} options View options.\n * @return {import(\"./rotationconstraint.js\").Type} Rotation constraint.\n */\nexport function createRotationConstraint(options) {\n const enableRotation =\n options.enableRotation !== undefined ? options.enableRotation : true;\n if (enableRotation) {\n const constrainRotation = options.constrainRotation;\n if (constrainRotation === undefined || constrainRotation === true) {\n return createSnapToZero();\n }\n if (constrainRotation === false) {\n return rotationNone;\n }\n if (typeof constrainRotation === 'number') {\n return createSnapToN(constrainRotation);\n }\n return rotationNone;\n }\n return disable;\n}\n\n/**\n * Determine if an animation involves no view change.\n * @param {Animation} animation The animation.\n * @return {boolean} The animation involves no view change.\n */\nexport function isNoopAnimation(animation) {\n if (animation.sourceCenter && animation.targetCenter) {\n if (!coordinatesEqual(animation.sourceCenter, animation.targetCenter)) {\n return false;\n }\n }\n if (animation.sourceResolution !== animation.targetResolution) {\n return false;\n }\n if (animation.sourceRotation !== animation.targetRotation) {\n return false;\n }\n return true;\n}\n\n/**\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"./size.js\").Size} size Box pixel size.\n * @param {import(\"./pixel.js\").Pixel} position Position on the view to center on.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @return {import(\"./coordinate.js\").Coordinate} Shifted center.\n */\nfunction calculateCenterOn(coordinate, size, position, resolution, rotation) {\n // calculate rotated position\n const cosAngle = Math.cos(-rotation);\n let sinAngle = Math.sin(-rotation);\n let rotX = coordinate[0] * cosAngle - coordinate[1] * sinAngle;\n let rotY = coordinate[1] * cosAngle + coordinate[0] * sinAngle;\n rotX += (size[0] / 2 - position[0]) * resolution;\n rotY += (position[1] - size[1] / 2) * resolution;\n\n // go back to original angle\n sinAngle = -sinAngle; // go back to original rotation\n const centerX = rotX * cosAngle - rotY * sinAngle;\n const centerY = rotY * cosAngle + rotX * sinAngle;\n\n return [centerX, centerY];\n}\n\nexport default View;\n", "/**\n * @module ol/layer/Layer\n */\nimport BaseLayer from './Base.js';\nimport EventType from '../events/EventType.js';\nimport LayerProperty from './Property.js';\nimport RenderEventType from '../render/EventType.js';\nimport View from '../View.js';\nimport {assert} from '../asserts.js';\nimport {intersects} from '../extent.js';\nimport {listen, unlistenByKey} from '../events.js';\n\n/**\n * @typedef {function(import(\"../Map.js\").FrameState):HTMLElement} RenderFunction\n */\n\n/**\n * @typedef {'sourceready'|'change:source'} LayerEventType\n */\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature &\n * import(\"../Observable\").CombinedOnSignature} LayerOnSignature\n */\n\n/**\n * @template {import(\"../source/Source.js\").default} [SourceType=import(\"../source/Source.js\").default]\n * @typedef {Object} Options\n * @property {string} [className='ol-layer'] A CSS class name to set to the layer element.\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import(\"../extent.js\").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {SourceType} [source] Source for this layer. If not provided to the constructor,\n * the source can be set by calling {@link module:ol/layer/Layer~Layer#setSource layer.setSource(source)} after\n * construction.\n * @property {import(\"../Map.js\").default|null} [map] Map.\n * @property {RenderFunction} [render] Render function. Takes the frame state as input and is expected to return an\n * HTML element. Will overwrite the default rendering for the layer.\n * @property {Object} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @typedef {Object} State\n * @property {import(\"./Layer.js\").default} layer Layer.\n * @property {number} opacity Opacity, the value is rounded to two digits to appear after the decimal point.\n * @property {boolean} visible Visible.\n * @property {boolean} managed Managed.\n * @property {import(\"../extent.js\").Extent} [extent] Extent.\n * @property {number} zIndex ZIndex.\n * @property {number} maxResolution Maximum resolution.\n * @property {number} minResolution Minimum resolution.\n * @property {number} minZoom Minimum zoom.\n * @property {number} maxZoom Maximum zoom.\n */\n\n/**\n * @classdesc\n * Base class from which all layer types are derived. This should only be instantiated\n * in the case where a custom layer is added to the map with a custom `render` function.\n * Such a function can be specified in the `options` object, and is expected to return an HTML element.\n *\n * A visual representation of raster or vector map data.\n * Layers group together those properties that pertain to how the data is to be\n * displayed, irrespective of the source of that data.\n *\n * Layers are usually added to a map with [map.addLayer()]{@link import(\"../Map.js\").default#addLayer}.\n * Components like {@link module:ol/interaction/Draw~Draw} use unmanaged layers\n * internally. These unmanaged layers are associated with the map using\n * [layer.setMap()]{@link module:ol/layer/Layer~Layer#setMap} instead.\n *\n * A generic `change` event is fired when the state of the source changes.\n * A `sourceready` event is fired when the layer's source is ready.\n *\n * @fires import(\"../render/Event.js\").RenderEvent#prerender\n * @fires import(\"../render/Event.js\").RenderEvent#postrender\n * @fires import(\"../events/Event.js\").BaseEvent#sourceready\n *\n * @template {import(\"../source/Source.js\").default} [SourceType=import(\"../source/Source.js\").default]\n * @template {import(\"../renderer/Layer.js\").default} [RendererType=import(\"../renderer/Layer.js\").default]\n * @api\n */\nclass Layer extends BaseLayer {\n /**\n * @param {Options} options Layer options.\n */\n constructor(options) {\n const baseOptions = Object.assign({}, options);\n delete baseOptions.source;\n\n super(baseOptions);\n\n /***\n * @type {LayerOnSignature}\n */\n this.on;\n\n /***\n * @type {LayerOnSignature}\n */\n this.once;\n\n /***\n * @type {LayerOnSignature}\n */\n this.un;\n\n /**\n * @private\n * @type {?import(\"../events.js\").EventsKey}\n */\n this.mapPrecomposeKey_ = null;\n\n /**\n * @private\n * @type {?import(\"../events.js\").EventsKey}\n */\n this.mapRenderKey_ = null;\n\n /**\n * @private\n * @type {?import(\"../events.js\").EventsKey}\n */\n this.sourceChangeKey_ = null;\n\n /**\n * @private\n * @type {RendererType}\n */\n this.renderer_ = null;\n\n /**\n * @private\n * @type {boolean}\n */\n this.sourceReady_ = false;\n\n /**\n * @protected\n * @type {boolean}\n */\n this.rendered = false;\n\n // Overwrite default render method with a custom one\n if (options.render) {\n this.render = options.render;\n }\n\n if (options.map) {\n this.setMap(options.map);\n }\n\n this.addChangeListener(\n LayerProperty.SOURCE,\n this.handleSourcePropertyChange_\n );\n\n const source = options.source\n ? /** @type {SourceType} */ (options.source)\n : null;\n this.setSource(source);\n }\n\n /**\n * @param {Array} [array] Array of layers (to be modified in place).\n * @return {Array} Array of layers.\n */\n getLayersArray(array) {\n array = array ? array : [];\n array.push(this);\n return array;\n }\n\n /**\n * @param {Array} [states] Optional list of layer states (to be modified in place).\n * @return {Array} List of layer states.\n */\n getLayerStatesArray(states) {\n states = states ? states : [];\n states.push(this.getLayerState());\n return states;\n }\n\n /**\n * Get the layer source.\n * @return {SourceType|null} The layer source (or `null` if not yet set).\n * @observable\n * @api\n */\n getSource() {\n return /** @type {SourceType} */ (this.get(LayerProperty.SOURCE)) || null;\n }\n\n /**\n * @return {SourceType|null} The source being rendered.\n */\n getRenderSource() {\n return this.getSource();\n }\n\n /**\n * @return {import(\"../source/Source.js\").State} Source state.\n */\n getSourceState() {\n const source = this.getSource();\n return !source ? 'undefined' : source.getState();\n }\n\n /**\n * @private\n */\n handleSourceChange_() {\n this.changed();\n if (this.sourceReady_ || this.getSource().getState() !== 'ready') {\n return;\n }\n this.sourceReady_ = true;\n this.dispatchEvent('sourceready');\n }\n\n /**\n * @private\n */\n handleSourcePropertyChange_() {\n if (this.sourceChangeKey_) {\n unlistenByKey(this.sourceChangeKey_);\n this.sourceChangeKey_ = null;\n }\n this.sourceReady_ = false;\n const source = this.getSource();\n if (source) {\n this.sourceChangeKey_ = listen(\n source,\n EventType.CHANGE,\n this.handleSourceChange_,\n this\n );\n if (source.getState() === 'ready') {\n this.sourceReady_ = true;\n setTimeout(() => {\n this.dispatchEvent('sourceready');\n }, 0);\n }\n }\n this.changed();\n }\n\n /**\n * @param {import(\"../pixel\").Pixel} pixel Pixel.\n * @return {Promise>} Promise that resolves with\n * an array of features.\n */\n getFeatures(pixel) {\n if (!this.renderer_) {\n return Promise.resolve([]);\n }\n return this.renderer_.getFeatures(pixel);\n }\n\n /**\n * @param {import(\"../pixel\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.\n */\n getData(pixel) {\n if (!this.renderer_ || !this.rendered) {\n return null;\n }\n return this.renderer_.getData(pixel);\n }\n\n /**\n * The layer is visible on the map view, i.e. within its min/max resolution or zoom and\n * extent, not set to `visible: false`, and not inside a layer group that is set\n * to `visible: false`.\n * @param {View|import(\"../View.js\").ViewStateLayerStateExtent} [view] View or {@link import(\"../Map.js\").FrameState}.\n * Only required when the layer is not added to a map.\n * @return {boolean} The layer is visible in the map view.\n * @api\n */\n isVisible(view) {\n let frameState;\n const map = this.getMapInternal();\n if (!view && map) {\n view = map.getView();\n }\n if (view instanceof View) {\n frameState = {\n viewState: view.getState(),\n extent: view.calculateExtent(),\n };\n } else {\n frameState = view;\n }\n if (!frameState.layerStatesArray && map) {\n frameState.layerStatesArray = map.getLayerGroup().getLayerStatesArray();\n }\n let layerState;\n if (frameState.layerStatesArray) {\n layerState = frameState.layerStatesArray.find(\n (layerState) => layerState.layer === this\n );\n } else {\n layerState = this.getLayerState();\n }\n\n const layerExtent = this.getExtent();\n\n return (\n inView(layerState, frameState.viewState) &&\n (!layerExtent || intersects(layerExtent, frameState.extent))\n );\n }\n\n /**\n * Get the attributions of the source of this layer for the given view.\n * @param {View|import(\"../View.js\").ViewStateLayerStateExtent} [view] View or {@link import(\"../Map.js\").FrameState}.\n * Only required when the layer is not added to a map.\n * @return {Array} Attributions for this layer at the given view.\n * @api\n */\n getAttributions(view) {\n if (!this.isVisible(view)) {\n return [];\n }\n let getAttributions;\n const source = this.getSource();\n if (source) {\n getAttributions = source.getAttributions();\n }\n if (!getAttributions) {\n return [];\n }\n const frameState =\n view instanceof View ? view.getViewStateAndExtent() : view;\n let attributions = getAttributions(frameState);\n if (!Array.isArray(attributions)) {\n attributions = [attributions];\n }\n return attributions;\n }\n\n /**\n * In charge to manage the rendering of the layer. One layer type is\n * bounded with one layer renderer.\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target which the renderer may (but need not) use\n * for rendering its content.\n * @return {HTMLElement|null} The rendered element.\n */\n render(frameState, target) {\n const layerRenderer = this.getRenderer();\n\n if (layerRenderer.prepareFrame(frameState)) {\n this.rendered = true;\n return layerRenderer.renderFrame(frameState, target);\n }\n return null;\n }\n\n /**\n * Called when a layer is not visible during a map render.\n */\n unrender() {\n this.rendered = false;\n }\n\n /**\n * For use inside the library only.\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMapInternal(map) {\n if (!map) {\n this.unrender();\n }\n this.set(LayerProperty.MAP, map);\n }\n\n /**\n * For use inside the library only.\n * @return {import(\"../Map.js\").default|null} Map.\n */\n getMapInternal() {\n return this.get(LayerProperty.MAP);\n }\n\n /**\n * Sets the layer to be rendered on top of other layers on a map. The map will\n * not manage this layer in its layers collection. This\n * is useful for temporary layers. To remove an unmanaged layer from the map,\n * use `#setMap(null)`.\n *\n * To add the layer to a map and have it managed by the map, use\n * {@link module:ol/Map~Map#addLayer} instead.\n * @param {import(\"../Map.js\").default|null} map Map.\n * @api\n */\n setMap(map) {\n if (this.mapPrecomposeKey_) {\n unlistenByKey(this.mapPrecomposeKey_);\n this.mapPrecomposeKey_ = null;\n }\n if (!map) {\n this.changed();\n }\n if (this.mapRenderKey_) {\n unlistenByKey(this.mapRenderKey_);\n this.mapRenderKey_ = null;\n }\n if (map) {\n this.mapPrecomposeKey_ = listen(\n map,\n RenderEventType.PRECOMPOSE,\n function (evt) {\n const renderEvent =\n /** @type {import(\"../render/Event.js\").default} */ (evt);\n const layerStatesArray = renderEvent.frameState.layerStatesArray;\n const layerState = this.getLayerState(false);\n // A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both.\n assert(\n !layerStatesArray.some(function (arrayLayerState) {\n return arrayLayerState.layer === layerState.layer;\n }),\n 67\n );\n layerStatesArray.push(layerState);\n },\n this\n );\n this.mapRenderKey_ = listen(this, EventType.CHANGE, map.render, map);\n this.changed();\n }\n }\n\n /**\n * Set the layer source.\n * @param {SourceType|null} source The layer source.\n * @observable\n * @api\n */\n setSource(source) {\n this.set(LayerProperty.SOURCE, source);\n }\n\n /**\n * Get the renderer for this layer.\n * @return {RendererType|null} The layer renderer.\n */\n getRenderer() {\n if (!this.renderer_) {\n this.renderer_ = this.createRenderer();\n }\n return this.renderer_;\n }\n\n /**\n * @return {boolean} The layer has a renderer.\n */\n hasRenderer() {\n return !!this.renderer_;\n }\n\n /**\n * Create a renderer for this layer.\n * @return {RendererType} A layer renderer.\n * @protected\n */\n createRenderer() {\n return null;\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n if (this.renderer_) {\n this.renderer_.dispose();\n delete this.renderer_;\n }\n\n this.setSource(null);\n super.disposeInternal();\n }\n}\n\n/**\n * Return `true` if the layer is visible and if the provided view state\n * has resolution and zoom levels that are in range of the layer's min/max.\n * @param {State} layerState Layer state.\n * @param {import(\"../View.js\").State} viewState View state.\n * @return {boolean} The layer is visible at the given view state.\n */\nexport function inView(layerState, viewState) {\n if (!layerState.visible) {\n return false;\n }\n const resolution = viewState.resolution;\n if (\n resolution < layerState.minResolution ||\n resolution >= layerState.maxResolution\n ) {\n return false;\n }\n const zoom = viewState.zoom;\n return zoom > layerState.minZoom && zoom <= layerState.maxZoom;\n}\n\nexport default Layer;\n", "/**\n * @module ol/renderer/Map\n */\nimport Disposable from '../Disposable.js';\nimport {TRUE} from '../functions.js';\nimport {abstract} from '../util.js';\nimport {compose as composeTransform, makeInverse} from '../transform.js';\nimport {getWidth} from '../extent.js';\nimport {shared as iconImageCache} from '../style/IconImageCache.js';\nimport {inView} from '../layer/Layer.js';\nimport {wrapX} from '../coordinate.js';\n\n/**\n * @template T\n * @typedef HitMatch\n * @property {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @property {import(\"../layer/Layer.js\").default} layer Layer.\n * @property {import(\"../geom/SimpleGeometry.js\").default} geometry Geometry.\n * @property {number} distanceSq Squared distance.\n * @property {import(\"./vector.js\").FeatureCallback} callback Callback.\n */\n\n/**\n * @abstract\n */\nclass MapRenderer extends Disposable {\n /**\n * @param {import(\"../Map.js\").default} map Map.\n */\n constructor(map) {\n super();\n\n /**\n * @private\n * @type {import(\"../Map.js\").default}\n */\n this.map_ = map;\n }\n\n /**\n * @abstract\n * @param {import(\"../render/EventType.js\").default} type Event type.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n dispatchRenderEvent(type, frameState) {\n abstract();\n }\n\n /**\n * @param {import(\"../Map.js\").FrameState} frameState FrameState.\n * @protected\n */\n calculateMatrices2D(frameState) {\n const viewState = frameState.viewState;\n const coordinateToPixelTransform = frameState.coordinateToPixelTransform;\n const pixelToCoordinateTransform = frameState.pixelToCoordinateTransform;\n\n composeTransform(\n coordinateToPixelTransform,\n frameState.size[0] / 2,\n frameState.size[1] / 2,\n 1 / viewState.resolution,\n -1 / viewState.resolution,\n -viewState.rotation,\n -viewState.center[0],\n -viewState.center[1]\n );\n\n makeInverse(pixelToCoordinateTransform, coordinateToPixelTransform);\n }\n\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"../Map.js\").FrameState} frameState FrameState.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {boolean} checkWrapped Check for wrapped geometries.\n * @param {import(\"./vector.js\").FeatureCallback} callback Feature callback.\n * @param {S} thisArg Value to use as `this` when executing `callback`.\n * @param {function(this: U, import(\"../layer/Layer.js\").default): boolean} layerFilter Layer filter\n * function, only layers which are visible and for which this function\n * returns `true` will be tested for features. By default, all visible\n * layers will be tested.\n * @param {U} thisArg2 Value to use as `this` when executing `layerFilter`.\n * @return {T|undefined} Callback result.\n * @template S,T,U\n */\n forEachFeatureAtCoordinate(\n coordinate,\n frameState,\n hitTolerance,\n checkWrapped,\n callback,\n thisArg,\n layerFilter,\n thisArg2\n ) {\n let result;\n const viewState = frameState.viewState;\n\n /**\n * @param {boolean} managed Managed layer.\n * @param {import(\"../Feature.js\").FeatureLike} feature Feature.\n * @param {import(\"../layer/Layer.js\").default} layer Layer.\n * @param {import(\"../geom/Geometry.js\").default} geometry Geometry.\n * @return {T|undefined} Callback result.\n */\n function forEachFeatureAtCoordinate(managed, feature, layer, geometry) {\n return callback.call(thisArg, feature, managed ? layer : null, geometry);\n }\n\n const projection = viewState.projection;\n\n const translatedCoordinate = wrapX(coordinate.slice(), projection);\n const offsets = [[0, 0]];\n if (projection.canWrapX() && checkWrapped) {\n const projectionExtent = projection.getExtent();\n const worldWidth = getWidth(projectionExtent);\n offsets.push([-worldWidth, 0], [worldWidth, 0]);\n }\n\n const layerStates = frameState.layerStatesArray;\n const numLayers = layerStates.length;\n\n const matches = /** @type {Array>} */ ([]);\n const tmpCoord = [];\n for (let i = 0; i < offsets.length; i++) {\n for (let j = numLayers - 1; j >= 0; --j) {\n const layerState = layerStates[j];\n const layer = layerState.layer;\n if (\n layer.hasRenderer() &&\n inView(layerState, viewState) &&\n layerFilter.call(thisArg2, layer)\n ) {\n const layerRenderer = layer.getRenderer();\n const source = layer.getSource();\n if (layerRenderer && source) {\n const coordinates = source.getWrapX()\n ? translatedCoordinate\n : coordinate;\n const callback = forEachFeatureAtCoordinate.bind(\n null,\n layerState.managed\n );\n tmpCoord[0] = coordinates[0] + offsets[i][0];\n tmpCoord[1] = coordinates[1] + offsets[i][1];\n result = layerRenderer.forEachFeatureAtCoordinate(\n tmpCoord,\n frameState,\n hitTolerance,\n callback,\n matches\n );\n }\n if (result) {\n return result;\n }\n }\n }\n }\n if (matches.length === 0) {\n return undefined;\n }\n const order = 1 / matches.length;\n matches.forEach((m, i) => (m.distanceSq += i * order));\n matches.sort((a, b) => a.distanceSq - b.distanceSq);\n matches.some((m) => {\n return (result = m.callback(m.feature, m.layer, m.geometry));\n });\n return result;\n }\n\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"../Map.js\").FrameState} frameState FrameState.\n * @param {number} hitTolerance Hit tolerance in pixels.\n * @param {boolean} checkWrapped Check for wrapped geometries.\n * @param {function(this: U, import(\"../layer/Layer.js\").default): boolean} layerFilter Layer filter\n * function, only layers which are visible and for which this function\n * returns `true` will be tested for features. By default, all visible\n * layers will be tested.\n * @param {U} thisArg Value to use as `this` when executing `layerFilter`.\n * @return {boolean} Is there a feature at the given coordinate?\n * @template U\n */\n hasFeatureAtCoordinate(\n coordinate,\n frameState,\n hitTolerance,\n checkWrapped,\n layerFilter,\n thisArg\n ) {\n const hasFeature = this.forEachFeatureAtCoordinate(\n coordinate,\n frameState,\n hitTolerance,\n checkWrapped,\n TRUE,\n this,\n layerFilter,\n thisArg\n );\n\n return hasFeature !== undefined;\n }\n\n /**\n * @return {import(\"../Map.js\").default} Map.\n */\n getMap() {\n return this.map_;\n }\n\n /**\n * Render.\n * @abstract\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n */\n renderFrame(frameState) {\n abstract();\n }\n\n /**\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n flushDeclutterItems(frameState) {}\n\n /**\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @protected\n */\n scheduleExpireIconCache(frameState) {\n if (iconImageCache.canExpireCache()) {\n frameState.postRenderFunctions.push(expireIconCache);\n }\n }\n}\n\n/**\n * @param {import(\"../Map.js\").default} map Map.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\nfunction expireIconCache(map, frameState) {\n iconImageCache.expire();\n}\n\nexport default MapRenderer;\n", "/**\n * @module ol/render/Event\n */\n\nimport Event from '../events/Event.js';\n\nclass RenderEvent extends Event {\n /**\n * @param {import(\"./EventType.js\").default} type Type.\n * @param {import(\"../transform.js\").Transform} [inversePixelTransform] Transform for\n * CSS pixels to rendered pixels.\n * @param {import(\"../Map.js\").FrameState} [frameState] Frame state.\n * @param {?(CanvasRenderingContext2D|WebGLRenderingContext)} [context] Context.\n */\n constructor(type, inversePixelTransform, frameState, context) {\n super(type);\n\n /**\n * Transform from CSS pixels (relative to the top-left corner of the map viewport)\n * to rendered pixels on this event's `context`. Only available when a Canvas renderer is used, null otherwise.\n * @type {import(\"../transform.js\").Transform|undefined}\n * @api\n */\n this.inversePixelTransform = inversePixelTransform;\n\n /**\n * An object representing the current render frame state.\n * @type {import(\"../Map.js\").FrameState|undefined}\n * @api\n */\n this.frameState = frameState;\n\n /**\n * Canvas context. Not available when the event is dispatched by the map. For Canvas 2D layers,\n * the context will be the 2D rendering context. For WebGL layers, the context will be the WebGL\n * context.\n * @type {CanvasRenderingContext2D|WebGLRenderingContext|undefined}\n * @api\n */\n this.context = context;\n }\n}\n\nexport default RenderEvent;\n", "/**\n * @module ol/css\n */\n\n/**\n * @typedef {Object} FontParameters\n * @property {string} style Style.\n * @property {string} variant Variant.\n * @property {string} weight Weight.\n * @property {string} size Size.\n * @property {string} lineHeight LineHeight.\n * @property {string} family Family.\n * @property {Array} families Families.\n */\n\n/**\n * The CSS class for hidden feature.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_HIDDEN = 'ol-hidden';\n\n/**\n * The CSS class that we'll give the DOM elements to have them selectable.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_SELECTABLE = 'ol-selectable';\n\n/**\n * The CSS class that we'll give the DOM elements to have them unselectable.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_UNSELECTABLE = 'ol-unselectable';\n\n/**\n * The CSS class for unsupported feature.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_UNSUPPORTED = 'ol-unsupported';\n\n/**\n * The CSS class for controls.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_CONTROL = 'ol-control';\n\n/**\n * The CSS class that we'll give the DOM elements that are collapsed, i.e.\n * to those elements which usually can be expanded.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_COLLAPSED = 'ol-collapsed';\n\n/**\n * From https://stackoverflow.com/questions/10135697/regex-to-parse-any-css-font\n * @type {RegExp}\n */\nconst fontRegEx = new RegExp(\n [\n '^\\\\s*(?=(?:(?:[-a-z]+\\\\s*){0,2}(italic|oblique))?)',\n '(?=(?:(?:[-a-z]+\\\\s*){0,2}(small-caps))?)',\n '(?=(?:(?:[-a-z]+\\\\s*){0,2}(bold(?:er)?|lighter|[1-9]00 ))?)',\n '(?:(?:normal|\\\\1|\\\\2|\\\\3)\\\\s*){0,3}((?:xx?-)?',\n '(?:small|large)|medium|smaller|larger|[\\\\.\\\\d]+(?:\\\\%|in|[cem]m|ex|p[ctx]))',\n '(?:\\\\s*\\\\/\\\\s*(normal|[\\\\.\\\\d]+(?:\\\\%|in|[cem]m|ex|p[ctx])?))',\n '?\\\\s*([-,\\\\\"\\\\\\'\\\\sa-z]+?)\\\\s*$',\n ].join(''),\n 'i'\n);\nconst fontRegExMatchIndex = [\n 'style',\n 'variant',\n 'weight',\n 'size',\n 'lineHeight',\n 'family',\n];\n\n/**\n * Get the list of font families from a font spec. Note that this doesn't work\n * for font families that have commas in them.\n * @param {string} fontSpec The CSS font property.\n * @return {FontParameters|null} The font parameters (or null if the input spec is invalid).\n */\nexport const getFontParameters = function (fontSpec) {\n const match = fontSpec.match(fontRegEx);\n if (!match) {\n return null;\n }\n const style = /** @type {FontParameters} */ ({\n lineHeight: 'normal',\n size: '1.2em',\n style: 'normal',\n weight: 'normal',\n variant: 'normal',\n });\n for (let i = 0, ii = fontRegExMatchIndex.length; i < ii; ++i) {\n const value = match[i + 1];\n if (value !== undefined) {\n style[fontRegExMatchIndex[i]] = value;\n }\n }\n style.families = style.family.split(/,\\s?/);\n return style;\n};\n", "import {WORKER_OFFSCREEN_CANVAS} from './has.js';\n\n/**\n * @module ol/dom\n */\n\n//FIXME Move this function to the canvas module\n/**\n * Create an html canvas element and returns its 2d context.\n * @param {number} [width] Canvas width.\n * @param {number} [height] Canvas height.\n * @param {Array} [canvasPool] Canvas pool to take existing canvas from.\n * @param {CanvasRenderingContext2DSettings} [settings] CanvasRenderingContext2DSettings\n * @return {CanvasRenderingContext2D} The context.\n */\nexport function createCanvasContext2D(width, height, canvasPool, settings) {\n /** @type {HTMLCanvasElement|OffscreenCanvas} */\n let canvas;\n if (canvasPool && canvasPool.length) {\n canvas = canvasPool.shift();\n } else if (WORKER_OFFSCREEN_CANVAS) {\n canvas = new OffscreenCanvas(width || 300, height || 300);\n } else {\n canvas = document.createElement('canvas');\n }\n if (width) {\n canvas.width = width;\n }\n if (height) {\n canvas.height = height;\n }\n //FIXME Allow OffscreenCanvasRenderingContext2D as return type\n return /** @type {CanvasRenderingContext2D} */ (\n canvas.getContext('2d', settings)\n );\n}\n\n/**\n * Releases canvas memory to avoid exceeding memory limits in Safari.\n * See https://pqina.nl/blog/total-canvas-memory-use-exceeds-the-maximum-limit/\n * @param {CanvasRenderingContext2D} context Context.\n */\nexport function releaseCanvas(context) {\n const canvas = context.canvas;\n canvas.width = 1;\n canvas.height = 1;\n context.clearRect(0, 0, 1, 1);\n}\n\n/**\n * Get the current computed width for the given element including margin,\n * padding and border.\n * Equivalent to jQuery's `$(el).outerWidth(true)`.\n * @param {!HTMLElement} element Element.\n * @return {number} The width.\n */\nexport function outerWidth(element) {\n let width = element.offsetWidth;\n const style = getComputedStyle(element);\n width += parseInt(style.marginLeft, 10) + parseInt(style.marginRight, 10);\n\n return width;\n}\n\n/**\n * Get the current computed height for the given element including margin,\n * padding and border.\n * Equivalent to jQuery's `$(el).outerHeight(true)`.\n * @param {!HTMLElement} element Element.\n * @return {number} The height.\n */\nexport function outerHeight(element) {\n let height = element.offsetHeight;\n const style = getComputedStyle(element);\n height += parseInt(style.marginTop, 10) + parseInt(style.marginBottom, 10);\n\n return height;\n}\n\n/**\n * @param {Node} newNode Node to replace old node\n * @param {Node} oldNode The node to be replaced\n */\nexport function replaceNode(newNode, oldNode) {\n const parent = oldNode.parentNode;\n if (parent) {\n parent.replaceChild(newNode, oldNode);\n }\n}\n\n/**\n * @param {Node} node The node to remove.\n * @return {Node|null} The node that was removed or null.\n */\nexport function removeNode(node) {\n return node && node.parentNode ? node.parentNode.removeChild(node) : null;\n}\n\n/**\n * @param {Node} node The node to remove the children from.\n */\nexport function removeChildren(node) {\n while (node.lastChild) {\n node.removeChild(node.lastChild);\n }\n}\n\n/**\n * Transform the children of a parent node so they match the\n * provided list of children. This function aims to efficiently\n * remove, add, and reorder child nodes while maintaining a simple\n * implementation (it is not guaranteed to minimize DOM operations).\n * @param {Node} node The parent node whose children need reworking.\n * @param {Array} children The desired children.\n */\nexport function replaceChildren(node, children) {\n const oldChildren = node.childNodes;\n\n for (let i = 0; true; ++i) {\n const oldChild = oldChildren[i];\n const newChild = children[i];\n\n // check if our work is done\n if (!oldChild && !newChild) {\n break;\n }\n\n // check if children match\n if (oldChild === newChild) {\n continue;\n }\n\n // check if a new child needs to be added\n if (!oldChild) {\n node.appendChild(newChild);\n continue;\n }\n\n // check if an old child needs to be removed\n if (!newChild) {\n node.removeChild(oldChild);\n --i;\n continue;\n }\n\n // reorder\n node.insertBefore(newChild, oldChild);\n }\n}\n", "/**\n * @module ol/render/canvas\n */\nimport BaseObject from '../Object.js';\nimport {WORKER_OFFSCREEN_CANVAS} from '../has.js';\nimport {clear} from '../obj.js';\nimport {createCanvasContext2D} from '../dom.js';\nimport {getFontParameters} from '../css.js';\n\n/**\n * @typedef {'Circle' | 'Image' | 'LineString' | 'Polygon' | 'Text' | 'Default'} BuilderType\n */\n\n/**\n * @typedef {Object} FillState\n * @property {import(\"../colorlike.js\").ColorLike} fillStyle FillStyle.\n */\n\n/**\n * @typedef Label\n * @property {number} width Width.\n * @property {number} height Height.\n * @property {Array} contextInstructions ContextInstructions.\n */\n\n/**\n * @typedef {Object} FillStrokeState\n * @property {import(\"../colorlike.js\").ColorLike} [currentFillStyle] Current FillStyle.\n * @property {import(\"../colorlike.js\").ColorLike} [currentStrokeStyle] Current StrokeStyle.\n * @property {CanvasLineCap} [currentLineCap] Current LineCap.\n * @property {Array} currentLineDash Current LineDash.\n * @property {number} [currentLineDashOffset] Current LineDashOffset.\n * @property {CanvasLineJoin} [currentLineJoin] Current LineJoin.\n * @property {number} [currentLineWidth] Current LineWidth.\n * @property {number} [currentMiterLimit] Current MiterLimit.\n * @property {number} [lastStroke] Last stroke.\n * @property {import(\"../colorlike.js\").ColorLike} [fillStyle] FillStyle.\n * @property {import(\"../colorlike.js\").ColorLike} [strokeStyle] StrokeStyle.\n * @property {CanvasLineCap} [lineCap] LineCap.\n * @property {Array} lineDash LineDash.\n * @property {number} [lineDashOffset] LineDashOffset.\n * @property {CanvasLineJoin} [lineJoin] LineJoin.\n * @property {number} [lineWidth] LineWidth.\n * @property {number} [miterLimit] MiterLimit.\n */\n\n/**\n * @typedef {Object} StrokeState\n * @property {CanvasLineCap} lineCap LineCap.\n * @property {Array} lineDash LineDash.\n * @property {number} lineDashOffset LineDashOffset.\n * @property {CanvasLineJoin} lineJoin LineJoin.\n * @property {number} lineWidth LineWidth.\n * @property {number} miterLimit MiterLimit.\n * @property {import(\"../colorlike.js\").ColorLike} strokeStyle StrokeStyle.\n */\n\n/**\n * @typedef {Object} TextState\n * @property {string} font Font.\n * @property {CanvasTextAlign} [textAlign] TextAlign.\n * @property {number} [repeat] Repeat.\n * @property {import(\"../style/Text.js\").TextJustify} [justify] Justify.\n * @property {CanvasTextBaseline} textBaseline TextBaseline.\n * @property {import(\"../style/Text.js\").TextPlacement} [placement] Placement.\n * @property {number} [maxAngle] MaxAngle.\n * @property {boolean} [overflow] Overflow.\n * @property {import(\"../style/Fill.js\").default} [backgroundFill] BackgroundFill.\n * @property {import(\"../style/Stroke.js\").default} [backgroundStroke] BackgroundStroke.\n * @property {import(\"../size.js\").Size} [scale] Scale.\n * @property {Array} [padding] Padding.\n */\n\n/**\n * @typedef {Object} SerializableInstructions\n * @property {Array<*>} instructions The rendering instructions.\n * @property {Array<*>} hitDetectionInstructions The rendering hit detection instructions.\n * @property {Array} coordinates The array of all coordinates.\n * @property {!Object} [textStates] The text states (decluttering).\n * @property {!Object} [fillStates] The fill states (decluttering).\n * @property {!Object} [strokeStates] The stroke states (decluttering).\n */\n\n/**\n * @typedef {Object} DeclutterImageWithText\n */\n\n/**\n * @const\n * @type {string}\n */\nexport const defaultFont = '10px sans-serif';\n\n/**\n * @const\n * @type {string}\n */\nexport const defaultFillStyle = '#000';\n\n/**\n * @const\n * @type {CanvasLineCap}\n */\nexport const defaultLineCap = 'round';\n\n/**\n * @const\n * @type {Array}\n */\nexport const defaultLineDash = [];\n\n/**\n * @const\n * @type {number}\n */\nexport const defaultLineDashOffset = 0;\n\n/**\n * @const\n * @type {CanvasLineJoin}\n */\nexport const defaultLineJoin = 'round';\n\n/**\n * @const\n * @type {number}\n */\nexport const defaultMiterLimit = 10;\n\n/**\n * @const\n * @type {import(\"../colorlike.js\").ColorLike}\n */\nexport const defaultStrokeStyle = '#000';\n\n/**\n * @const\n * @type {CanvasTextAlign}\n */\nexport const defaultTextAlign = 'center';\n\n/**\n * @const\n * @type {CanvasTextBaseline}\n */\nexport const defaultTextBaseline = 'middle';\n\n/**\n * @const\n * @type {Array}\n */\nexport const defaultPadding = [0, 0, 0, 0];\n\n/**\n * @const\n * @type {number}\n */\nexport const defaultLineWidth = 1;\n\n/**\n * @type {BaseObject}\n */\nexport const checkedFonts = new BaseObject();\n\n/**\n * @type {CanvasRenderingContext2D}\n */\nlet measureContext = null;\n\n/**\n * @type {string}\n */\nlet measureFont;\n\n/**\n * @type {!Object}\n */\nexport const textHeights = {};\n\n/**\n * Clears the label cache when a font becomes available.\n * @param {string} fontSpec CSS font spec.\n */\nexport const registerFont = (function () {\n const retries = 100;\n const size = '32px ';\n const referenceFonts = ['monospace', 'serif'];\n const len = referenceFonts.length;\n const text = 'wmytzilWMYTZIL@#/&?$%10\\uF013';\n let interval, referenceWidth;\n\n /**\n * @param {string} fontStyle Css font-style\n * @param {string} fontWeight Css font-weight\n * @param {*} fontFamily Css font-family\n * @return {boolean} Font with style and weight is available\n */\n function isAvailable(fontStyle, fontWeight, fontFamily) {\n let available = true;\n for (let i = 0; i < len; ++i) {\n const referenceFont = referenceFonts[i];\n referenceWidth = measureTextWidth(\n fontStyle + ' ' + fontWeight + ' ' + size + referenceFont,\n text\n );\n if (fontFamily != referenceFont) {\n const width = measureTextWidth(\n fontStyle +\n ' ' +\n fontWeight +\n ' ' +\n size +\n fontFamily +\n ',' +\n referenceFont,\n text\n );\n // If width and referenceWidth are the same, then the fallback was used\n // instead of the font we wanted, so the font is not available.\n available = available && width != referenceWidth;\n }\n }\n if (available) {\n return true;\n }\n return false;\n }\n\n function check() {\n let done = true;\n const fonts = checkedFonts.getKeys();\n for (let i = 0, ii = fonts.length; i < ii; ++i) {\n const font = fonts[i];\n if (checkedFonts.get(font) < retries) {\n if (isAvailable.apply(this, font.split('\\n'))) {\n clear(textHeights);\n // Make sure that loaded fonts are picked up by Safari\n measureContext = null;\n measureFont = undefined;\n checkedFonts.set(font, retries);\n } else {\n checkedFonts.set(font, checkedFonts.get(font) + 1, true);\n done = false;\n }\n }\n }\n if (done) {\n clearInterval(interval);\n interval = undefined;\n }\n }\n\n return function (fontSpec) {\n const font = getFontParameters(fontSpec);\n if (!font) {\n return;\n }\n const families = font.families;\n for (let i = 0, ii = families.length; i < ii; ++i) {\n const family = families[i];\n const key = font.style + '\\n' + font.weight + '\\n' + family;\n if (checkedFonts.get(key) === undefined) {\n checkedFonts.set(key, retries, true);\n if (!isAvailable(font.style, font.weight, family)) {\n checkedFonts.set(key, 0, true);\n if (interval === undefined) {\n interval = setInterval(check, 32);\n }\n }\n }\n }\n };\n})();\n\n/**\n * @param {string} font Font to use for measuring.\n * @return {import(\"../size.js\").Size} Measurement.\n */\nexport const measureTextHeight = (function () {\n /**\n * @type {HTMLDivElement}\n */\n let measureElement;\n return function (fontSpec) {\n let height = textHeights[fontSpec];\n if (height == undefined) {\n if (WORKER_OFFSCREEN_CANVAS) {\n const font = getFontParameters(fontSpec);\n const metrics = measureText(fontSpec, '\u017Dg');\n const lineHeight = isNaN(Number(font.lineHeight))\n ? 1.2\n : Number(font.lineHeight);\n height =\n lineHeight *\n (metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent);\n } else {\n if (!measureElement) {\n measureElement = document.createElement('div');\n measureElement.innerHTML = 'M';\n measureElement.style.minHeight = '0';\n measureElement.style.maxHeight = 'none';\n measureElement.style.height = 'auto';\n measureElement.style.padding = '0';\n measureElement.style.border = 'none';\n measureElement.style.position = 'absolute';\n measureElement.style.display = 'block';\n measureElement.style.left = '-99999px';\n }\n measureElement.style.font = fontSpec;\n document.body.appendChild(measureElement);\n height = measureElement.offsetHeight;\n document.body.removeChild(measureElement);\n }\n textHeights[fontSpec] = height;\n }\n return height;\n };\n})();\n\n/**\n * @param {string} font Font.\n * @param {string} text Text.\n * @return {TextMetrics} Text metrics.\n */\nfunction measureText(font, text) {\n if (!measureContext) {\n measureContext = createCanvasContext2D(1, 1);\n }\n if (font != measureFont) {\n measureContext.font = font;\n measureFont = measureContext.font;\n }\n return measureContext.measureText(text);\n}\n\n/**\n * @param {string} font Font.\n * @param {string} text Text.\n * @return {number} Width.\n */\nexport function measureTextWidth(font, text) {\n return measureText(font, text).width;\n}\n\n/**\n * Measure text width using a cache.\n * @param {string} font The font.\n * @param {string} text The text to measure.\n * @param {Object} cache A lookup of cached widths by text.\n * @return {number} The text width.\n */\nexport function measureAndCacheTextWidth(font, text, cache) {\n if (text in cache) {\n return cache[text];\n }\n const width = text\n .split('\\n')\n .reduce((prev, curr) => Math.max(prev, measureTextWidth(font, curr)), 0);\n cache[text] = width;\n return width;\n}\n\n/**\n * @param {TextState} baseStyle Base style.\n * @param {Array} chunks Text chunks to measure.\n * @return {{width: number, height: number, widths: Array, heights: Array, lineWidths: Array}}} Text metrics.\n */\nexport function getTextDimensions(baseStyle, chunks) {\n const widths = [];\n const heights = [];\n const lineWidths = [];\n let width = 0;\n let lineWidth = 0;\n let height = 0;\n let lineHeight = 0;\n for (let i = 0, ii = chunks.length; i <= ii; i += 2) {\n const text = chunks[i];\n if (text === '\\n' || i === ii) {\n width = Math.max(width, lineWidth);\n lineWidths.push(lineWidth);\n lineWidth = 0;\n height += lineHeight;\n continue;\n }\n const font = chunks[i + 1] || baseStyle.font;\n const currentWidth = measureTextWidth(font, text);\n widths.push(currentWidth);\n lineWidth += currentWidth;\n const currentHeight = measureTextHeight(font);\n heights.push(currentHeight);\n lineHeight = Math.max(lineHeight, currentHeight);\n }\n return {width, height, widths, heights, lineWidths};\n}\n\n/**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {number} rotation Rotation.\n * @param {number} offsetX X offset.\n * @param {number} offsetY Y offset.\n */\nexport function rotateAtOffset(context, rotation, offsetX, offsetY) {\n if (rotation !== 0) {\n context.translate(offsetX, offsetY);\n context.rotate(rotation);\n context.translate(-offsetX, -offsetY);\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {import(\"../transform.js\").Transform|null} transform Transform.\n * @param {number} opacity Opacity.\n * @param {Label|HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} labelOrImage Label.\n * @param {number} originX Origin X.\n * @param {number} originY Origin Y.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../size.js\").Size} scale Scale.\n */\nexport function drawImageOrLabel(\n context,\n transform,\n opacity,\n labelOrImage,\n originX,\n originY,\n w,\n h,\n x,\n y,\n scale\n) {\n context.save();\n\n if (opacity !== 1) {\n context.globalAlpha *= opacity;\n }\n if (transform) {\n context.setTransform.apply(context, transform);\n }\n\n if (/** @type {*} */ (labelOrImage).contextInstructions) {\n // label\n context.translate(x, y);\n context.scale(scale[0], scale[1]);\n executeLabelInstructions(/** @type {Label} */ (labelOrImage), context);\n } else if (scale[0] < 0 || scale[1] < 0) {\n // flipped image\n context.translate(x, y);\n context.scale(scale[0], scale[1]);\n context.drawImage(\n /** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ (\n labelOrImage\n ),\n originX,\n originY,\n w,\n h,\n 0,\n 0,\n w,\n h\n );\n } else {\n // if image not flipped translate and scale can be avoided\n context.drawImage(\n /** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ (\n labelOrImage\n ),\n originX,\n originY,\n w,\n h,\n x,\n y,\n w * scale[0],\n h * scale[1]\n );\n }\n\n context.restore();\n}\n\n/**\n * @param {Label} label Label.\n * @param {CanvasRenderingContext2D} context Context.\n */\nfunction executeLabelInstructions(label, context) {\n const contextInstructions = label.contextInstructions;\n for (let i = 0, ii = contextInstructions.length; i < ii; i += 2) {\n if (Array.isArray(contextInstructions[i + 1])) {\n context[contextInstructions[i]].apply(\n context,\n contextInstructions[i + 1]\n );\n } else {\n context[contextInstructions[i]] = contextInstructions[i + 1];\n }\n }\n}\n", "/**\n * @module ol/renderer/Composite\n */\nimport MapRenderer from './Map.js';\nimport ObjectEventType from '../ObjectEventType.js';\nimport RenderEvent from '../render/Event.js';\nimport RenderEventType from '../render/EventType.js';\nimport {CLASS_UNSELECTABLE} from '../css.js';\nimport {checkedFonts} from '../render/canvas.js';\nimport {inView} from '../layer/Layer.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport {replaceChildren} from '../dom.js';\n\n/**\n * @classdesc\n * Canvas map renderer.\n * @api\n */\nclass CompositeMapRenderer extends MapRenderer {\n /**\n * @param {import(\"../Map.js\").default} map Map.\n */\n constructor(map) {\n super(map);\n\n /**\n * @type {import(\"../events.js\").EventsKey}\n */\n this.fontChangeListenerKey_ = listen(\n checkedFonts,\n ObjectEventType.PROPERTYCHANGE,\n map.redrawText.bind(map)\n );\n\n /**\n * @private\n * @type {HTMLDivElement}\n */\n this.element_ = document.createElement('div');\n const style = this.element_.style;\n style.position = 'absolute';\n style.width = '100%';\n style.height = '100%';\n style.zIndex = '0';\n\n this.element_.className = CLASS_UNSELECTABLE + ' ol-layers';\n\n const container = map.getViewport();\n container.insertBefore(this.element_, container.firstChild || null);\n\n /**\n * @private\n * @type {Array}\n */\n this.children_ = [];\n\n /**\n * @private\n * @type {boolean}\n */\n this.renderedVisible_ = true;\n\n /**\n * @type {Array}\n */\n this.declutterLayers_ = [];\n }\n\n /**\n * @param {import(\"../render/EventType.js\").default} type Event type.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n dispatchRenderEvent(type, frameState) {\n const map = this.getMap();\n if (map.hasListener(type)) {\n const event = new RenderEvent(type, undefined, frameState);\n map.dispatchEvent(event);\n }\n }\n\n disposeInternal() {\n unlistenByKey(this.fontChangeListenerKey_);\n this.element_.parentNode.removeChild(this.element_);\n super.disposeInternal();\n }\n\n /**\n * Render.\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n */\n renderFrame(frameState) {\n if (!frameState) {\n if (this.renderedVisible_) {\n this.element_.style.display = 'none';\n this.renderedVisible_ = false;\n }\n return;\n }\n\n this.calculateMatrices2D(frameState);\n this.dispatchRenderEvent(RenderEventType.PRECOMPOSE, frameState);\n\n const layerStatesArray = frameState.layerStatesArray.sort(function (a, b) {\n return a.zIndex - b.zIndex;\n });\n const viewState = frameState.viewState;\n\n this.children_.length = 0;\n\n const declutterLayers = this.declutterLayers_;\n declutterLayers.length = 0;\n\n let previousElement = null;\n for (let i = 0, ii = layerStatesArray.length; i < ii; ++i) {\n const layerState = layerStatesArray[i];\n frameState.layerIndex = i;\n\n const layer = layerState.layer;\n const sourceState = layer.getSourceState();\n if (\n !inView(layerState, viewState) ||\n (sourceState != 'ready' && sourceState != 'undefined')\n ) {\n layer.unrender();\n continue;\n }\n\n const element = layer.render(frameState, previousElement);\n if (!element) {\n continue;\n }\n if (element !== previousElement) {\n this.children_.push(element);\n previousElement = element;\n }\n if ('getDeclutter' in layer) {\n declutterLayers.push(\n /** @type {import(\"../layer/BaseVector.js\").default} */ (layer)\n );\n }\n }\n this.flushDeclutterItems(frameState);\n\n replaceChildren(this.element_, this.children_);\n\n this.dispatchRenderEvent(RenderEventType.POSTCOMPOSE, frameState);\n\n if (!this.renderedVisible_) {\n this.element_.style.display = '';\n this.renderedVisible_ = true;\n }\n\n this.scheduleExpireIconCache(frameState);\n }\n\n /**\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n */\n flushDeclutterItems(frameState) {\n const layers = this.declutterLayers_;\n for (let i = layers.length - 1; i >= 0; --i) {\n layers[i].renderDeclutter(frameState);\n }\n layers.length = 0;\n }\n}\n\nexport default CompositeMapRenderer;\n", "/**\n * @module ol/layer/Group\n */\nimport BaseLayer from './Base.js';\nimport Collection from '../Collection.js';\nimport CollectionEventType from '../CollectionEventType.js';\nimport Event from '../events/Event.js';\nimport EventType from '../events/EventType.js';\nimport ObjectEventType from '../ObjectEventType.js';\nimport {assert} from '../asserts.js';\nimport {clear} from '../obj.js';\nimport {getIntersection} from '../extent.js';\nimport {getUid} from '../util.js';\nimport {listen, unlistenByKey} from '../events.js';\n\n/**\n * @typedef {'addlayer'|'removelayer'} EventType\n */\n\n/**\n * @classdesc\n * A layer group triggers 'addlayer' and 'removelayer' events when layers are added to or removed from\n * the group or one of its child groups. When a layer group is added to or removed from another layer group,\n * a single event will be triggered (instead of one per layer in the group added or removed).\n */\nexport class GroupEvent extends Event {\n /**\n * @param {EventType} type The event type.\n * @param {BaseLayer} layer The layer.\n */\n constructor(type, layer) {\n super(type);\n\n /**\n * The added or removed layer.\n * @type {BaseLayer}\n * @api\n */\n this.layer = layer;\n }\n}\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature &\n * import(\"../Observable\").CombinedOnSignature} GroupOnSignature\n */\n\n/**\n * @typedef {Object} Options\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import(\"../extent.js\").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {Array|Collection} [layers] Child layers.\n * @property {Object} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @enum {string}\n * @private\n */\nconst Property = {\n LAYERS: 'layers',\n};\n\n/**\n * @classdesc\n * A {@link module:ol/Collection~Collection} of layers that are handled together.\n *\n * A generic `change` event is triggered when the group/Collection changes.\n *\n * @api\n */\nclass LayerGroup extends BaseLayer {\n /**\n * @param {Options} [options] Layer options.\n */\n constructor(options) {\n options = options || {};\n const baseOptions = /** @type {Options} */ (Object.assign({}, options));\n delete baseOptions.layers;\n\n let layers = options.layers;\n\n super(baseOptions);\n\n /***\n * @type {GroupOnSignature}\n */\n this.on;\n\n /***\n * @type {GroupOnSignature}\n */\n this.once;\n\n /***\n * @type {GroupOnSignature}\n */\n this.un;\n\n /**\n * @private\n * @type {Array}\n */\n this.layersListenerKeys_ = [];\n\n /**\n * @private\n * @type {Object>}\n */\n this.listenerKeys_ = {};\n\n this.addChangeListener(Property.LAYERS, this.handleLayersChanged_);\n\n if (layers) {\n if (Array.isArray(layers)) {\n layers = new Collection(layers.slice(), {unique: true});\n } else {\n assert(typeof (/** @type {?} */ (layers).getArray) === 'function', 43); // Expected `layers` to be an array or a `Collection`\n }\n } else {\n layers = new Collection(undefined, {unique: true});\n }\n\n this.setLayers(layers);\n }\n\n /**\n * @private\n */\n handleLayerChange_() {\n this.changed();\n }\n\n /**\n * @private\n */\n handleLayersChanged_() {\n this.layersListenerKeys_.forEach(unlistenByKey);\n this.layersListenerKeys_.length = 0;\n\n const layers = this.getLayers();\n this.layersListenerKeys_.push(\n listen(layers, CollectionEventType.ADD, this.handleLayersAdd_, this),\n listen(layers, CollectionEventType.REMOVE, this.handleLayersRemove_, this)\n );\n\n for (const id in this.listenerKeys_) {\n this.listenerKeys_[id].forEach(unlistenByKey);\n }\n clear(this.listenerKeys_);\n\n const layersArray = layers.getArray();\n for (let i = 0, ii = layersArray.length; i < ii; i++) {\n const layer = layersArray[i];\n this.registerLayerListeners_(layer);\n this.dispatchEvent(new GroupEvent('addlayer', layer));\n }\n this.changed();\n }\n\n /**\n * @param {BaseLayer} layer The layer.\n */\n registerLayerListeners_(layer) {\n const listenerKeys = [\n listen(\n layer,\n ObjectEventType.PROPERTYCHANGE,\n this.handleLayerChange_,\n this\n ),\n listen(layer, EventType.CHANGE, this.handleLayerChange_, this),\n ];\n\n if (layer instanceof LayerGroup) {\n listenerKeys.push(\n listen(layer, 'addlayer', this.handleLayerGroupAdd_, this),\n listen(layer, 'removelayer', this.handleLayerGroupRemove_, this)\n );\n }\n\n this.listenerKeys_[getUid(layer)] = listenerKeys;\n }\n\n /**\n * @param {GroupEvent} event The layer group event.\n */\n handleLayerGroupAdd_(event) {\n this.dispatchEvent(new GroupEvent('addlayer', event.layer));\n }\n\n /**\n * @param {GroupEvent} event The layer group event.\n */\n handleLayerGroupRemove_(event) {\n this.dispatchEvent(new GroupEvent('removelayer', event.layer));\n }\n\n /**\n * @param {import(\"../Collection.js\").CollectionEvent} collectionEvent CollectionEvent.\n * @private\n */\n handleLayersAdd_(collectionEvent) {\n const layer = collectionEvent.element;\n this.registerLayerListeners_(layer);\n this.dispatchEvent(new GroupEvent('addlayer', layer));\n this.changed();\n }\n\n /**\n * @param {import(\"../Collection.js\").CollectionEvent} collectionEvent CollectionEvent.\n * @private\n */\n handleLayersRemove_(collectionEvent) {\n const layer = collectionEvent.element;\n const key = getUid(layer);\n this.listenerKeys_[key].forEach(unlistenByKey);\n delete this.listenerKeys_[key];\n this.dispatchEvent(new GroupEvent('removelayer', layer));\n this.changed();\n }\n\n /**\n * Returns the {@link module:ol/Collection~Collection collection} of {@link module:ol/layer/Layer~Layer layers}\n * in this group.\n * @return {!Collection} Collection of\n * {@link module:ol/layer/Base~BaseLayer layers} that are part of this group.\n * @observable\n * @api\n */\n getLayers() {\n return /** @type {!Collection} */ (\n this.get(Property.LAYERS)\n );\n }\n\n /**\n * Set the {@link module:ol/Collection~Collection collection} of {@link module:ol/layer/Layer~Layer layers}\n * in this group.\n * @param {!Collection} layers Collection of\n * {@link module:ol/layer/Base~BaseLayer layers} that are part of this group.\n * @observable\n * @api\n */\n setLayers(layers) {\n const collection = this.getLayers();\n if (collection) {\n const currentLayers = collection.getArray();\n for (let i = 0, ii = currentLayers.length; i < ii; ++i) {\n this.dispatchEvent(new GroupEvent('removelayer', currentLayers[i]));\n }\n }\n\n this.set(Property.LAYERS, layers);\n }\n\n /**\n * @param {Array} [array] Array of layers (to be modified in place).\n * @return {Array} Array of layers.\n */\n getLayersArray(array) {\n array = array !== undefined ? array : [];\n this.getLayers().forEach(function (layer) {\n layer.getLayersArray(array);\n });\n return array;\n }\n\n /**\n * Get the layer states list and use this groups z-index as the default\n * for all layers in this and nested groups, if it is unset at this point.\n * If dest is not provided and this group's z-index is undefined\n * 0 is used a the default z-index.\n * @param {Array} [dest] Optional list\n * of layer states (to be modified in place).\n * @return {Array} List of layer states.\n */\n getLayerStatesArray(dest) {\n const states = dest !== undefined ? dest : [];\n const pos = states.length;\n\n this.getLayers().forEach(function (layer) {\n layer.getLayerStatesArray(states);\n });\n\n const ownLayerState = this.getLayerState();\n let defaultZIndex = ownLayerState.zIndex;\n if (!dest && ownLayerState.zIndex === undefined) {\n defaultZIndex = 0;\n }\n for (let i = pos, ii = states.length; i < ii; i++) {\n const layerState = states[i];\n layerState.opacity *= ownLayerState.opacity;\n layerState.visible = layerState.visible && ownLayerState.visible;\n layerState.maxResolution = Math.min(\n layerState.maxResolution,\n ownLayerState.maxResolution\n );\n layerState.minResolution = Math.max(\n layerState.minResolution,\n ownLayerState.minResolution\n );\n layerState.minZoom = Math.max(layerState.minZoom, ownLayerState.minZoom);\n layerState.maxZoom = Math.min(layerState.maxZoom, ownLayerState.maxZoom);\n if (ownLayerState.extent !== undefined) {\n if (layerState.extent !== undefined) {\n layerState.extent = getIntersection(\n layerState.extent,\n ownLayerState.extent\n );\n } else {\n layerState.extent = ownLayerState.extent;\n }\n }\n if (layerState.zIndex === undefined) {\n layerState.zIndex = defaultZIndex;\n }\n }\n\n return states;\n }\n\n /**\n * @return {import(\"../source/Source.js\").State} Source state.\n */\n getSourceState() {\n return 'ready';\n }\n}\n\nexport default LayerGroup;\n", "/**\n * @module ol/MapEvent\n */\nimport Event from './events/Event.js';\n\n/**\n * @classdesc\n * Events emitted as map events are instances of this type.\n * See {@link module:ol/Map~Map} for which events trigger a map event.\n */\nclass MapEvent extends Event {\n /**\n * @param {string} type Event type.\n * @param {import(\"./Map.js\").default} map Map.\n * @param {?import(\"./Map.js\").FrameState} [frameState] Frame state.\n */\n constructor(type, map, frameState) {\n super(type);\n\n /**\n * The map where the event occurred.\n * @type {import(\"./Map.js\").default}\n * @api\n */\n this.map = map;\n\n /**\n * The frame state at the time of the event.\n * @type {?import(\"./Map.js\").FrameState}\n * @api\n */\n this.frameState = frameState !== undefined ? frameState : null;\n }\n}\n\nexport default MapEvent;\n", "/**\n * @module ol/MapBrowserEvent\n */\nimport MapEvent from './MapEvent.js';\n\n/**\n * @classdesc\n * Events emitted as map browser events are instances of this type.\n * See {@link module:ol/Map~Map} for which events trigger a map browser event.\n * @template {UIEvent} EVENT\n */\nclass MapBrowserEvent extends MapEvent {\n /**\n * @param {string} type Event type.\n * @param {import(\"./Map.js\").default} map Map.\n * @param {EVENT} originalEvent Original event.\n * @param {boolean} [dragging] Is the map currently being dragged?\n * @param {import(\"./Map.js\").FrameState} [frameState] Frame state.\n * @param {Array} [activePointers] Active pointers.\n */\n constructor(type, map, originalEvent, dragging, frameState, activePointers) {\n super(type, map, frameState);\n\n /**\n * The original browser event.\n * @const\n * @type {EVENT}\n * @api\n */\n this.originalEvent = originalEvent;\n\n /**\n * The map pixel relative to the viewport corresponding to the original browser event.\n * @type {?import(\"./pixel.js\").Pixel}\n */\n this.pixel_ = null;\n\n /**\n * The coordinate in the user projection corresponding to the original browser event.\n * @type {?import(\"./coordinate.js\").Coordinate}\n */\n this.coordinate_ = null;\n\n /**\n * Indicates if the map is currently being dragged. Only set for\n * `POINTERDRAG` and `POINTERMOVE` events. Default is `false`.\n *\n * @type {boolean}\n * @api\n */\n this.dragging = dragging !== undefined ? dragging : false;\n\n /**\n * @type {Array|undefined}\n */\n this.activePointers = activePointers;\n }\n\n /**\n * The map pixel relative to the viewport corresponding to the original event.\n * @type {import(\"./pixel.js\").Pixel}\n * @api\n */\n get pixel() {\n if (!this.pixel_) {\n this.pixel_ = this.map.getEventPixel(this.originalEvent);\n }\n return this.pixel_;\n }\n set pixel(pixel) {\n this.pixel_ = pixel;\n }\n\n /**\n * The coordinate corresponding to the original browser event. This will be in the user\n * projection if one is set. Otherwise it will be in the view projection.\n * @type {import(\"./coordinate.js\").Coordinate}\n * @api\n */\n get coordinate() {\n if (!this.coordinate_) {\n this.coordinate_ = this.map.getCoordinateFromPixel(this.pixel);\n }\n return this.coordinate_;\n }\n set coordinate(coordinate) {\n this.coordinate_ = coordinate;\n }\n\n /**\n * Prevents the default browser action.\n * See https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault.\n * @api\n */\n preventDefault() {\n super.preventDefault();\n if ('preventDefault' in this.originalEvent) {\n /** @type {UIEvent} */ (this.originalEvent).preventDefault();\n }\n }\n\n /**\n * Prevents further propagation of the current event.\n * See https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation.\n * @api\n */\n stopPropagation() {\n super.stopPropagation();\n if ('stopPropagation' in this.originalEvent) {\n /** @type {UIEvent} */ (this.originalEvent).stopPropagation();\n }\n }\n}\n\nexport default MapBrowserEvent;\n", "/**\n * @module ol/MapBrowserEventType\n */\nimport EventType from './events/EventType.js';\n\n/**\n * Constants for event names.\n * @enum {string}\n */\nexport default {\n /**\n * A true single click with no dragging and no double click. Note that this\n * event is delayed by 250 ms to ensure that it is not a double click.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#singleclick\n * @api\n */\n SINGLECLICK: 'singleclick',\n\n /**\n * A click with no dragging. A double click will fire two of this.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#click\n * @api\n */\n CLICK: EventType.CLICK,\n\n /**\n * A true double click, with no dragging.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#dblclick\n * @api\n */\n DBLCLICK: EventType.DBLCLICK,\n\n /**\n * Triggered when a pointer is dragged.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointerdrag\n * @api\n */\n POINTERDRAG: 'pointerdrag',\n\n /**\n * Triggered when a pointer is moved. Note that on touch devices this is\n * triggered when the map is panned, so is not the same as mousemove.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointermove\n * @api\n */\n POINTERMOVE: 'pointermove',\n\n POINTERDOWN: 'pointerdown',\n POINTERUP: 'pointerup',\n POINTEROVER: 'pointerover',\n POINTEROUT: 'pointerout',\n POINTERENTER: 'pointerenter',\n POINTERLEAVE: 'pointerleave',\n POINTERCANCEL: 'pointercancel',\n};\n\n/***\n * @typedef {'singleclick'|'click'|'dblclick'|'pointerdrag'|'pointermove'} Types\n */\n", "/**\n * @module ol/pointer/EventType\n */\n\n/**\n * Constants for event names.\n * @enum {string}\n */\nexport default {\n POINTERMOVE: 'pointermove',\n POINTERDOWN: 'pointerdown',\n POINTERUP: 'pointerup',\n POINTEROVER: 'pointerover',\n POINTEROUT: 'pointerout',\n POINTERENTER: 'pointerenter',\n POINTERLEAVE: 'pointerleave',\n POINTERCANCEL: 'pointercancel',\n};\n", "/**\n * @module ol/MapBrowserEventHandler\n */\n\nimport EventType from './events/EventType.js';\nimport MapBrowserEvent from './MapBrowserEvent.js';\nimport MapBrowserEventType from './MapBrowserEventType.js';\nimport PointerEventType from './pointer/EventType.js';\nimport Target from './events/Target.js';\nimport {PASSIVE_EVENT_LISTENERS} from './has.js';\nimport {listen, unlistenByKey} from './events.js';\n\nclass MapBrowserEventHandler extends Target {\n /**\n * @param {import(\"./Map.js\").default} map The map with the viewport to listen to events on.\n * @param {number} [moveTolerance] The minimal distance the pointer must travel to trigger a move.\n */\n constructor(map, moveTolerance) {\n super(map);\n\n /**\n * This is the element that we will listen to the real events on.\n * @type {import(\"./Map.js\").default}\n * @private\n */\n this.map_ = map;\n\n /**\n * @type {ReturnType}\n * @private\n */\n this.clickTimeoutId_;\n\n /**\n * Emulate dblclick and singleclick. Will be true when only one pointer is active.\n * @type {boolean}\n */\n this.emulateClicks_ = false;\n\n /**\n * @type {boolean}\n * @private\n */\n this.dragging_ = false;\n\n /**\n * @type {!Array}\n * @private\n */\n this.dragListenerKeys_ = [];\n\n /**\n * @type {number}\n * @private\n */\n this.moveTolerance_ = moveTolerance === undefined ? 1 : moveTolerance;\n\n /**\n * The most recent \"down\" type event (or null if none have occurred).\n * Set on pointerdown.\n * @type {PointerEvent|null}\n * @private\n */\n this.down_ = null;\n\n const element = this.map_.getViewport();\n\n /**\n * @type {Array}\n * @private\n */\n this.activePointers_ = [];\n\n /**\n * @type {!Object}\n * @private\n */\n this.trackedTouches_ = {};\n\n this.element_ = element;\n\n /**\n * @type {?import(\"./events.js\").EventsKey}\n * @private\n */\n this.pointerdownListenerKey_ = listen(\n element,\n PointerEventType.POINTERDOWN,\n this.handlePointerDown_,\n this\n );\n\n /**\n * @type {PointerEvent}\n * @private\n */\n this.originalPointerMoveEvent_;\n\n /**\n * @type {?import(\"./events.js\").EventsKey}\n * @private\n */\n this.relayedListenerKey_ = listen(\n element,\n PointerEventType.POINTERMOVE,\n this.relayMoveEvent_,\n this\n );\n\n /**\n * @private\n */\n this.boundHandleTouchMove_ = this.handleTouchMove_.bind(this);\n\n this.element_.addEventListener(\n EventType.TOUCHMOVE,\n this.boundHandleTouchMove_,\n PASSIVE_EVENT_LISTENERS ? {passive: false} : false\n );\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n emulateClick_(pointerEvent) {\n let newEvent = new MapBrowserEvent(\n MapBrowserEventType.CLICK,\n this.map_,\n pointerEvent\n );\n this.dispatchEvent(newEvent);\n if (this.clickTimeoutId_ !== undefined) {\n // double-click\n clearTimeout(this.clickTimeoutId_);\n this.clickTimeoutId_ = undefined;\n newEvent = new MapBrowserEvent(\n MapBrowserEventType.DBLCLICK,\n this.map_,\n pointerEvent\n );\n this.dispatchEvent(newEvent);\n } else {\n // click\n this.clickTimeoutId_ = setTimeout(() => {\n this.clickTimeoutId_ = undefined;\n const newEvent = new MapBrowserEvent(\n MapBrowserEventType.SINGLECLICK,\n this.map_,\n pointerEvent\n );\n this.dispatchEvent(newEvent);\n }, 250);\n }\n }\n\n /**\n * Keeps track on how many pointers are currently active.\n *\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n updateActivePointers_(pointerEvent) {\n const event = pointerEvent;\n const id = event.pointerId;\n\n if (\n event.type == MapBrowserEventType.POINTERUP ||\n event.type == MapBrowserEventType.POINTERCANCEL\n ) {\n delete this.trackedTouches_[id];\n for (const pointerId in this.trackedTouches_) {\n if (this.trackedTouches_[pointerId].target !== event.target) {\n // Some platforms assign a new pointerId when the target changes.\n // If this happens, delete one tracked pointer. If there is more\n // than one tracked pointer for the old target, it will be cleared\n // by subsequent POINTERUP events from other pointers.\n delete this.trackedTouches_[pointerId];\n break;\n }\n }\n } else if (\n event.type == MapBrowserEventType.POINTERDOWN ||\n event.type == MapBrowserEventType.POINTERMOVE\n ) {\n this.trackedTouches_[id] = event;\n }\n this.activePointers_ = Object.values(this.trackedTouches_);\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerUp_(pointerEvent) {\n this.updateActivePointers_(pointerEvent);\n const newEvent = new MapBrowserEvent(\n MapBrowserEventType.POINTERUP,\n this.map_,\n pointerEvent,\n undefined,\n undefined,\n this.activePointers_\n );\n this.dispatchEvent(newEvent);\n\n // We emulate click events on left mouse button click, touch contact, and pen\n // contact. isMouseActionButton returns true in these cases (evt.button is set\n // to 0).\n // See http://www.w3.org/TR/pointerevents/#button-states\n // We only fire click, singleclick, and doubleclick if nobody has called\n // event.preventDefault().\n if (\n this.emulateClicks_ &&\n !newEvent.defaultPrevented &&\n !this.dragging_ &&\n this.isMouseActionButton_(pointerEvent)\n ) {\n this.emulateClick_(this.down_);\n }\n\n if (this.activePointers_.length === 0) {\n this.dragListenerKeys_.forEach(unlistenByKey);\n this.dragListenerKeys_.length = 0;\n this.dragging_ = false;\n this.down_ = null;\n }\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @return {boolean} If the left mouse button was pressed.\n * @private\n */\n isMouseActionButton_(pointerEvent) {\n return pointerEvent.button === 0;\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerDown_(pointerEvent) {\n this.emulateClicks_ = this.activePointers_.length === 0;\n this.updateActivePointers_(pointerEvent);\n const newEvent = new MapBrowserEvent(\n MapBrowserEventType.POINTERDOWN,\n this.map_,\n pointerEvent,\n undefined,\n undefined,\n this.activePointers_\n );\n this.dispatchEvent(newEvent);\n\n this.down_ = new PointerEvent(pointerEvent.type, pointerEvent);\n Object.defineProperty(this.down_, 'target', {\n writable: false,\n value: pointerEvent.target,\n });\n\n if (this.dragListenerKeys_.length === 0) {\n const doc = this.map_.getOwnerDocument();\n this.dragListenerKeys_.push(\n listen(\n doc,\n MapBrowserEventType.POINTERMOVE,\n this.handlePointerMove_,\n this\n ),\n listen(doc, MapBrowserEventType.POINTERUP, this.handlePointerUp_, this),\n /* Note that the listener for `pointercancel is set up on\n * `pointerEventHandler_` and not `documentPointerEventHandler_` like\n * the `pointerup` and `pointermove` listeners.\n *\n * The reason for this is the following: `TouchSource.vacuumTouches_()`\n * issues `pointercancel` events, when there was no `touchend` for a\n * `touchstart`. Now, let's say a first `touchstart` is registered on\n * `pointerEventHandler_`. The `documentPointerEventHandler_` is set up.\n * But `documentPointerEventHandler_` doesn't know about the first\n * `touchstart`. If there is no `touchend` for the `touchstart`, we can\n * only receive a `touchcancel` from `pointerEventHandler_`, because it is\n * only registered there.\n */\n listen(\n this.element_,\n MapBrowserEventType.POINTERCANCEL,\n this.handlePointerUp_,\n this\n )\n );\n if (this.element_.getRootNode && this.element_.getRootNode() !== doc) {\n this.dragListenerKeys_.push(\n listen(\n this.element_.getRootNode(),\n MapBrowserEventType.POINTERUP,\n this.handlePointerUp_,\n this\n )\n );\n }\n }\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerMove_(pointerEvent) {\n // Between pointerdown and pointerup, pointermove events are triggered.\n // To avoid a 'false' touchmove event to be dispatched, we test if the pointer\n // moved a significant distance.\n if (this.isMoving_(pointerEvent)) {\n this.updateActivePointers_(pointerEvent);\n this.dragging_ = true;\n const newEvent = new MapBrowserEvent(\n MapBrowserEventType.POINTERDRAG,\n this.map_,\n pointerEvent,\n this.dragging_,\n undefined,\n this.activePointers_\n );\n this.dispatchEvent(newEvent);\n }\n }\n\n /**\n * Wrap and relay a pointermove event.\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n relayMoveEvent_(pointerEvent) {\n this.originalPointerMoveEvent_ = pointerEvent;\n const dragging = !!(this.down_ && this.isMoving_(pointerEvent));\n this.dispatchEvent(\n new MapBrowserEvent(\n MapBrowserEventType.POINTERMOVE,\n this.map_,\n pointerEvent,\n dragging\n )\n );\n }\n\n /**\n * Flexible handling of a `touch-action: none` css equivalent: because calling\n * `preventDefault()` on a `pointermove` event does not stop native page scrolling\n * and zooming, we also listen for `touchmove` and call `preventDefault()` on it\n * when an interaction (currently `DragPan` handles the event.\n * @param {TouchEvent} event Event.\n * @private\n */\n handleTouchMove_(event) {\n // Due to https://github.com/mpizenberg/elm-pep/issues/2, `this.originalPointerMoveEvent_`\n // may not be initialized yet when we get here on a platform without native pointer events,\n // when elm-pep is used as pointer events polyfill.\n const originalEvent = this.originalPointerMoveEvent_;\n if (\n (!originalEvent || originalEvent.defaultPrevented) &&\n (typeof event.cancelable !== 'boolean' || event.cancelable === true)\n ) {\n event.preventDefault();\n }\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @return {boolean} Is moving.\n * @private\n */\n isMoving_(pointerEvent) {\n return (\n this.dragging_ ||\n Math.abs(pointerEvent.clientX - this.down_.clientX) >\n this.moveTolerance_ ||\n Math.abs(pointerEvent.clientY - this.down_.clientY) > this.moveTolerance_\n );\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n if (this.relayedListenerKey_) {\n unlistenByKey(this.relayedListenerKey_);\n this.relayedListenerKey_ = null;\n }\n this.element_.removeEventListener(\n EventType.TOUCHMOVE,\n this.boundHandleTouchMove_\n );\n\n if (this.pointerdownListenerKey_) {\n unlistenByKey(this.pointerdownListenerKey_);\n this.pointerdownListenerKey_ = null;\n }\n\n this.dragListenerKeys_.forEach(unlistenByKey);\n this.dragListenerKeys_.length = 0;\n\n this.element_ = null;\n super.disposeInternal();\n }\n}\n\nexport default MapBrowserEventHandler;\n", "/**\n * @module ol/MapEventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n /**\n * Triggered after a map frame is rendered.\n * @event module:ol/MapEvent~MapEvent#postrender\n * @api\n */\n POSTRENDER: 'postrender',\n\n /**\n * Triggered when the map starts moving.\n * @event module:ol/MapEvent~MapEvent#movestart\n * @api\n */\n MOVESTART: 'movestart',\n\n /**\n * Triggered after the map is moved.\n * @event module:ol/MapEvent~MapEvent#moveend\n * @api\n */\n MOVEEND: 'moveend',\n\n /**\n * Triggered when loading of additional map data (tiles, images, features) starts.\n * @event module:ol/MapEvent~MapEvent#loadstart\n * @api\n */\n LOADSTART: 'loadstart',\n\n /**\n * Triggered when loading of additional map data has completed.\n * @event module:ol/MapEvent~MapEvent#loadend\n * @api\n */\n LOADEND: 'loadend',\n};\n\n/***\n * @typedef {'postrender'|'movestart'|'moveend'|'loadstart'|'loadend'} Types\n */\n", "/**\n * @module ol/MapProperty\n */\n\n/**\n * @enum {string}\n */\nexport default {\n LAYERGROUP: 'layergroup',\n SIZE: 'size',\n TARGET: 'target',\n VIEW: 'view',\n};\n", "/**\n * @module ol/structs/PriorityQueue\n */\nimport {assert} from '../asserts.js';\nimport {clear} from '../obj.js';\n\n/**\n * @type {number}\n */\nexport const DROP = Infinity;\n\n/**\n * @classdesc\n * Priority queue.\n *\n * The implementation is inspired from the Closure Library's Heap class and\n * Python's heapq module.\n *\n * See https://github.com/google/closure-library/blob/master/closure/goog/structs/heap.js\n * and https://hg.python.org/cpython/file/2.7/Lib/heapq.py.\n *\n * @template T\n */\nclass PriorityQueue {\n /**\n * @param {function(T): number} priorityFunction Priority function.\n * @param {function(T): string} keyFunction Key function.\n */\n constructor(priorityFunction, keyFunction) {\n /**\n * @type {function(T): number}\n * @private\n */\n this.priorityFunction_ = priorityFunction;\n\n /**\n * @type {function(T): string}\n * @private\n */\n this.keyFunction_ = keyFunction;\n\n /**\n * @type {Array}\n * @private\n */\n this.elements_ = [];\n\n /**\n * @type {Array}\n * @private\n */\n this.priorities_ = [];\n\n /**\n * @type {!Object}\n * @private\n */\n this.queuedElements_ = {};\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.elements_.length = 0;\n this.priorities_.length = 0;\n clear(this.queuedElements_);\n }\n\n /**\n * Remove and return the highest-priority element. O(log N).\n * @return {T} Element.\n */\n dequeue() {\n const elements = this.elements_;\n const priorities = this.priorities_;\n const element = elements[0];\n if (elements.length == 1) {\n elements.length = 0;\n priorities.length = 0;\n } else {\n elements[0] = elements.pop();\n priorities[0] = priorities.pop();\n this.siftUp_(0);\n }\n const elementKey = this.keyFunction_(element);\n delete this.queuedElements_[elementKey];\n return element;\n }\n\n /**\n * Enqueue an element. O(log N).\n * @param {T} element Element.\n * @return {boolean} The element was added to the queue.\n */\n enqueue(element) {\n assert(!(this.keyFunction_(element) in this.queuedElements_), 31); // Tried to enqueue an `element` that was already added to the queue\n const priority = this.priorityFunction_(element);\n if (priority != DROP) {\n this.elements_.push(element);\n this.priorities_.push(priority);\n this.queuedElements_[this.keyFunction_(element)] = true;\n this.siftDown_(0, this.elements_.length - 1);\n return true;\n }\n return false;\n }\n\n /**\n * @return {number} Count.\n */\n getCount() {\n return this.elements_.length;\n }\n\n /**\n * Gets the index of the left child of the node at the given index.\n * @param {number} index The index of the node to get the left child for.\n * @return {number} The index of the left child.\n * @private\n */\n getLeftChildIndex_(index) {\n return index * 2 + 1;\n }\n\n /**\n * Gets the index of the right child of the node at the given index.\n * @param {number} index The index of the node to get the right child for.\n * @return {number} The index of the right child.\n * @private\n */\n getRightChildIndex_(index) {\n return index * 2 + 2;\n }\n\n /**\n * Gets the index of the parent of the node at the given index.\n * @param {number} index The index of the node to get the parent for.\n * @return {number} The index of the parent.\n * @private\n */\n getParentIndex_(index) {\n return (index - 1) >> 1;\n }\n\n /**\n * Make this a heap. O(N).\n * @private\n */\n heapify_() {\n let i;\n for (i = (this.elements_.length >> 1) - 1; i >= 0; i--) {\n this.siftUp_(i);\n }\n }\n\n /**\n * @return {boolean} Is empty.\n */\n isEmpty() {\n return this.elements_.length === 0;\n }\n\n /**\n * @param {string} key Key.\n * @return {boolean} Is key queued.\n */\n isKeyQueued(key) {\n return key in this.queuedElements_;\n }\n\n /**\n * @param {T} element Element.\n * @return {boolean} Is queued.\n */\n isQueued(element) {\n return this.isKeyQueued(this.keyFunction_(element));\n }\n\n /**\n * @param {number} index The index of the node to move down.\n * @private\n */\n siftUp_(index) {\n const elements = this.elements_;\n const priorities = this.priorities_;\n const count = elements.length;\n const element = elements[index];\n const priority = priorities[index];\n const startIndex = index;\n\n while (index < count >> 1) {\n const lIndex = this.getLeftChildIndex_(index);\n const rIndex = this.getRightChildIndex_(index);\n\n const smallerChildIndex =\n rIndex < count && priorities[rIndex] < priorities[lIndex]\n ? rIndex\n : lIndex;\n\n elements[index] = elements[smallerChildIndex];\n priorities[index] = priorities[smallerChildIndex];\n index = smallerChildIndex;\n }\n\n elements[index] = element;\n priorities[index] = priority;\n this.siftDown_(startIndex, index);\n }\n\n /**\n * @param {number} startIndex The index of the root.\n * @param {number} index The index of the node to move up.\n * @private\n */\n siftDown_(startIndex, index) {\n const elements = this.elements_;\n const priorities = this.priorities_;\n const element = elements[index];\n const priority = priorities[index];\n\n while (index > startIndex) {\n const parentIndex = this.getParentIndex_(index);\n if (priorities[parentIndex] > priority) {\n elements[index] = elements[parentIndex];\n priorities[index] = priorities[parentIndex];\n index = parentIndex;\n } else {\n break;\n }\n }\n elements[index] = element;\n priorities[index] = priority;\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n reprioritize() {\n const priorityFunction = this.priorityFunction_;\n const elements = this.elements_;\n const priorities = this.priorities_;\n let index = 0;\n const n = elements.length;\n let element, i, priority;\n for (i = 0; i < n; ++i) {\n element = elements[i];\n priority = priorityFunction(element);\n if (priority == DROP) {\n delete this.queuedElements_[this.keyFunction_(element)];\n } else {\n priorities[index] = priority;\n elements[index++] = element;\n }\n }\n elements.length = index;\n priorities.length = index;\n this.heapify_();\n }\n}\n\nexport default PriorityQueue;\n", "/**\n * @module ol/TileState\n */\n\n/**\n * @enum {number}\n */\nexport default {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n /**\n * Indicates that tile loading failed\n * @type {number}\n */\n ERROR: 3,\n EMPTY: 4,\n};\n", "/**\n * @module ol/TileQueue\n */\nimport EventType from './events/EventType.js';\nimport PriorityQueue, {DROP} from './structs/PriorityQueue.js';\nimport TileState from './TileState.js';\n\n/**\n * @typedef {function(import(\"./Tile.js\").default, string, import(\"./coordinate.js\").Coordinate, number): number} PriorityFunction\n */\n\nclass TileQueue extends PriorityQueue {\n /**\n * @param {PriorityFunction} tilePriorityFunction Tile priority function.\n * @param {function(): ?} tileChangeCallback Function called on each tile change event.\n */\n constructor(tilePriorityFunction, tileChangeCallback) {\n super(\n /**\n * @param {Array} element Element.\n * @return {number} Priority.\n */\n function (element) {\n return tilePriorityFunction.apply(null, element);\n },\n /**\n * @param {Array} element Element.\n * @return {string} Key.\n */\n function (element) {\n return /** @type {import(\"./Tile.js\").default} */ (element[0]).getKey();\n }\n );\n\n /** @private */\n this.boundHandleTileChange_ = this.handleTileChange.bind(this);\n\n /**\n * @private\n * @type {function(): ?}\n */\n this.tileChangeCallback_ = tileChangeCallback;\n\n /**\n * @private\n * @type {number}\n */\n this.tilesLoading_ = 0;\n\n /**\n * @private\n * @type {!Object}\n */\n this.tilesLoadingKeys_ = {};\n }\n\n /**\n * @param {Array} element Element.\n * @return {boolean} The element was added to the queue.\n */\n enqueue(element) {\n const added = super.enqueue(element);\n if (added) {\n const tile = element[0];\n tile.addEventListener(EventType.CHANGE, this.boundHandleTileChange_);\n }\n return added;\n }\n\n /**\n * @return {number} Number of tiles loading.\n */\n getTilesLoading() {\n return this.tilesLoading_;\n }\n\n /**\n * @param {import(\"./events/Event.js\").default} event Event.\n * @protected\n */\n handleTileChange(event) {\n const tile = /** @type {import(\"./Tile.js\").default} */ (event.target);\n const state = tile.getState();\n if (\n state === TileState.LOADED ||\n state === TileState.ERROR ||\n state === TileState.EMPTY\n ) {\n if (state !== TileState.ERROR) {\n tile.removeEventListener(EventType.CHANGE, this.boundHandleTileChange_);\n }\n const tileKey = tile.getKey();\n if (tileKey in this.tilesLoadingKeys_) {\n delete this.tilesLoadingKeys_[tileKey];\n --this.tilesLoading_;\n }\n this.tileChangeCallback_();\n }\n }\n\n /**\n * @param {number} maxTotalLoading Maximum number tiles to load simultaneously.\n * @param {number} maxNewLoads Maximum number of new tiles to load.\n */\n loadMoreTiles(maxTotalLoading, maxNewLoads) {\n let newLoads = 0;\n let state, tile, tileKey;\n while (\n this.tilesLoading_ < maxTotalLoading &&\n newLoads < maxNewLoads &&\n this.getCount() > 0\n ) {\n tile = /** @type {import(\"./Tile.js\").default} */ (this.dequeue()[0]);\n tileKey = tile.getKey();\n state = tile.getState();\n if (state === TileState.IDLE && !(tileKey in this.tilesLoadingKeys_)) {\n this.tilesLoadingKeys_[tileKey] = true;\n ++this.tilesLoading_;\n ++newLoads;\n tile.load();\n }\n }\n }\n}\n\nexport default TileQueue;\n\n/**\n * @param {import('./Map.js').FrameState} frameState Frame state.\n * @param {import(\"./Tile.js\").default} tile Tile.\n * @param {string} tileSourceKey Tile source key.\n * @param {import(\"./coordinate.js\").Coordinate} tileCenter Tile center.\n * @param {number} tileResolution Tile resolution.\n * @return {number} Tile priority.\n */\nexport function getTilePriority(\n frameState,\n tile,\n tileSourceKey,\n tileCenter,\n tileResolution\n) {\n // Filter out tiles at higher zoom levels than the current zoom level, or that\n // are outside the visible extent.\n if (!frameState || !(tileSourceKey in frameState.wantedTiles)) {\n return DROP;\n }\n if (!frameState.wantedTiles[tileSourceKey][tile.getKey()]) {\n return DROP;\n }\n // Prioritize the highest zoom level tiles closest to the focus.\n // Tiles at higher zoom levels are prioritized using Math.log(tileResolution).\n // Within a zoom level, tiles are prioritized by the distance in pixels between\n // the center of the tile and the center of the viewport. The factor of 65536\n // means that the prioritization should behave as desired for tiles up to\n // 65536 * Math.log(2) = 45426 pixels from the focus.\n const center = frameState.viewState.center;\n const deltaX = tileCenter[0] - center[0];\n const deltaY = tileCenter[1] - center[1];\n return (\n 65536 * Math.log(tileResolution) +\n Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution\n );\n}\n", "/**\n * @module ol/control/Control\n */\nimport BaseObject from '../Object.js';\nimport MapEventType from '../MapEventType.js';\nimport {VOID} from '../functions.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport {removeNode} from '../dom.js';\n\n/**\n * @typedef {Object} Options\n * @property {HTMLElement} [element] The element is the control's\n * container element. This only needs to be specified if you're developing\n * a custom control.\n * @property {function(import(\"../MapEvent.js\").default):void} [render] Function called when\n * the control should be re-rendered. This is called in a `requestAnimationFrame`\n * callback.\n * @property {HTMLElement|string} [target] Specify a target if you want\n * the control to be rendered outside of the map's viewport.\n */\n\n/**\n * @classdesc\n * A control is a visible widget with a DOM element in a fixed position on the\n * screen. They can involve user input (buttons), or be informational only;\n * the position is determined using CSS. By default these are placed in the\n * container with CSS class name `ol-overlaycontainer-stopevent`, but can use\n * any outside DOM element.\n *\n * This is the base class for controls. You can use it for simple custom\n * controls by creating the element with listeners, creating an instance:\n * ```js\n * const myControl = new Control({element: myElement});\n * ```\n * and then adding this to the map.\n *\n * The main advantage of having this as a control rather than a simple separate\n * DOM element is that preventing propagation is handled for you. Controls\n * will also be objects in a {@link module:ol/Collection~Collection}, so you can use their methods.\n *\n * You can also extend this base for your own control class. See\n * examples/custom-controls for an example of how to do this.\n *\n * @api\n */\nclass Control extends BaseObject {\n /**\n * @param {Options} options Control options.\n */\n constructor(options) {\n super();\n\n const element = options.element;\n if (element && !options.target && !element.style.pointerEvents) {\n element.style.pointerEvents = 'auto';\n }\n\n /**\n * @protected\n * @type {HTMLElement}\n */\n this.element = element ? element : null;\n\n /**\n * @private\n * @type {HTMLElement}\n */\n this.target_ = null;\n\n /**\n * @private\n * @type {import(\"../Map.js\").default|null}\n */\n this.map_ = null;\n\n /**\n * @protected\n * @type {!Array}\n */\n this.listenerKeys = [];\n\n if (options.render) {\n this.render = options.render;\n }\n\n if (options.target) {\n this.setTarget(options.target);\n }\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n removeNode(this.element);\n super.disposeInternal();\n }\n\n /**\n * Get the map associated with this control.\n * @return {import(\"../Map.js\").default|null} Map.\n * @api\n */\n getMap() {\n return this.map_;\n }\n\n /**\n * Remove the control from its current map and attach it to the new map.\n * Pass `null` to just remove the control from the current map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default|null} map Map.\n * @api\n */\n setMap(map) {\n if (this.map_) {\n removeNode(this.element);\n }\n for (let i = 0, ii = this.listenerKeys.length; i < ii; ++i) {\n unlistenByKey(this.listenerKeys[i]);\n }\n this.listenerKeys.length = 0;\n this.map_ = map;\n if (map) {\n const target = this.target_\n ? this.target_\n : map.getOverlayContainerStopEvent();\n target.appendChild(this.element);\n if (this.render !== VOID) {\n this.listenerKeys.push(\n listen(map, MapEventType.POSTRENDER, this.render, this)\n );\n }\n map.render();\n }\n }\n\n /**\n * Renders the control.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @api\n */\n render(mapEvent) {}\n\n /**\n * This function is used to set a target element for the control. It has no\n * effect if it is called after the control has been added to the map (i.e.\n * after `setMap` is called on the control). If no `target` is set in the\n * options passed to the control constructor and if `setTarget` is not called\n * then the control is added to the map's overlay container.\n * @param {HTMLElement|string} target Target.\n * @api\n */\n setTarget(target) {\n this.target_ =\n typeof target === 'string' ? document.getElementById(target) : target;\n }\n}\n\nexport default Control;\n", "/**\n * @module ol/control/Attribution\n */\nimport Control from './Control.js';\nimport EventType from '../events/EventType.js';\nimport {CLASS_COLLAPSED, CLASS_CONTROL, CLASS_UNSELECTABLE} from '../css.js';\nimport {equals} from '../array.js';\nimport {removeChildren, replaceNode} from '../dom.js';\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-attribution'] CSS class name.\n * @property {HTMLElement|string} [target] Specify a target if you\n * want the control to be rendered outside of the map's\n * viewport.\n * @property {boolean} [collapsible] Specify if attributions can\n * be collapsed. If not specified, sources control this behavior with their\n * `attributionsCollapsible` setting.\n * @property {boolean} [collapsed=true] Specify if attributions should\n * be collapsed at startup.\n * @property {string} [tipLabel='Attributions'] Text label to use for the button tip.\n * @property {string|HTMLElement} [label='i'] Text label to use for the\n * collapsed attributions button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [expandClassName=className + '-expand'] CSS class name for the\n * collapsed attributions button.\n * @property {string|HTMLElement} [collapseLabel='\u203A'] Text label to use\n * for the expanded attributions button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [collapseClassName=className + '-collapse'] CSS class name for the\n * expanded attributions button.\n * @property {function(import(\"../MapEvent.js\").default):void} [render] Function called when\n * the control should be re-rendered. This is called in a `requestAnimationFrame`\n * callback.\n */\n\n/**\n * @classdesc\n * Control to show all the attributions associated with the layer sources\n * in the map. This control is one of the default controls included in maps.\n * By default it will show in the bottom right portion of the map, but this can\n * be changed by using a css selector for `.ol-attribution`.\n *\n * @api\n */\nclass Attribution extends Control {\n /**\n * @param {Options} [options] Attribution options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super({\n element: document.createElement('div'),\n render: options.render,\n target: options.target,\n });\n\n /**\n * @private\n * @type {HTMLElement}\n */\n this.ulElement_ = document.createElement('ul');\n\n /**\n * @private\n * @type {boolean}\n */\n this.collapsed_ =\n options.collapsed !== undefined ? options.collapsed : true;\n\n /**\n * @private\n * @type {boolean}\n */\n this.userCollapsed_ = this.collapsed_;\n\n /**\n * @private\n * @type {boolean}\n */\n this.overrideCollapsible_ = options.collapsible !== undefined;\n\n /**\n * @private\n * @type {boolean}\n */\n this.collapsible_ =\n options.collapsible !== undefined ? options.collapsible : true;\n\n if (!this.collapsible_) {\n this.collapsed_ = false;\n }\n\n const className =\n options.className !== undefined ? options.className : 'ol-attribution';\n\n const tipLabel =\n options.tipLabel !== undefined ? options.tipLabel : 'Attributions';\n\n const expandClassName =\n options.expandClassName !== undefined\n ? options.expandClassName\n : className + '-expand';\n\n const collapseLabel =\n options.collapseLabel !== undefined ? options.collapseLabel : '\\u203A';\n\n const collapseClassName =\n options.collapseClassName !== undefined\n ? options.collapseClassName\n : className + '-collapse';\n\n if (typeof collapseLabel === 'string') {\n /**\n * @private\n * @type {HTMLElement}\n */\n this.collapseLabel_ = document.createElement('span');\n this.collapseLabel_.textContent = collapseLabel;\n this.collapseLabel_.className = collapseClassName;\n } else {\n this.collapseLabel_ = collapseLabel;\n }\n\n const label = options.label !== undefined ? options.label : 'i';\n\n if (typeof label === 'string') {\n /**\n * @private\n * @type {HTMLElement}\n */\n this.label_ = document.createElement('span');\n this.label_.textContent = label;\n this.label_.className = expandClassName;\n } else {\n this.label_ = label;\n }\n\n const activeLabel =\n this.collapsible_ && !this.collapsed_ ? this.collapseLabel_ : this.label_;\n\n /**\n * @private\n * @type {HTMLElement}\n */\n this.toggleButton_ = document.createElement('button');\n this.toggleButton_.setAttribute('type', 'button');\n this.toggleButton_.setAttribute('aria-expanded', String(!this.collapsed_));\n this.toggleButton_.title = tipLabel;\n this.toggleButton_.appendChild(activeLabel);\n\n this.toggleButton_.addEventListener(\n EventType.CLICK,\n this.handleClick_.bind(this),\n false\n );\n\n const cssClasses =\n className +\n ' ' +\n CLASS_UNSELECTABLE +\n ' ' +\n CLASS_CONTROL +\n (this.collapsed_ && this.collapsible_ ? ' ' + CLASS_COLLAPSED : '') +\n (this.collapsible_ ? '' : ' ol-uncollapsible');\n const element = this.element;\n element.className = cssClasses;\n element.appendChild(this.toggleButton_);\n element.appendChild(this.ulElement_);\n\n /**\n * A list of currently rendered resolutions.\n * @type {Array}\n * @private\n */\n this.renderedAttributions_ = [];\n\n /**\n * @private\n * @type {boolean}\n */\n this.renderedVisible_ = true;\n }\n\n /**\n * Collect a list of visible attributions and set the collapsible state.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @return {Array} Attributions.\n * @private\n */\n collectSourceAttributions_(frameState) {\n const visibleAttributions = Array.from(\n new Set(\n this.getMap()\n .getAllLayers()\n .flatMap((layer) => layer.getAttributions(frameState))\n )\n );\n\n const collapsible = !this.getMap()\n .getAllLayers()\n .some(\n (layer) =>\n layer.getSource() &&\n layer.getSource().getAttributionsCollapsible() === false\n );\n if (!this.overrideCollapsible_) {\n this.setCollapsible(collapsible);\n }\n return visibleAttributions;\n }\n\n /**\n * @private\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n */\n updateElement_(frameState) {\n if (!frameState) {\n if (this.renderedVisible_) {\n this.element.style.display = 'none';\n this.renderedVisible_ = false;\n }\n return;\n }\n\n const attributions = this.collectSourceAttributions_(frameState);\n\n const visible = attributions.length > 0;\n if (this.renderedVisible_ != visible) {\n this.element.style.display = visible ? '' : 'none';\n this.renderedVisible_ = visible;\n }\n\n if (equals(attributions, this.renderedAttributions_)) {\n return;\n }\n\n removeChildren(this.ulElement_);\n\n // append the attributions\n for (let i = 0, ii = attributions.length; i < ii; ++i) {\n const element = document.createElement('li');\n element.innerHTML = attributions[i];\n this.ulElement_.appendChild(element);\n }\n\n this.renderedAttributions_ = attributions;\n }\n\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(event) {\n event.preventDefault();\n this.handleToggle_();\n this.userCollapsed_ = this.collapsed_;\n }\n\n /**\n * @private\n */\n handleToggle_() {\n this.element.classList.toggle(CLASS_COLLAPSED);\n if (this.collapsed_) {\n replaceNode(this.collapseLabel_, this.label_);\n } else {\n replaceNode(this.label_, this.collapseLabel_);\n }\n this.collapsed_ = !this.collapsed_;\n this.toggleButton_.setAttribute('aria-expanded', String(!this.collapsed_));\n }\n\n /**\n * Return `true` if the attribution is collapsible, `false` otherwise.\n * @return {boolean} True if the widget is collapsible.\n * @api\n */\n getCollapsible() {\n return this.collapsible_;\n }\n\n /**\n * Set whether the attribution should be collapsible.\n * @param {boolean} collapsible True if the widget is collapsible.\n * @api\n */\n setCollapsible(collapsible) {\n if (this.collapsible_ === collapsible) {\n return;\n }\n this.collapsible_ = collapsible;\n this.element.classList.toggle('ol-uncollapsible');\n if (this.userCollapsed_) {\n this.handleToggle_();\n }\n }\n\n /**\n * Collapse or expand the attribution according to the passed parameter. Will\n * not do anything if the attribution isn't collapsible or if the current\n * collapsed state is already the one requested.\n * @param {boolean} collapsed True if the widget is collapsed.\n * @api\n */\n setCollapsed(collapsed) {\n this.userCollapsed_ = collapsed;\n if (!this.collapsible_ || this.collapsed_ === collapsed) {\n return;\n }\n this.handleToggle_();\n }\n\n /**\n * Return `true` when the attribution is currently collapsed or `false`\n * otherwise.\n * @return {boolean} True if the widget is collapsed.\n * @api\n */\n getCollapsed() {\n return this.collapsed_;\n }\n\n /**\n * Update the attribution element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(mapEvent) {\n this.updateElement_(mapEvent.frameState);\n }\n}\n\nexport default Attribution;\n", "/**\n * @module ol/control/Rotate\n */\nimport Control from './Control.js';\nimport EventType from '../events/EventType.js';\nimport {CLASS_CONTROL, CLASS_HIDDEN, CLASS_UNSELECTABLE} from '../css.js';\nimport {easeOut} from '../easing.js';\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-rotate'] CSS class name.\n * @property {string|HTMLElement} [label='\u21E7'] Text label to use for the rotate button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [tipLabel='Reset rotation'] Text label to use for the rotate tip.\n * @property {string} [compassClassName='ol-compass'] CSS class name for the compass.\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {boolean} [autoHide=true] Hide the control when rotation is 0.\n * @property {function(import(\"../MapEvent.js\").default):void} [render] Function called when the control should\n * be re-rendered. This is called in a `requestAnimationFrame` callback.\n * @property {function():void} [resetNorth] Function called when the control is clicked.\n * This will override the default `resetNorth`.\n * @property {HTMLElement|string} [target] Specify a target if you want the control to be\n * rendered outside of the map's viewport.\n */\n\n/**\n * @classdesc\n * A button control to reset rotation to 0.\n * To style this control use css selector `.ol-rotate`. A `.ol-hidden` css\n * selector is added to the button when the rotation is 0.\n *\n * @api\n */\nclass Rotate extends Control {\n /**\n * @param {Options} [options] Rotate options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super({\n element: document.createElement('div'),\n render: options.render,\n target: options.target,\n });\n\n const className =\n options.className !== undefined ? options.className : 'ol-rotate';\n\n const label = options.label !== undefined ? options.label : '\\u21E7';\n\n const compassClassName =\n options.compassClassName !== undefined\n ? options.compassClassName\n : 'ol-compass';\n\n /**\n * @type {HTMLElement}\n * @private\n */\n this.label_ = null;\n\n if (typeof label === 'string') {\n this.label_ = document.createElement('span');\n this.label_.className = compassClassName;\n this.label_.textContent = label;\n } else {\n this.label_ = label;\n this.label_.classList.add(compassClassName);\n }\n\n const tipLabel = options.tipLabel ? options.tipLabel : 'Reset rotation';\n\n const button = document.createElement('button');\n button.className = className + '-reset';\n button.setAttribute('type', 'button');\n button.title = tipLabel;\n button.appendChild(this.label_);\n\n button.addEventListener(\n EventType.CLICK,\n this.handleClick_.bind(this),\n false\n );\n\n const cssClasses =\n className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL;\n const element = this.element;\n element.className = cssClasses;\n element.appendChild(button);\n\n this.callResetNorth_ = options.resetNorth ? options.resetNorth : undefined;\n\n /**\n * @type {number}\n * @private\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n\n /**\n * @type {boolean}\n * @private\n */\n this.autoHide_ = options.autoHide !== undefined ? options.autoHide : true;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.rotation_ = undefined;\n\n if (this.autoHide_) {\n this.element.classList.add(CLASS_HIDDEN);\n }\n }\n\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(event) {\n event.preventDefault();\n if (this.callResetNorth_ !== undefined) {\n this.callResetNorth_();\n } else {\n this.resetNorth_();\n }\n }\n\n /**\n * @private\n */\n resetNorth_() {\n const map = this.getMap();\n const view = map.getView();\n if (!view) {\n // the map does not have a view, so we can't act\n // upon it\n return;\n }\n const rotation = view.getRotation();\n if (rotation !== undefined) {\n if (this.duration_ > 0 && rotation % (2 * Math.PI) !== 0) {\n view.animate({\n rotation: 0,\n duration: this.duration_,\n easing: easeOut,\n });\n } else {\n view.setRotation(0);\n }\n }\n }\n\n /**\n * Update the rotate control element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(mapEvent) {\n const frameState = mapEvent.frameState;\n if (!frameState) {\n return;\n }\n const rotation = frameState.viewState.rotation;\n if (rotation != this.rotation_) {\n const transform = 'rotate(' + rotation + 'rad)';\n if (this.autoHide_) {\n const contains = this.element.classList.contains(CLASS_HIDDEN);\n if (!contains && rotation === 0) {\n this.element.classList.add(CLASS_HIDDEN);\n } else if (contains && rotation !== 0) {\n this.element.classList.remove(CLASS_HIDDEN);\n }\n }\n this.label_.style.transform = transform;\n }\n this.rotation_ = rotation;\n }\n}\n\nexport default Rotate;\n", "/**\n * @module ol/control/Zoom\n */\nimport Control from './Control.js';\nimport EventType from '../events/EventType.js';\nimport {CLASS_CONTROL, CLASS_UNSELECTABLE} from '../css.js';\nimport {easeOut} from '../easing.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {string} [className='ol-zoom'] CSS class name.\n * @property {string} [zoomInClassName=className + '-in'] CSS class name for the zoom-in button.\n * @property {string} [zoomOutClassName=className + '-out'] CSS class name for the zoom-out button.\n * @property {string|HTMLElement} [zoomInLabel='+'] Text label to use for the zoom-in\n * button. Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string|HTMLElement} [zoomOutLabel='\u2013'] Text label to use for the zoom-out button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [zoomInTipLabel='Zoom in'] Text label to use for the button tip.\n * @property {string} [zoomOutTipLabel='Zoom out'] Text label to use for the button tip.\n * @property {number} [delta=1] The zoom delta applied on each click.\n * @property {HTMLElement|string} [target] Specify a target if you want the control to be\n * rendered outside of the map's viewport.\n */\n\n/**\n * @classdesc\n * A control with 2 buttons, one for zoom in and one for zoom out.\n * This control is one of the default controls of a map. To style this control\n * use css selectors `.ol-zoom-in` and `.ol-zoom-out`.\n *\n * @api\n */\nclass Zoom extends Control {\n /**\n * @param {Options} [options] Zoom options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super({\n element: document.createElement('div'),\n target: options.target,\n });\n\n const className =\n options.className !== undefined ? options.className : 'ol-zoom';\n\n const delta = options.delta !== undefined ? options.delta : 1;\n\n const zoomInClassName =\n options.zoomInClassName !== undefined\n ? options.zoomInClassName\n : className + '-in';\n\n const zoomOutClassName =\n options.zoomOutClassName !== undefined\n ? options.zoomOutClassName\n : className + '-out';\n\n const zoomInLabel =\n options.zoomInLabel !== undefined ? options.zoomInLabel : '+';\n const zoomOutLabel =\n options.zoomOutLabel !== undefined ? options.zoomOutLabel : '\\u2013';\n\n const zoomInTipLabel =\n options.zoomInTipLabel !== undefined ? options.zoomInTipLabel : 'Zoom in';\n const zoomOutTipLabel =\n options.zoomOutTipLabel !== undefined\n ? options.zoomOutTipLabel\n : 'Zoom out';\n\n const inElement = document.createElement('button');\n inElement.className = zoomInClassName;\n inElement.setAttribute('type', 'button');\n inElement.title = zoomInTipLabel;\n inElement.appendChild(\n typeof zoomInLabel === 'string'\n ? document.createTextNode(zoomInLabel)\n : zoomInLabel\n );\n\n inElement.addEventListener(\n EventType.CLICK,\n this.handleClick_.bind(this, delta),\n false\n );\n\n const outElement = document.createElement('button');\n outElement.className = zoomOutClassName;\n outElement.setAttribute('type', 'button');\n outElement.title = zoomOutTipLabel;\n outElement.appendChild(\n typeof zoomOutLabel === 'string'\n ? document.createTextNode(zoomOutLabel)\n : zoomOutLabel\n );\n\n outElement.addEventListener(\n EventType.CLICK,\n this.handleClick_.bind(this, -delta),\n false\n );\n\n const cssClasses =\n className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL;\n const element = this.element;\n element.className = cssClasses;\n element.appendChild(inElement);\n element.appendChild(outElement);\n\n /**\n * @type {number}\n * @private\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n }\n\n /**\n * @param {number} delta Zoom delta.\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(delta, event) {\n event.preventDefault();\n this.zoomByDelta_(delta);\n }\n\n /**\n * @param {number} delta Zoom delta.\n * @private\n */\n zoomByDelta_(delta) {\n const map = this.getMap();\n const view = map.getView();\n if (!view) {\n // the map does not have a view, so we can't act\n // upon it\n return;\n }\n const currentZoom = view.getZoom();\n if (currentZoom !== undefined) {\n const newZoom = view.getConstrainedZoom(currentZoom + delta);\n if (this.duration_ > 0) {\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n view.animate({\n zoom: newZoom,\n duration: this.duration_,\n easing: easeOut,\n });\n } else {\n view.setZoom(newZoom);\n }\n }\n }\n}\n\nexport default Zoom;\n", "/**\n * @module ol/control/defaults\n */\nimport Attribution from './Attribution.js';\nimport Collection from '../Collection.js';\nimport Rotate from './Rotate.js';\nimport Zoom from './Zoom.js';\n\n/**\n * @typedef {Object} DefaultsOptions\n * @property {boolean} [attribution=true] Include\n * {@link module:ol/control/Attribution~Attribution}.\n * @property {import(\"./Attribution.js\").Options} [attributionOptions]\n * Options for {@link module:ol/control/Attribution~Attribution}.\n * @property {boolean} [rotate=true] Include\n * {@link module:ol/control/Rotate~Rotate}.\n * @property {import(\"./Rotate.js\").Options} [rotateOptions] Options\n * for {@link module:ol/control/Rotate~Rotate}.\n * @property {boolean} [zoom] Include {@link module:ol/control/Zoom~Zoom}.\n * @property {import(\"./Zoom.js\").Options} [zoomOptions] Options for\n * {@link module:ol/control/Zoom~Zoom}.\n */\n\n/**\n * Set of controls included in maps by default. Unless configured otherwise,\n * this returns a collection containing an instance of each of the following\n * controls:\n * * {@link module:ol/control/Zoom~Zoom}\n * * {@link module:ol/control/Rotate~Rotate}\n * * {@link module:ol/control/Attribution~Attribution}\n *\n * @param {DefaultsOptions} [options] Options for the default controls.\n * @return {Collection} A collection of controls\n * to be used with the {@link module:ol/Map~Map} constructor's `controls` option.\n * @api\n */\nexport function defaults(options) {\n options = options ? options : {};\n\n /** @type {Collection} */\n const controls = new Collection();\n\n const zoomControl = options.zoom !== undefined ? options.zoom : true;\n if (zoomControl) {\n controls.push(new Zoom(options.zoomOptions));\n }\n\n const rotateControl = options.rotate !== undefined ? options.rotate : true;\n if (rotateControl) {\n controls.push(new Rotate(options.rotateOptions));\n }\n\n const attributionControl =\n options.attribution !== undefined ? options.attribution : true;\n if (attributionControl) {\n controls.push(new Attribution(options.attributionOptions));\n }\n\n return controls;\n}\n", "/**\n * @module ol/interaction/Property\n */\n\n/**\n * @enum {string}\n */\nexport default {\n ACTIVE: 'active',\n};\n", "/**\n * @module ol/interaction/Interaction\n */\nimport BaseObject from '../Object.js';\nimport InteractionProperty from './Property.js';\nimport {easeOut, linear} from '../easing.js';\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature &\n * import(\"../Observable\").CombinedOnSignature} InteractionOnSignature\n */\n\n/**\n * Object literal with config options for interactions.\n * @typedef {Object} InteractionOptions\n * @property {function(import(\"../MapBrowserEvent.js\").default):boolean} handleEvent\n * Method called by the map to notify the interaction that a browser event was\n * dispatched to the map. If the function returns a falsy value, propagation of\n * the event to other interactions in the map's interactions chain will be\n * prevented (this includes functions with no explicit return). The interactions\n * are traversed in reverse order of the interactions collection of the map.\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * User actions that change the state of the map. Some are similar to controls,\n * but are not associated with a DOM element.\n * For example, {@link module:ol/interaction/KeyboardZoom~KeyboardZoom} is\n * functionally the same as {@link module:ol/control/Zoom~Zoom}, but triggered\n * by a keyboard event not a button element event.\n * Although interactions do not have a DOM element, some of them do render\n * vectors and so are visible on the screen.\n * @api\n */\nclass Interaction extends BaseObject {\n /**\n * @param {InteractionOptions} [options] Options.\n */\n constructor(options) {\n super();\n\n /***\n * @type {InteractionOnSignature}\n */\n this.on;\n\n /***\n * @type {InteractionOnSignature}\n */\n this.once;\n\n /***\n * @type {InteractionOnSignature}\n */\n this.un;\n\n if (options && options.handleEvent) {\n this.handleEvent = options.handleEvent;\n }\n\n /**\n * @private\n * @type {import(\"../Map.js\").default|null}\n */\n this.map_ = null;\n\n this.setActive(true);\n }\n\n /**\n * Return whether the interaction is currently active.\n * @return {boolean} `true` if the interaction is active, `false` otherwise.\n * @observable\n * @api\n */\n getActive() {\n return /** @type {boolean} */ (this.get(InteractionProperty.ACTIVE));\n }\n\n /**\n * Get the map associated with this interaction.\n * @return {import(\"../Map.js\").default|null} Map.\n * @api\n */\n getMap() {\n return this.map_;\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event}.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n */\n handleEvent(mapBrowserEvent) {\n return true;\n }\n\n /**\n * Activate or deactivate the interaction.\n * @param {boolean} active Active.\n * @observable\n * @api\n */\n setActive(active) {\n this.set(InteractionProperty.ACTIVE, active);\n }\n\n /**\n * Remove the interaction from its current map and attach it to the new map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMap(map) {\n this.map_ = map;\n }\n}\n\n/**\n * @param {import(\"../View.js\").default} view View.\n * @param {import(\"../coordinate.js\").Coordinate} delta Delta.\n * @param {number} [duration] Duration.\n */\nexport function pan(view, delta, duration) {\n const currentCenter = view.getCenterInternal();\n if (currentCenter) {\n const center = [currentCenter[0] + delta[0], currentCenter[1] + delta[1]];\n view.animateInternal({\n duration: duration !== undefined ? duration : 250,\n easing: linear,\n center: view.getConstrainedCenter(center),\n });\n }\n}\n\n/**\n * @param {import(\"../View.js\").default} view View.\n * @param {number} delta Delta from previous zoom level.\n * @param {import(\"../coordinate.js\").Coordinate} [anchor] Anchor coordinate in the user projection.\n * @param {number} [duration] Duration.\n */\nexport function zoomByDelta(view, delta, anchor, duration) {\n const currentZoom = view.getZoom();\n\n if (currentZoom === undefined) {\n return;\n }\n\n const newZoom = view.getConstrainedZoom(currentZoom + delta);\n const newResolution = view.getResolutionForZoom(newZoom);\n\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n view.animate({\n resolution: newResolution,\n anchor: anchor,\n duration: duration !== undefined ? duration : 250,\n easing: easeOut,\n });\n}\n\nexport default Interaction;\n", "/**\n * @module ol/interaction/DoubleClickZoom\n */\nimport Interaction, {zoomByDelta} from './Interaction.js';\nimport MapBrowserEventType from '../MapBrowserEventType.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {number} [delta=1] The zoom delta applied on each double click.\n */\n\n/**\n * @classdesc\n * Allows the user to zoom by double-clicking on the map.\n * @api\n */\nclass DoubleClickZoom extends Interaction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super();\n\n options = options ? options : {};\n\n /**\n * @private\n * @type {number}\n */\n this.delta_ = options.delta ? options.delta : 1;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a\n * doubleclick) and eventually zooms the map.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(mapBrowserEvent) {\n let stopEvent = false;\n if (mapBrowserEvent.type == MapBrowserEventType.DBLCLICK) {\n const browserEvent = /** @type {MouseEvent} */ (\n mapBrowserEvent.originalEvent\n );\n const map = mapBrowserEvent.map;\n const anchor = mapBrowserEvent.coordinate;\n const delta = browserEvent.shiftKey ? -this.delta_ : this.delta_;\n const view = map.getView();\n zoomByDelta(view, delta, anchor, this.duration_);\n browserEvent.preventDefault();\n stopEvent = true;\n }\n return !stopEvent;\n }\n}\n\nexport default DoubleClickZoom;\n", "/**\n * @module ol/interaction/Pointer\n */\nimport Interaction from './Interaction.js';\nimport MapBrowserEventType from '../MapBrowserEventType.js';\n\n/**\n * @typedef {Object} Options\n * @property {function(import(\"../MapBrowserEvent.js\").default):boolean} [handleDownEvent]\n * Function handling \"down\" events. If the function returns `true` then a drag\n * sequence is started.\n * @property {function(import(\"../MapBrowserEvent.js\").default):void} [handleDragEvent]\n * Function handling \"drag\" events. This function is called on \"move\" events\n * during a drag sequence.\n * @property {function(import(\"../MapBrowserEvent.js\").default):boolean} [handleEvent]\n * Method called by the map to notify the interaction that a browser event was\n * dispatched to the map. The function may return `false` to prevent the\n * propagation of the event to other interactions in the map's interactions\n * chain.\n * @property {function(import(\"../MapBrowserEvent.js\").default):void} [handleMoveEvent]\n * Function handling \"move\" events. This function is called on \"move\" events.\n * This functions is also called during a drag sequence, so during a drag\n * sequence both the `handleDragEvent` function and this function are called.\n * If `handleDownEvent` is defined and it returns true this function will not\n * be called during a drag sequence.\n * @property {function(import(\"../MapBrowserEvent.js\").default):boolean} [handleUpEvent]\n * Function handling \"up\" events. If the function returns `false` then the\n * current drag sequence is stopped.\n * @property {function(boolean):boolean} [stopDown]\n * Should the down event be propagated to other interactions, or should be\n * stopped?\n */\n\n/**\n * @classdesc\n * Base class that calls user-defined functions on `down`, `move` and `up`\n * events. This class also manages \"drag sequences\".\n *\n * When the `handleDownEvent` user function returns `true` a drag sequence is\n * started. During a drag sequence the `handleDragEvent` user function is\n * called on `move` events. The drag sequence ends when the `handleUpEvent`\n * user function is called and returns `false`.\n * @api\n */\nclass PointerInteraction extends Interaction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super(\n /** @type {import(\"./Interaction.js\").InteractionOptions} */ (options)\n );\n\n if (options.handleDownEvent) {\n this.handleDownEvent = options.handleDownEvent;\n }\n\n if (options.handleDragEvent) {\n this.handleDragEvent = options.handleDragEvent;\n }\n\n if (options.handleMoveEvent) {\n this.handleMoveEvent = options.handleMoveEvent;\n }\n\n if (options.handleUpEvent) {\n this.handleUpEvent = options.handleUpEvent;\n }\n\n if (options.stopDown) {\n this.stopDown = options.stopDown;\n }\n\n /**\n * @type {boolean}\n * @protected\n */\n this.handlingDownUpSequence = false;\n\n /**\n * @type {Array}\n * @protected\n */\n this.targetPointers = [];\n }\n\n /**\n * Returns the current number of pointers involved in the interaction,\n * e.g. `2` when two fingers are used.\n * @return {number} The number of pointers.\n * @api\n */\n getPointerCount() {\n return this.targetPointers.length;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @protected\n */\n handleDownEvent(mapBrowserEvent) {\n return false;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @protected\n */\n handleDragEvent(mapBrowserEvent) {}\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} and may call into\n * other functions, if event sequences like e.g. 'drag' or 'down-up' etc. are\n * detected.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n */\n handleEvent(mapBrowserEvent) {\n if (!mapBrowserEvent.originalEvent) {\n return true;\n }\n\n let stopEvent = false;\n this.updateTrackedPointers_(mapBrowserEvent);\n if (this.handlingDownUpSequence) {\n if (mapBrowserEvent.type == MapBrowserEventType.POINTERDRAG) {\n this.handleDragEvent(mapBrowserEvent);\n // prevent page scrolling during dragging\n mapBrowserEvent.originalEvent.preventDefault();\n } else if (mapBrowserEvent.type == MapBrowserEventType.POINTERUP) {\n const handledUp = this.handleUpEvent(mapBrowserEvent);\n this.handlingDownUpSequence =\n handledUp && this.targetPointers.length > 0;\n }\n } else {\n if (mapBrowserEvent.type == MapBrowserEventType.POINTERDOWN) {\n const handled = this.handleDownEvent(mapBrowserEvent);\n this.handlingDownUpSequence = handled;\n stopEvent = this.stopDown(handled);\n } else if (mapBrowserEvent.type == MapBrowserEventType.POINTERMOVE) {\n this.handleMoveEvent(mapBrowserEvent);\n }\n }\n return !stopEvent;\n }\n\n /**\n * Handle pointer move events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @protected\n */\n handleMoveEvent(mapBrowserEvent) {}\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @protected\n */\n handleUpEvent(mapBrowserEvent) {\n return false;\n }\n\n /**\n * This function is used to determine if \"down\" events should be propagated\n * to other interactions or should be stopped.\n * @param {boolean} handled Was the event handled by the interaction?\n * @return {boolean} Should the `down` event be stopped?\n */\n stopDown(handled) {\n return handled;\n }\n\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @private\n */\n updateTrackedPointers_(mapBrowserEvent) {\n if (mapBrowserEvent.activePointers) {\n this.targetPointers = mapBrowserEvent.activePointers;\n }\n }\n}\n\n/**\n * @param {Array} pointerEvents List of events.\n * @return {{clientX: number, clientY: number}} Centroid pixel.\n */\nexport function centroid(pointerEvents) {\n const length = pointerEvents.length;\n let clientX = 0;\n let clientY = 0;\n for (let i = 0; i < length; i++) {\n clientX += pointerEvents[i].clientX;\n clientY += pointerEvents[i].clientY;\n }\n return {clientX: clientX / length, clientY: clientY / length};\n}\n\nexport default PointerInteraction;\n", "/**\n * @module ol/events/condition\n */\nimport MapBrowserEventType from '../MapBrowserEventType.js';\nimport {FALSE, TRUE} from '../functions.js';\nimport {MAC, WEBKIT} from '../has.js';\nimport {assert} from '../asserts.js';\n\n/**\n * A function that takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * `{boolean}`. If the condition is met, true should be returned.\n *\n * @typedef {function(this: ?, import(\"../MapBrowserEvent.js\").default): boolean} Condition\n */\n\n/**\n * Creates a condition function that passes when all provided conditions pass.\n * @param {...Condition} var_args Conditions to check.\n * @return {Condition} Condition function.\n */\nexport function all(var_args) {\n const conditions = arguments;\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n * @return {boolean} All conditions passed.\n */\n return function (event) {\n let pass = true;\n for (let i = 0, ii = conditions.length; i < ii; ++i) {\n pass = pass && conditions[i](event);\n if (!pass) {\n break;\n }\n }\n return pass;\n };\n}\n\n/**\n * Return `true` if only the alt-key is pressed, `false` otherwise (e.g. when\n * additionally the shift-key is pressed).\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the alt key is pressed.\n * @api\n */\nexport const altKeyOnly = function (mapBrowserEvent) {\n const originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (\n mapBrowserEvent.originalEvent\n );\n return (\n originalEvent.altKey &&\n !(originalEvent.metaKey || originalEvent.ctrlKey) &&\n !originalEvent.shiftKey\n );\n};\n\n/**\n * Return `true` if only the alt-key and shift-key is pressed, `false` otherwise\n * (e.g. when additionally the platform-modifier-key is pressed).\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the alt and shift keys are pressed.\n * @api\n */\nexport const altShiftKeysOnly = function (mapBrowserEvent) {\n const originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (\n mapBrowserEvent.originalEvent\n );\n return (\n originalEvent.altKey &&\n !(originalEvent.metaKey || originalEvent.ctrlKey) &&\n originalEvent.shiftKey\n );\n};\n\n/**\n * Return `true` if the map has the focus. This condition requires a map target\n * element with a `tabindex` attribute, e.g. `
`.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} event Map browser event.\n * @return {boolean} The map has the focus.\n * @api\n */\nexport const focus = function (event) {\n const targetElement = event.map.getTargetElement();\n const activeElement = event.map.getOwnerDocument().activeElement;\n return targetElement.contains(activeElement);\n};\n\n/**\n * Return `true` if the map has the focus or no 'tabindex' attribute set.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} event Map browser event.\n * @return {boolean} The map container has the focus or no 'tabindex' attribute.\n */\nexport const focusWithTabindex = function (event) {\n return event.map.getTargetElement().hasAttribute('tabindex')\n ? focus(event)\n : true;\n};\n\n/**\n * Return always true.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True.\n * @api\n */\nexport const always = TRUE;\n\n/**\n * Return `true` if the event is a `click` event, `false` otherwise.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event is a map `click` event.\n * @api\n */\nexport const click = function (mapBrowserEvent) {\n return mapBrowserEvent.type == MapBrowserEventType.CLICK;\n};\n\n/**\n * Return `true` if the event has an \"action\"-producing mouse button.\n *\n * By definition, this includes left-click on windows/linux, and left-click\n * without the ctrl key on Macs.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} The result.\n */\nexport const mouseActionButton = function (mapBrowserEvent) {\n const originalEvent = /** @type {MouseEvent} */ (\n mapBrowserEvent.originalEvent\n );\n return originalEvent.button == 0 && !(WEBKIT && MAC && originalEvent.ctrlKey);\n};\n\n/**\n * Return always false.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} False.\n * @api\n */\nexport const never = FALSE;\n\n/**\n * Return `true` if the browser event is a `pointermove` event, `false`\n * otherwise.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the browser event is a `pointermove` event.\n * @api\n */\nexport const pointerMove = function (mapBrowserEvent) {\n return mapBrowserEvent.type == 'pointermove';\n};\n\n/**\n * Return `true` if the event is a map `singleclick` event, `false` otherwise.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event is a map `singleclick` event.\n * @api\n */\nexport const singleClick = function (mapBrowserEvent) {\n return mapBrowserEvent.type == MapBrowserEventType.SINGLECLICK;\n};\n\n/**\n * Return `true` if the event is a map `dblclick` event, `false` otherwise.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event is a map `dblclick` event.\n * @api\n */\nexport const doubleClick = function (mapBrowserEvent) {\n return mapBrowserEvent.type == MapBrowserEventType.DBLCLICK;\n};\n\n/**\n * Return `true` if no modifier key (alt-, shift- or platform-modifier-key) is\n * pressed.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True only if there no modifier keys are pressed.\n * @api\n */\nexport const noModifierKeys = function (mapBrowserEvent) {\n const originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (\n mapBrowserEvent.originalEvent\n );\n return (\n !originalEvent.altKey &&\n !(originalEvent.metaKey || originalEvent.ctrlKey) &&\n !originalEvent.shiftKey\n );\n};\n\n/**\n * Return `true` if only the platform-modifier-key (the meta-key on Mac,\n * ctrl-key otherwise) is pressed, `false` otherwise (e.g. when additionally\n * the shift-key is pressed).\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the platform modifier key is pressed.\n * @api\n */\nexport const platformModifierKeyOnly = function (mapBrowserEvent) {\n const originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (\n mapBrowserEvent.originalEvent\n );\n return (\n !originalEvent.altKey &&\n (MAC ? originalEvent.metaKey : originalEvent.ctrlKey) &&\n !originalEvent.shiftKey\n );\n};\n\n/**\n * Return `true` if the platform-modifier-key (the meta-key on Mac,\n * ctrl-key otherwise) is pressed.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the platform modifier key is pressed.\n * @api\n */\nexport const platformModifierKey = function (mapBrowserEvent) {\n const originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (\n mapBrowserEvent.originalEvent\n );\n return MAC ? originalEvent.metaKey : originalEvent.ctrlKey;\n};\n\n/**\n * Return `true` if only the shift-key is pressed, `false` otherwise (e.g. when\n * additionally the alt-key is pressed).\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the shift key is pressed.\n * @api\n */\nexport const shiftKeyOnly = function (mapBrowserEvent) {\n const originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (\n mapBrowserEvent.originalEvent\n );\n return (\n !originalEvent.altKey &&\n !(originalEvent.metaKey || originalEvent.ctrlKey) &&\n originalEvent.shiftKey\n );\n};\n\n/**\n * Return `true` if the target element is not editable, i.e. not an `input`,\n * `select`, or `textarea` element and no `contenteditable` attribute is\n * set or inherited, `false` otherwise.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True only if the target element is not editable.\n * @api\n */\nexport const targetNotEditable = function (mapBrowserEvent) {\n const originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (\n mapBrowserEvent.originalEvent\n );\n const tagName = /** @type {Element} */ (originalEvent.target).tagName;\n return (\n tagName !== 'INPUT' &&\n tagName !== 'SELECT' &&\n tagName !== 'TEXTAREA' &&\n // `isContentEditable` is only available on `HTMLElement`, but it may also be a\n // different type like `SVGElement`.\n // @ts-ignore\n !originalEvent.target.isContentEditable\n );\n};\n\n/**\n * Return `true` if the event originates from a mouse device.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event originates from a mouse device.\n * @api\n */\nexport const mouseOnly = function (mapBrowserEvent) {\n const pointerEvent = /** @type {import(\"../MapBrowserEvent\").default} */ (\n mapBrowserEvent\n ).originalEvent;\n assert(pointerEvent !== undefined, 56); // mapBrowserEvent must originate from a pointer event\n // see https://www.w3.org/TR/pointerevents/#widl-PointerEvent-pointerType\n return pointerEvent.pointerType == 'mouse';\n};\n\n/**\n * Return `true` if the event originates from a touchable device.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event originates from a touchable device.\n * @api\n */\nexport const touchOnly = function (mapBrowserEvent) {\n const pointerEvt = /** @type {import(\"../MapBrowserEvent\").default} */ (\n mapBrowserEvent\n ).originalEvent;\n assert(pointerEvt !== undefined, 56); // mapBrowserEvent must originate from a pointer event\n // see https://www.w3.org/TR/pointerevents/#widl-PointerEvent-pointerType\n return pointerEvt.pointerType === 'touch';\n};\n\n/**\n * Return `true` if the event originates from a digital pen.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event originates from a digital pen.\n * @api\n */\nexport const penOnly = function (mapBrowserEvent) {\n const pointerEvt = /** @type {import(\"../MapBrowserEvent\").default} */ (\n mapBrowserEvent\n ).originalEvent;\n assert(pointerEvt !== undefined, 56); // mapBrowserEvent must originate from a pointer event\n // see https://www.w3.org/TR/pointerevents/#widl-PointerEvent-pointerType\n return pointerEvt.pointerType === 'pen';\n};\n\n/**\n * Return `true` if the event originates from a primary pointer in\n * contact with the surface or if the left mouse button is pressed.\n * See https://www.w3.org/TR/pointerevents/#button-states.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event originates from a primary pointer.\n * @api\n */\nexport const primaryAction = function (mapBrowserEvent) {\n const pointerEvent = /** @type {import(\"../MapBrowserEvent\").default} */ (\n mapBrowserEvent\n ).originalEvent;\n assert(pointerEvent !== undefined, 56); // mapBrowserEvent must originate from a pointer event\n return pointerEvent.isPrimary && pointerEvent.button === 0;\n};\n", "/**\n * @module ol/interaction/DragPan\n */\nimport PointerInteraction, {\n centroid as centroidFromPointers,\n} from './Pointer.js';\nimport {FALSE} from '../functions.js';\nimport {\n all,\n focusWithTabindex,\n noModifierKeys,\n primaryAction,\n} from '../events/condition.js';\nimport {easeOut} from '../easing.js';\nimport {\n rotate as rotateCoordinate,\n scale as scaleCoordinate,\n} from '../coordinate.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a boolean\n * to indicate whether that event should be handled.\n * Default is {@link module:ol/events/condition.noModifierKeys} and {@link module:ol/events/condition.primaryAction}.\n * @property {boolean} [onFocusOnly=false] When the map's target has a `tabindex` attribute set,\n * the interaction will only handle events when the map has the focus.\n * @property {import(\"../Kinetic.js\").default} [kinetic] Kinetic inertia to apply to the pan.\n */\n\n/**\n * @classdesc\n * Allows the user to pan the map by dragging the map.\n * @api\n */\nclass DragPan extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super({\n stopDown: FALSE,\n });\n\n options = options ? options : {};\n\n /**\n * @private\n * @type {import(\"../Kinetic.js\").default|undefined}\n */\n this.kinetic_ = options.kinetic;\n\n /**\n * @type {import(\"../pixel.js\").Pixel}\n */\n this.lastCentroid = null;\n\n /**\n * @type {number}\n */\n this.lastPointersCount_;\n\n /**\n * @type {boolean}\n */\n this.panning_ = false;\n\n const condition = options.condition\n ? options.condition\n : all(noModifierKeys, primaryAction);\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.onFocusOnly\n ? all(focusWithTabindex, condition)\n : condition;\n\n /**\n * @private\n * @type {boolean}\n */\n this.noKinetic_ = false;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(mapBrowserEvent) {\n const map = mapBrowserEvent.map;\n if (!this.panning_) {\n this.panning_ = true;\n map.getView().beginInteraction();\n }\n const targetPointers = this.targetPointers;\n const centroid = map.getEventPixel(centroidFromPointers(targetPointers));\n if (targetPointers.length == this.lastPointersCount_) {\n if (this.kinetic_) {\n this.kinetic_.update(centroid[0], centroid[1]);\n }\n if (this.lastCentroid) {\n const delta = [\n this.lastCentroid[0] - centroid[0],\n centroid[1] - this.lastCentroid[1],\n ];\n const map = mapBrowserEvent.map;\n const view = map.getView();\n scaleCoordinate(delta, view.getResolution());\n rotateCoordinate(delta, view.getRotation());\n view.adjustCenterInternal(delta);\n }\n } else if (this.kinetic_) {\n // reset so we don't overestimate the kinetic energy after\n // after one finger down, tiny drag, second finger down\n this.kinetic_.begin();\n }\n this.lastCentroid = centroid;\n this.lastPointersCount_ = targetPointers.length;\n mapBrowserEvent.originalEvent.preventDefault();\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(mapBrowserEvent) {\n const map = mapBrowserEvent.map;\n const view = map.getView();\n if (this.targetPointers.length === 0) {\n if (!this.noKinetic_ && this.kinetic_ && this.kinetic_.end()) {\n const distance = this.kinetic_.getDistance();\n const angle = this.kinetic_.getAngle();\n const center = view.getCenterInternal();\n const centerpx = map.getPixelFromCoordinateInternal(center);\n const dest = map.getCoordinateFromPixelInternal([\n centerpx[0] - distance * Math.cos(angle),\n centerpx[1] - distance * Math.sin(angle),\n ]);\n view.animateInternal({\n center: view.getConstrainedCenter(dest),\n duration: 500,\n easing: easeOut,\n });\n }\n if (this.panning_) {\n this.panning_ = false;\n view.endInteraction();\n }\n return false;\n }\n if (this.kinetic_) {\n // reset so we don't overestimate the kinetic energy after\n // after one finger up, tiny drag, second finger up\n this.kinetic_.begin();\n }\n this.lastCentroid = null;\n return true;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(mapBrowserEvent) {\n if (this.targetPointers.length > 0 && this.condition_(mapBrowserEvent)) {\n const map = mapBrowserEvent.map;\n const view = map.getView();\n this.lastCentroid = null;\n // stop any current animation\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n if (this.kinetic_) {\n this.kinetic_.begin();\n }\n // No kinetic as soon as more than one pointer on the screen is\n // detected. This is to prevent nasty pans after pinch.\n this.noKinetic_ = this.targetPointers.length > 1;\n return true;\n }\n return false;\n }\n}\n\nexport default DragPan;\n", "/**\n * @module ol/interaction/DragRotate\n */\nimport PointerInteraction from './Pointer.js';\nimport {FALSE} from '../functions.js';\nimport {\n altShiftKeysOnly,\n mouseActionButton,\n mouseOnly,\n} from '../events/condition.js';\nimport {disable} from '../rotationconstraint.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that takes an\n * {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a boolean\n * to indicate whether that event should be handled.\n * Default is {@link module:ol/events/condition.altShiftKeysOnly}.\n * @property {number} [duration=250] Animation duration in milliseconds.\n */\n\n/**\n * @classdesc\n * Allows the user to rotate the map by clicking and dragging on the map,\n * normally combined with an {@link module:ol/events/condition} that limits\n * it to when the alt and shift keys are held down.\n *\n * This interaction is only supported for mouse devices.\n * @api\n */\nclass DragRotate extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super({\n stopDown: FALSE,\n });\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.condition ? options.condition : altShiftKeysOnly;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.lastAngle_ = undefined;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(mapBrowserEvent) {\n if (!mouseOnly(mapBrowserEvent)) {\n return;\n }\n\n const map = mapBrowserEvent.map;\n const view = map.getView();\n if (view.getConstraints().rotation === disable) {\n return;\n }\n const size = map.getSize();\n const offset = mapBrowserEvent.pixel;\n const theta = Math.atan2(size[1] / 2 - offset[1], offset[0] - size[0] / 2);\n if (this.lastAngle_ !== undefined) {\n const delta = theta - this.lastAngle_;\n view.adjustRotationInternal(-delta);\n }\n this.lastAngle_ = theta;\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(mapBrowserEvent) {\n if (!mouseOnly(mapBrowserEvent)) {\n return true;\n }\n\n const map = mapBrowserEvent.map;\n const view = map.getView();\n view.endInteraction(this.duration_);\n return false;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(mapBrowserEvent) {\n if (!mouseOnly(mapBrowserEvent)) {\n return false;\n }\n\n if (\n mouseActionButton(mapBrowserEvent) &&\n this.condition_(mapBrowserEvent)\n ) {\n const map = mapBrowserEvent.map;\n map.getView().beginInteraction();\n this.lastAngle_ = undefined;\n return true;\n }\n return false;\n }\n}\n\nexport default DragRotate;\n", "/**\n * @module ol/render/Box\n */\n\nimport Disposable from '../Disposable.js';\nimport Polygon from '../geom/Polygon.js';\n\nclass RenderBox extends Disposable {\n /**\n * @param {string} className CSS class name.\n */\n constructor(className) {\n super();\n\n /**\n * @type {import(\"../geom/Polygon.js\").default}\n * @private\n */\n this.geometry_ = null;\n\n /**\n * @type {HTMLDivElement}\n * @private\n */\n this.element_ = document.createElement('div');\n this.element_.style.position = 'absolute';\n this.element_.style.pointerEvents = 'auto';\n this.element_.className = 'ol-box ' + className;\n\n /**\n * @private\n * @type {import(\"../Map.js\").default|null}\n */\n this.map_ = null;\n\n /**\n * @private\n * @type {import(\"../pixel.js\").Pixel}\n */\n this.startPixel_ = null;\n\n /**\n * @private\n * @type {import(\"../pixel.js\").Pixel}\n */\n this.endPixel_ = null;\n }\n\n /**\n * Clean up.\n */\n disposeInternal() {\n this.setMap(null);\n }\n\n /**\n * @private\n */\n render_() {\n const startPixel = this.startPixel_;\n const endPixel = this.endPixel_;\n const px = 'px';\n const style = this.element_.style;\n style.left = Math.min(startPixel[0], endPixel[0]) + px;\n style.top = Math.min(startPixel[1], endPixel[1]) + px;\n style.width = Math.abs(endPixel[0] - startPixel[0]) + px;\n style.height = Math.abs(endPixel[1] - startPixel[1]) + px;\n }\n\n /**\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMap(map) {\n if (this.map_) {\n this.map_.getOverlayContainer().removeChild(this.element_);\n const style = this.element_.style;\n style.left = 'inherit';\n style.top = 'inherit';\n style.width = 'inherit';\n style.height = 'inherit';\n }\n this.map_ = map;\n if (this.map_) {\n this.map_.getOverlayContainer().appendChild(this.element_);\n }\n }\n\n /**\n * @param {import(\"../pixel.js\").Pixel} startPixel Start pixel.\n * @param {import(\"../pixel.js\").Pixel} endPixel End pixel.\n */\n setPixels(startPixel, endPixel) {\n this.startPixel_ = startPixel;\n this.endPixel_ = endPixel;\n this.createOrUpdateGeometry();\n this.render_();\n }\n\n /**\n * Creates or updates the cached geometry.\n */\n createOrUpdateGeometry() {\n const startPixel = this.startPixel_;\n const endPixel = this.endPixel_;\n const pixels = [\n startPixel,\n [startPixel[0], endPixel[1]],\n endPixel,\n [endPixel[0], startPixel[1]],\n ];\n const coordinates = pixels.map(\n this.map_.getCoordinateFromPixelInternal,\n this.map_\n );\n // close the polygon\n coordinates[4] = coordinates[0].slice();\n if (!this.geometry_) {\n this.geometry_ = new Polygon([coordinates]);\n } else {\n this.geometry_.setCoordinates([coordinates]);\n }\n }\n\n /**\n * @return {import(\"../geom/Polygon.js\").default} Geometry.\n */\n getGeometry() {\n return this.geometry_;\n }\n}\n\nexport default RenderBox;\n", "/**\n * @module ol/interaction/DragBox\n */\n// FIXME draw drag box\nimport Event from '../events/Event.js';\nimport PointerInteraction from './Pointer.js';\nimport RenderBox from '../render/Box.js';\nimport {mouseActionButton} from '../events/condition.js';\n\n/**\n * A function that takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and two\n * {@link module:ol/pixel~Pixel}s and returns a `{boolean}`. If the condition is met,\n * true should be returned.\n * @typedef {function(this: ?, import(\"../MapBrowserEvent.js\").default, import(\"../pixel.js\").Pixel, import(\"../pixel.js\").Pixel):boolean} EndCondition\n */\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-dragbox'] CSS class name for styling the box.\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a boolean\n * to indicate whether that event should be handled.\n * Default is {@link ol/events/condition~mouseActionButton}.\n * @property {number} [minArea=64] The minimum area of the box in pixel, this value is used by the default\n * `boxEndCondition` function.\n * @property {EndCondition} [boxEndCondition] A function that takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and two\n * {@link module:ol/pixel~Pixel}s to indicate whether a `boxend` event should be fired.\n * Default is `true` if the area of the box is bigger than the `minArea` option.\n * @property {function(this:DragBox, import(\"../MapBrowserEvent.js\").default):void} [onBoxEnd] Code to execute just\n * before `boxend` is fired.\n */\n\n/**\n * @enum {string}\n */\nconst DragBoxEventType = {\n /**\n * Triggered upon drag box start.\n * @event DragBoxEvent#boxstart\n * @api\n */\n BOXSTART: 'boxstart',\n\n /**\n * Triggered on drag when box is active.\n * @event DragBoxEvent#boxdrag\n * @api\n */\n BOXDRAG: 'boxdrag',\n\n /**\n * Triggered upon drag box end.\n * @event DragBoxEvent#boxend\n * @api\n */\n BOXEND: 'boxend',\n\n /**\n * Triggered upon drag box canceled.\n * @event DragBoxEvent#boxcancel\n * @api\n */\n BOXCANCEL: 'boxcancel',\n};\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/interaction/DragBox~DragBox} instances are instances of\n * this type.\n */\nexport class DragBoxEvent extends Event {\n /**\n * @param {string} type The event type.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate The event coordinate.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Originating event.\n */\n constructor(type, coordinate, mapBrowserEvent) {\n super(type);\n\n /**\n * The coordinate of the drag event.\n * @const\n * @type {import(\"../coordinate.js\").Coordinate}\n * @api\n */\n this.coordinate = coordinate;\n\n /**\n * @const\n * @type {import(\"../MapBrowserEvent.js\").default}\n * @api\n */\n this.mapBrowserEvent = mapBrowserEvent;\n }\n}\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature<'boxcancel'|'boxdrag'|'boxend'|'boxstart', DragBoxEvent, Return> &\n * import(\"../Observable\").CombinedOnSignature} DragBoxOnSignature\n */\n\n/**\n * @classdesc\n * Allows the user to draw a vector box by clicking and dragging on the map,\n * normally combined with an {@link module:ol/events/condition} that limits\n * it to when the shift or other key is held down. This is used, for example,\n * for zooming to a specific area of the map\n * (see {@link module:ol/interaction/DragZoom~DragZoom} and\n * {@link module:ol/interaction/DragRotateAndZoom~DragRotateAndZoom}).\n *\n * @fires DragBoxEvent\n * @api\n */\nclass DragBox extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super();\n\n /***\n * @type {DragBoxOnSignature}\n */\n this.on;\n\n /***\n * @type {DragBoxOnSignature}\n */\n this.once;\n\n /***\n * @type {DragBoxOnSignature}\n */\n this.un;\n\n options = options ? options : {};\n\n /**\n * @type {import(\"../render/Box.js\").default}\n * @private\n */\n this.box_ = new RenderBox(options.className || 'ol-dragbox');\n\n /**\n * @type {number}\n * @private\n */\n this.minArea_ = options.minArea !== undefined ? options.minArea : 64;\n\n if (options.onBoxEnd) {\n this.onBoxEnd = options.onBoxEnd;\n }\n\n /**\n * @type {import(\"../pixel.js\").Pixel}\n * @private\n */\n this.startPixel_ = null;\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.condition ? options.condition : mouseActionButton;\n\n /**\n * @private\n * @type {EndCondition}\n */\n this.boxEndCondition_ = options.boxEndCondition\n ? options.boxEndCondition\n : this.defaultBoxEndCondition;\n }\n\n /**\n * The default condition for determining whether the boxend event\n * should fire.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent The originating MapBrowserEvent\n * leading to the box end.\n * @param {import(\"../pixel.js\").Pixel} startPixel The starting pixel of the box.\n * @param {import(\"../pixel.js\").Pixel} endPixel The end pixel of the box.\n * @return {boolean} Whether or not the boxend condition should be fired.\n */\n defaultBoxEndCondition(mapBrowserEvent, startPixel, endPixel) {\n const width = endPixel[0] - startPixel[0];\n const height = endPixel[1] - startPixel[1];\n return width * width + height * height >= this.minArea_;\n }\n\n /**\n * Returns geometry of last drawn box.\n * @return {import(\"../geom/Polygon.js\").default} Geometry.\n * @api\n */\n getGeometry() {\n return this.box_.getGeometry();\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(mapBrowserEvent) {\n this.box_.setPixels(this.startPixel_, mapBrowserEvent.pixel);\n\n this.dispatchEvent(\n new DragBoxEvent(\n DragBoxEventType.BOXDRAG,\n mapBrowserEvent.coordinate,\n mapBrowserEvent\n )\n );\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(mapBrowserEvent) {\n this.box_.setMap(null);\n\n const completeBox = this.boxEndCondition_(\n mapBrowserEvent,\n this.startPixel_,\n mapBrowserEvent.pixel\n );\n if (completeBox) {\n this.onBoxEnd(mapBrowserEvent);\n }\n this.dispatchEvent(\n new DragBoxEvent(\n completeBox ? DragBoxEventType.BOXEND : DragBoxEventType.BOXCANCEL,\n mapBrowserEvent.coordinate,\n mapBrowserEvent\n )\n );\n return false;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(mapBrowserEvent) {\n if (this.condition_(mapBrowserEvent)) {\n this.startPixel_ = mapBrowserEvent.pixel;\n this.box_.setMap(mapBrowserEvent.map);\n this.box_.setPixels(this.startPixel_, this.startPixel_);\n this.dispatchEvent(\n new DragBoxEvent(\n DragBoxEventType.BOXSTART,\n mapBrowserEvent.coordinate,\n mapBrowserEvent\n )\n );\n return true;\n }\n return false;\n }\n\n /**\n * Function to execute just before `onboxend` is fired\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n */\n onBoxEnd(event) {}\n}\n\nexport default DragBox;\n", "/**\n * @module ol/interaction/DragZoom\n */\nimport DragBox from './DragBox.js';\nimport {easeOut} from '../easing.js';\nimport {shiftKeyOnly} from '../events/condition.js';\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-dragzoom'] CSS class name for styling the\n * box.\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled.\n * Default is {@link module:ol/events/condition.shiftKeyOnly}.\n * @property {number} [duration=200] Animation duration in milliseconds.\n * @property {boolean} [out=false] Use interaction for zooming out.\n * @property {number} [minArea=64] The minimum area of the box in pixel, this value is used by the parent default\n * `boxEndCondition` function.\n */\n\n/**\n * @classdesc\n * Allows the user to zoom the map by clicking and dragging on the map,\n * normally combined with an {@link module:ol/events/condition} that limits\n * it to when a key, shift by default, is held down.\n *\n * To change the style of the box, use CSS and the `.ol-dragzoom` selector, or\n * your custom one configured with `className`.\n * @api\n */\nclass DragZoom extends DragBox {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const condition = options.condition ? options.condition : shiftKeyOnly;\n\n super({\n condition: condition,\n className: options.className || 'ol-dragzoom',\n minArea: options.minArea,\n });\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 200;\n\n /**\n * @private\n * @type {boolean}\n */\n this.out_ = options.out !== undefined ? options.out : false;\n }\n\n /**\n * Function to execute just before `onboxend` is fired\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n */\n onBoxEnd(event) {\n const map = this.getMap();\n const view = /** @type {!import(\"../View.js\").default} */ (map.getView());\n let geometry = this.getGeometry();\n\n if (this.out_) {\n const rotatedExtent = view.rotatedExtentForGeometry(geometry);\n const resolution = view.getResolutionForExtentInternal(rotatedExtent);\n const factor = view.getResolution() / resolution;\n geometry = geometry.clone();\n geometry.scale(factor * factor);\n }\n\n view.fitInternal(geometry, {\n duration: this.duration_,\n easing: easeOut,\n });\n }\n}\n\nexport default DragZoom;\n", "/**\n * @module ol/events/Key\n */\n\n/**\n * @enum {string}\n * @const\n */\nexport default {\n LEFT: 'ArrowLeft',\n UP: 'ArrowUp',\n RIGHT: 'ArrowRight',\n DOWN: 'ArrowDown',\n};\n", "/**\n * @module ol/interaction/KeyboardPan\n */\nimport EventType from '../events/EventType.js';\nimport Interaction, {pan} from './Interaction.js';\nimport Key from '../events/Key.js';\nimport {noModifierKeys, targetNotEditable} from '../events/condition.js';\nimport {rotate as rotateCoordinate} from '../coordinate.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled. Default is\n * {@link module:ol/events/condition.noModifierKeys} and\n * {@link module:ol/events/condition.targetNotEditable}.\n * @property {number} [duration=100] Animation duration in milliseconds.\n * @property {number} [pixelDelta=128] The amount of pixels to pan on each key\n * press.\n */\n\n/**\n * @classdesc\n * Allows the user to pan the map using keyboard arrows.\n * Note that, although this interaction is by default included in maps,\n * the keys can only be used when browser focus is on the element to which\n * the keyboard events are attached. By default, this is the map div,\n * though you can change this with the `keyboardEventTarget` in\n * {@link module:ol/Map~Map}. `document` never loses focus but, for any other\n * element, focus will have to be on, and returned to, this element if the keys\n * are to function.\n * See also {@link module:ol/interaction/KeyboardZoom~KeyboardZoom}.\n * @api\n */\nclass KeyboardPan extends Interaction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super();\n\n options = options || {};\n\n /**\n * @private\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Browser event.\n * @return {boolean} Combined condition result.\n */\n this.defaultCondition_ = function (mapBrowserEvent) {\n return (\n noModifierKeys(mapBrowserEvent) && targetNotEditable(mapBrowserEvent)\n );\n };\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ =\n options.condition !== undefined\n ? options.condition\n : this.defaultCondition_;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 100;\n\n /**\n * @private\n * @type {number}\n */\n this.pixelDelta_ =\n options.pixelDelta !== undefined ? options.pixelDelta : 128;\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} if it was a\n * `KeyEvent`, and decides the direction to pan to (if an arrow key was\n * pressed).\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(mapBrowserEvent) {\n let stopEvent = false;\n if (mapBrowserEvent.type == EventType.KEYDOWN) {\n const keyEvent = /** @type {KeyboardEvent} */ (\n mapBrowserEvent.originalEvent\n );\n const key = keyEvent.key;\n if (\n this.condition_(mapBrowserEvent) &&\n (key == Key.DOWN ||\n key == Key.LEFT ||\n key == Key.RIGHT ||\n key == Key.UP)\n ) {\n const map = mapBrowserEvent.map;\n const view = map.getView();\n const mapUnitsDelta = view.getResolution() * this.pixelDelta_;\n let deltaX = 0,\n deltaY = 0;\n if (key == Key.DOWN) {\n deltaY = -mapUnitsDelta;\n } else if (key == Key.LEFT) {\n deltaX = -mapUnitsDelta;\n } else if (key == Key.RIGHT) {\n deltaX = mapUnitsDelta;\n } else {\n deltaY = mapUnitsDelta;\n }\n const delta = [deltaX, deltaY];\n rotateCoordinate(delta, view.getRotation());\n pan(view, delta, this.duration_);\n keyEvent.preventDefault();\n stopEvent = true;\n }\n }\n return !stopEvent;\n }\n}\n\nexport default KeyboardPan;\n", "/**\n * @module ol/interaction/KeyboardZoom\n */\nimport EventType from '../events/EventType.js';\nimport Interaction, {zoomByDelta} from './Interaction.js';\nimport {platformModifierKey, targetNotEditable} from '../events/condition.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=100] Animation duration in milliseconds.\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled. The default condition is\n * that {@link module:ol/events/condition.targetNotEditable} is fulfilled and that\n * the platform modifier key isn't pressed\n * (!{@link module:ol/events/condition.platformModifierKey}).\n * @property {number} [delta=1] The zoom level delta on each key press.\n */\n\n/**\n * @classdesc\n * Allows the user to zoom the map using keyboard + and -.\n * Note that, although this interaction is by default included in maps,\n * the keys can only be used when browser focus is on the element to which\n * the keyboard events are attached. By default, this is the map div,\n * though you can change this with the `keyboardEventTarget` in\n * {@link module:ol/Map~Map}. `document` never loses focus but, for any other\n * element, focus will have to be on, and returned to, this element if the keys\n * are to function.\n * See also {@link module:ol/interaction/KeyboardPan~KeyboardPan}.\n * @api\n */\nclass KeyboardZoom extends Interaction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super();\n\n options = options ? options : {};\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.condition\n ? options.condition\n : function (mapBrowserEvent) {\n return (\n !platformModifierKey(mapBrowserEvent) &&\n targetNotEditable(mapBrowserEvent)\n );\n };\n\n /**\n * @private\n * @type {number}\n */\n this.delta_ = options.delta ? options.delta : 1;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 100;\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} if it was a\n * `KeyEvent`, and decides whether to zoom in or out (depending on whether the\n * key pressed was '+' or '-').\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(mapBrowserEvent) {\n let stopEvent = false;\n if (\n mapBrowserEvent.type == EventType.KEYDOWN ||\n mapBrowserEvent.type == EventType.KEYPRESS\n ) {\n const keyEvent = /** @type {KeyboardEvent} */ (\n mapBrowserEvent.originalEvent\n );\n const key = keyEvent.key;\n if (this.condition_(mapBrowserEvent) && (key === '+' || key === '-')) {\n const map = mapBrowserEvent.map;\n const delta = key === '+' ? this.delta_ : -this.delta_;\n const view = map.getView();\n zoomByDelta(view, delta, undefined, this.duration_);\n keyEvent.preventDefault();\n stopEvent = true;\n }\n }\n return !stopEvent;\n }\n}\n\nexport default KeyboardZoom;\n", "/**\n * @module ol/Kinetic\n */\n\n/**\n * @classdesc\n * Implementation of inertial deceleration for map movement.\n *\n * @api\n */\nclass Kinetic {\n /**\n * @param {number} decay Rate of decay (must be negative).\n * @param {number} minVelocity Minimum velocity (pixels/millisecond).\n * @param {number} delay Delay to consider to calculate the kinetic\n * initial values (milliseconds).\n */\n constructor(decay, minVelocity, delay) {\n /**\n * @private\n * @type {number}\n */\n this.decay_ = decay;\n\n /**\n * @private\n * @type {number}\n */\n this.minVelocity_ = minVelocity;\n\n /**\n * @private\n * @type {number}\n */\n this.delay_ = delay;\n\n /**\n * @private\n * @type {Array}\n */\n this.points_ = [];\n\n /**\n * @private\n * @type {number}\n */\n this.angle_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.initialVelocity_ = 0;\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n begin() {\n this.points_.length = 0;\n this.angle_ = 0;\n this.initialVelocity_ = 0;\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n */\n update(x, y) {\n this.points_.push(x, y, Date.now());\n }\n\n /**\n * @return {boolean} Whether we should do kinetic animation.\n */\n end() {\n if (this.points_.length < 6) {\n // at least 2 points are required (i.e. there must be at least 6 elements\n // in the array)\n return false;\n }\n const delay = Date.now() - this.delay_;\n const lastIndex = this.points_.length - 3;\n if (this.points_[lastIndex + 2] < delay) {\n // the last tracked point is too old, which means that the user stopped\n // panning before releasing the map\n return false;\n }\n\n // get the first point which still falls into the delay time\n let firstIndex = lastIndex - 3;\n while (firstIndex > 0 && this.points_[firstIndex + 2] > delay) {\n firstIndex -= 3;\n }\n\n const duration = this.points_[lastIndex + 2] - this.points_[firstIndex + 2];\n // we don't want a duration of 0 (divide by zero)\n // we also make sure the user panned for a duration of at least one frame\n // (1/60s) to compute sane displacement values\n if (duration < 1000 / 60) {\n return false;\n }\n\n const dx = this.points_[lastIndex] - this.points_[firstIndex];\n const dy = this.points_[lastIndex + 1] - this.points_[firstIndex + 1];\n this.angle_ = Math.atan2(dy, dx);\n this.initialVelocity_ = Math.sqrt(dx * dx + dy * dy) / duration;\n return this.initialVelocity_ > this.minVelocity_;\n }\n\n /**\n * @return {number} Total distance travelled (pixels).\n */\n getDistance() {\n return (this.minVelocity_ - this.initialVelocity_) / this.decay_;\n }\n\n /**\n * @return {number} Angle of the kinetic panning animation (radians).\n */\n getAngle() {\n return this.angle_;\n }\n}\n\nexport default Kinetic;\n", "/**\n * @module ol/interaction/MouseWheelZoom\n */\nimport EventType from '../events/EventType.js';\nimport Interaction, {zoomByDelta} from './Interaction.js';\nimport {DEVICE_PIXEL_RATIO, FIREFOX} from '../has.js';\nimport {all, always, focusWithTabindex} from '../events/condition.js';\nimport {clamp} from '../math.js';\n\n/**\n * @typedef {'trackpad' | 'wheel'} Mode\n */\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes an {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled. Default is\n * {@link module:ol/events/condition.always}.\n * @property {boolean} [onFocusOnly=false] When the map's target has a `tabindex` attribute set,\n * the interaction will only handle events when the map has the focus.\n * @property {number} [maxDelta=1] Maximum mouse wheel delta.\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {number} [timeout=80] Mouse wheel timeout duration in milliseconds.\n * @property {boolean} [useAnchor=true] Enable zooming using the mouse's\n * location as the anchor. When set to `false`, zooming in and out will zoom to\n * the center of the screen instead of zooming on the mouse's location.\n * @property {boolean} [constrainResolution=false] If true, the mouse wheel zoom\n * event will always animate to the closest zoom level after an interaction;\n * false means intermediary zoom levels are allowed.\n */\n\n/**\n * @classdesc\n * Allows the user to zoom the map by scrolling the mouse wheel.\n * @api\n */\nclass MouseWheelZoom extends Interaction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super(\n /** @type {import(\"./Interaction.js\").InteractionOptions} */ (options)\n );\n\n /**\n * @private\n * @type {number}\n */\n this.totalDelta_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.lastDelta_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.maxDelta_ = options.maxDelta !== undefined ? options.maxDelta : 1;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n\n /**\n * @private\n * @type {number}\n */\n this.timeout_ = options.timeout !== undefined ? options.timeout : 80;\n\n /**\n * @private\n * @type {boolean}\n */\n this.useAnchor_ =\n options.useAnchor !== undefined ? options.useAnchor : true;\n\n /**\n * @private\n * @type {boolean}\n */\n this.constrainResolution_ =\n options.constrainResolution !== undefined\n ? options.constrainResolution\n : false;\n\n const condition = options.condition ? options.condition : always;\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.onFocusOnly\n ? all(focusWithTabindex, condition)\n : condition;\n\n /**\n * @private\n * @type {?import(\"../coordinate.js\").Coordinate}\n */\n this.lastAnchor_ = null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.startTime_ = undefined;\n\n /**\n * @private\n * @type {ReturnType}\n */\n this.timeoutId_;\n\n /**\n * @private\n * @type {Mode|undefined}\n */\n this.mode_ = undefined;\n\n /**\n * Trackpad events separated by this delay will be considered separate\n * interactions.\n * @private\n * @type {number}\n */\n this.trackpadEventGap_ = 400;\n\n /**\n * @private\n * @type {ReturnType}\n */\n this.trackpadTimeoutId_;\n\n /**\n * The number of delta values per zoom level\n * @private\n * @type {number}\n */\n this.deltaPerZoom_ = 300;\n }\n\n /**\n * @private\n */\n endInteraction_() {\n this.trackpadTimeoutId_ = undefined;\n const map = this.getMap();\n if (!map) {\n return;\n }\n const view = map.getView();\n view.endInteraction(\n undefined,\n this.lastDelta_ ? (this.lastDelta_ > 0 ? 1 : -1) : 0,\n this.lastAnchor_\n );\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a mousewheel-event) and eventually\n * zooms the map.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n */\n handleEvent(mapBrowserEvent) {\n if (!this.condition_(mapBrowserEvent)) {\n return true;\n }\n const type = mapBrowserEvent.type;\n if (type !== EventType.WHEEL) {\n return true;\n }\n\n const map = mapBrowserEvent.map;\n const wheelEvent = /** @type {WheelEvent} */ (\n mapBrowserEvent.originalEvent\n );\n wheelEvent.preventDefault();\n\n if (this.useAnchor_) {\n this.lastAnchor_ = mapBrowserEvent.coordinate;\n }\n\n // Delta normalisation inspired by\n // https://github.com/mapbox/mapbox-gl-js/blob/001c7b9/js/ui/handler/scroll_zoom.js\n let delta;\n if (mapBrowserEvent.type == EventType.WHEEL) {\n delta = wheelEvent.deltaY;\n if (FIREFOX && wheelEvent.deltaMode === WheelEvent.DOM_DELTA_PIXEL) {\n delta /= DEVICE_PIXEL_RATIO;\n }\n if (wheelEvent.deltaMode === WheelEvent.DOM_DELTA_LINE) {\n delta *= 40;\n }\n }\n\n if (delta === 0) {\n return false;\n }\n this.lastDelta_ = delta;\n\n const now = Date.now();\n\n if (this.startTime_ === undefined) {\n this.startTime_ = now;\n }\n\n if (!this.mode_ || now - this.startTime_ > this.trackpadEventGap_) {\n this.mode_ = Math.abs(delta) < 4 ? 'trackpad' : 'wheel';\n }\n\n const view = map.getView();\n if (\n this.mode_ === 'trackpad' &&\n !(view.getConstrainResolution() || this.constrainResolution_)\n ) {\n if (this.trackpadTimeoutId_) {\n clearTimeout(this.trackpadTimeoutId_);\n } else {\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n view.beginInteraction();\n }\n this.trackpadTimeoutId_ = setTimeout(\n this.endInteraction_.bind(this),\n this.timeout_\n );\n view.adjustZoom(-delta / this.deltaPerZoom_, this.lastAnchor_);\n this.startTime_ = now;\n return false;\n }\n\n this.totalDelta_ += delta;\n\n const timeLeft = Math.max(this.timeout_ - (now - this.startTime_), 0);\n\n clearTimeout(this.timeoutId_);\n this.timeoutId_ = setTimeout(\n this.handleWheelZoom_.bind(this, map),\n timeLeft\n );\n\n return false;\n }\n\n /**\n * @private\n * @param {import(\"../Map.js\").default} map Map.\n */\n handleWheelZoom_(map) {\n const view = map.getView();\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n let delta =\n -clamp(\n this.totalDelta_,\n -this.maxDelta_ * this.deltaPerZoom_,\n this.maxDelta_ * this.deltaPerZoom_\n ) / this.deltaPerZoom_;\n if (view.getConstrainResolution() || this.constrainResolution_) {\n // view has a zoom constraint, zoom by 1\n delta = delta ? (delta > 0 ? 1 : -1) : 0;\n }\n zoomByDelta(view, delta, this.lastAnchor_, this.duration_);\n\n this.mode_ = undefined;\n this.totalDelta_ = 0;\n this.lastAnchor_ = null;\n this.startTime_ = undefined;\n this.timeoutId_ = undefined;\n }\n\n /**\n * Enable or disable using the mouse's location as an anchor when zooming\n * @param {boolean} useAnchor true to zoom to the mouse's location, false\n * to zoom to the center of the map\n * @api\n */\n setMouseAnchor(useAnchor) {\n this.useAnchor_ = useAnchor;\n if (!useAnchor) {\n this.lastAnchor_ = null;\n }\n }\n}\n\nexport default MouseWheelZoom;\n", "/**\n * @module ol/interaction/PinchRotate\n */\nimport PointerInteraction, {\n centroid as centroidFromPointers,\n} from './Pointer.js';\nimport {FALSE} from '../functions.js';\nimport {disable} from '../rotationconstraint.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=250] The duration of the animation in\n * milliseconds.\n * @property {number} [threshold=0.3] Minimal angle in radians to start a rotation.\n */\n\n/**\n * @classdesc\n * Allows the user to rotate the map by twisting with two fingers\n * on a touch screen.\n * @api\n */\nclass PinchRotate extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const pointerOptions = /** @type {import(\"./Pointer.js\").Options} */ (\n options\n );\n\n if (!pointerOptions.stopDown) {\n pointerOptions.stopDown = FALSE;\n }\n\n super(pointerOptions);\n\n /**\n * @private\n * @type {import(\"../coordinate.js\").Coordinate}\n */\n this.anchor_ = null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.lastAngle_ = undefined;\n\n /**\n * @private\n * @type {boolean}\n */\n this.rotating_ = false;\n\n /**\n * @private\n * @type {number}\n */\n this.rotationDelta_ = 0.0;\n\n /**\n * @private\n * @type {number}\n */\n this.threshold_ = options.threshold !== undefined ? options.threshold : 0.3;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(mapBrowserEvent) {\n let rotationDelta = 0.0;\n\n const touch0 = this.targetPointers[0];\n const touch1 = this.targetPointers[1];\n\n // angle between touches\n const angle = Math.atan2(\n touch1.clientY - touch0.clientY,\n touch1.clientX - touch0.clientX\n );\n\n if (this.lastAngle_ !== undefined) {\n const delta = angle - this.lastAngle_;\n this.rotationDelta_ += delta;\n if (!this.rotating_ && Math.abs(this.rotationDelta_) > this.threshold_) {\n this.rotating_ = true;\n }\n rotationDelta = delta;\n }\n this.lastAngle_ = angle;\n\n const map = mapBrowserEvent.map;\n const view = map.getView();\n if (view.getConstraints().rotation === disable) {\n return;\n }\n\n // rotate anchor point.\n // FIXME: should be the intersection point between the lines:\n // touch0,touch1 and previousTouch0,previousTouch1\n this.anchor_ = map.getCoordinateFromPixelInternal(\n map.getEventPixel(centroidFromPointers(this.targetPointers))\n );\n\n // rotate\n if (this.rotating_) {\n map.render();\n view.adjustRotationInternal(rotationDelta, this.anchor_);\n }\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(mapBrowserEvent) {\n if (this.targetPointers.length < 2) {\n const map = mapBrowserEvent.map;\n const view = map.getView();\n view.endInteraction(this.duration_);\n return false;\n }\n return true;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(mapBrowserEvent) {\n if (this.targetPointers.length >= 2) {\n const map = mapBrowserEvent.map;\n this.anchor_ = null;\n this.lastAngle_ = undefined;\n this.rotating_ = false;\n this.rotationDelta_ = 0.0;\n if (!this.handlingDownUpSequence) {\n map.getView().beginInteraction();\n }\n return true;\n }\n return false;\n }\n}\n\nexport default PinchRotate;\n", "/**\n * @module ol/interaction/PinchZoom\n */\nimport PointerInteraction, {\n centroid as centroidFromPointers,\n} from './Pointer.js';\nimport {FALSE} from '../functions.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=400] Animation duration in milliseconds.\n */\n\n/**\n * @classdesc\n * Allows the user to zoom the map by pinching with two fingers\n * on a touch screen.\n * @api\n */\nclass PinchZoom extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const pointerOptions = /** @type {import(\"./Pointer.js\").Options} */ (\n options\n );\n\n if (!pointerOptions.stopDown) {\n pointerOptions.stopDown = FALSE;\n }\n\n super(pointerOptions);\n\n /**\n * @private\n * @type {import(\"../coordinate.js\").Coordinate}\n */\n this.anchor_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 400;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.lastDistance_ = undefined;\n\n /**\n * @private\n * @type {number}\n */\n this.lastScaleDelta_ = 1;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n */\n handleDragEvent(mapBrowserEvent) {\n let scaleDelta = 1.0;\n\n const touch0 = this.targetPointers[0];\n const touch1 = this.targetPointers[1];\n const dx = touch0.clientX - touch1.clientX;\n const dy = touch0.clientY - touch1.clientY;\n\n // distance between touches\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (this.lastDistance_ !== undefined) {\n scaleDelta = this.lastDistance_ / distance;\n }\n this.lastDistance_ = distance;\n\n const map = mapBrowserEvent.map;\n const view = map.getView();\n\n if (scaleDelta != 1.0) {\n this.lastScaleDelta_ = scaleDelta;\n }\n\n // scale anchor point.\n this.anchor_ = map.getCoordinateFromPixelInternal(\n map.getEventPixel(centroidFromPointers(this.targetPointers))\n );\n\n // scale, bypass the resolution constraint\n map.render();\n view.adjustResolutionInternal(scaleDelta, this.anchor_);\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleUpEvent(mapBrowserEvent) {\n if (this.targetPointers.length < 2) {\n const map = mapBrowserEvent.map;\n const view = map.getView();\n const direction = this.lastScaleDelta_ > 1 ? 1 : -1;\n view.endInteraction(this.duration_, direction);\n return false;\n }\n return true;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n */\n handleDownEvent(mapBrowserEvent) {\n if (this.targetPointers.length >= 2) {\n const map = mapBrowserEvent.map;\n this.anchor_ = null;\n this.lastDistance_ = undefined;\n this.lastScaleDelta_ = 1;\n if (!this.handlingDownUpSequence) {\n map.getView().beginInteraction();\n }\n return true;\n }\n return false;\n }\n}\n\nexport default PinchZoom;\n", "/**\n * @module ol/interaction/defaults\n */\nimport Collection from '../Collection.js';\nimport DoubleClickZoom from './DoubleClickZoom.js';\nimport DragPan from './DragPan.js';\nimport DragRotate from './DragRotate.js';\nimport DragZoom from './DragZoom.js';\nimport KeyboardPan from './KeyboardPan.js';\nimport KeyboardZoom from './KeyboardZoom.js';\nimport Kinetic from '../Kinetic.js';\nimport MouseWheelZoom from './MouseWheelZoom.js';\nimport PinchRotate from './PinchRotate.js';\nimport PinchZoom from './PinchZoom.js';\n\n/**\n * @typedef {Object} DefaultsOptions\n * @property {boolean} [altShiftDragRotate=true] Whether Alt-Shift-drag rotate is\n * desired.\n * @property {boolean} [onFocusOnly=false] Interact only when the map has the\n * focus. This affects the `MouseWheelZoom` and `DragPan` interactions and is\n * useful when page scroll is desired for maps that do not have the browser's\n * focus.\n * @property {boolean} [doubleClickZoom=true] Whether double click zoom is\n * desired.\n * @property {boolean} [keyboard=true] Whether keyboard interaction is desired.\n * @property {boolean} [mouseWheelZoom=true] Whether mousewheel zoom is desired.\n * @property {boolean} [shiftDragZoom=true] Whether Shift-drag zoom is desired.\n * @property {boolean} [dragPan=true] Whether drag pan is desired.\n * @property {boolean} [pinchRotate=true] Whether pinch rotate is desired.\n * @property {boolean} [pinchZoom=true] Whether pinch zoom is desired.\n * @property {number} [zoomDelta] Zoom level delta when using keyboard or double click zoom.\n * @property {number} [zoomDuration] Duration of the zoom animation in\n * milliseconds.\n */\n\n/**\n * Set of interactions included in maps by default. Specific interactions can be\n * excluded by setting the appropriate option to false in the constructor\n * options, but the order of the interactions is fixed. If you want to specify\n * a different order for interactions, you will need to create your own\n * {@link module:ol/interaction/Interaction~Interaction} instances and insert\n * them into a {@link module:ol/Collection~Collection} in the order you want\n * before creating your {@link module:ol/Map~Map} instance. Changing the order can\n * be of interest if the event propagation needs to be stopped at a point.\n * The default set of interactions, in sequence, is:\n * * {@link module:ol/interaction/DragRotate~DragRotate}\n * * {@link module:ol/interaction/DoubleClickZoom~DoubleClickZoom}\n * * {@link module:ol/interaction/DragPan~DragPan}\n * * {@link module:ol/interaction/PinchRotate~PinchRotate}\n * * {@link module:ol/interaction/PinchZoom~PinchZoom}\n * * {@link module:ol/interaction/KeyboardPan~KeyboardPan}\n * * {@link module:ol/interaction/KeyboardZoom~KeyboardZoom}\n * * {@link module:ol/interaction/MouseWheelZoom~MouseWheelZoom}\n * * {@link module:ol/interaction/DragZoom~DragZoom}\n *\n * @param {DefaultsOptions} [options] Defaults options.\n * @return {Collection}\n * A collection of interactions to be used with the {@link module:ol/Map~Map}\n * constructor's `interactions` option.\n * @api\n */\nexport function defaults(options) {\n options = options ? options : {};\n\n /** @type {Collection} */\n const interactions = new Collection();\n\n const kinetic = new Kinetic(-0.005, 0.05, 100);\n\n const altShiftDragRotate =\n options.altShiftDragRotate !== undefined\n ? options.altShiftDragRotate\n : true;\n if (altShiftDragRotate) {\n interactions.push(new DragRotate());\n }\n\n const doubleClickZoom =\n options.doubleClickZoom !== undefined ? options.doubleClickZoom : true;\n if (doubleClickZoom) {\n interactions.push(\n new DoubleClickZoom({\n delta: options.zoomDelta,\n duration: options.zoomDuration,\n })\n );\n }\n\n const dragPan = options.dragPan !== undefined ? options.dragPan : true;\n if (dragPan) {\n interactions.push(\n new DragPan({\n onFocusOnly: options.onFocusOnly,\n kinetic: kinetic,\n })\n );\n }\n\n const pinchRotate =\n options.pinchRotate !== undefined ? options.pinchRotate : true;\n if (pinchRotate) {\n interactions.push(new PinchRotate());\n }\n\n const pinchZoom = options.pinchZoom !== undefined ? options.pinchZoom : true;\n if (pinchZoom) {\n interactions.push(\n new PinchZoom({\n duration: options.zoomDuration,\n })\n );\n }\n\n const keyboard = options.keyboard !== undefined ? options.keyboard : true;\n if (keyboard) {\n interactions.push(new KeyboardPan());\n interactions.push(\n new KeyboardZoom({\n delta: options.zoomDelta,\n duration: options.zoomDuration,\n })\n );\n }\n\n const mouseWheelZoom =\n options.mouseWheelZoom !== undefined ? options.mouseWheelZoom : true;\n if (mouseWheelZoom) {\n interactions.push(\n new MouseWheelZoom({\n onFocusOnly: options.onFocusOnly,\n duration: options.zoomDuration,\n })\n );\n }\n\n const shiftDragZoom =\n options.shiftDragZoom !== undefined ? options.shiftDragZoom : true;\n if (shiftDragZoom) {\n interactions.push(\n new DragZoom({\n duration: options.zoomDuration,\n })\n );\n }\n\n return interactions;\n}\n", "/**\n * @module ol/size\n */\n\n/**\n * An array of numbers representing a size: `[width, height]`.\n * @typedef {Array} Size\n * @api\n */\n\n/**\n * Returns a buffered size.\n * @param {Size} size Size.\n * @param {number} num The amount by which to buffer.\n * @param {Size} [dest] Optional reusable size array.\n * @return {Size} The buffered size.\n */\nexport function buffer(size, num, dest) {\n if (dest === undefined) {\n dest = [0, 0];\n }\n dest[0] = size[0] + 2 * num;\n dest[1] = size[1] + 2 * num;\n return dest;\n}\n\n/**\n * Determines if a size has a positive area.\n * @param {Size} size The size to test.\n * @return {boolean} The size has a positive area.\n */\nexport function hasArea(size) {\n return size[0] > 0 && size[1] > 0;\n}\n\n/**\n * Returns a size scaled by a ratio. The result will be an array of integers.\n * @param {Size} size Size.\n * @param {number} ratio Ratio.\n * @param {Size} [dest] Optional reusable size array.\n * @return {Size} The scaled size.\n */\nexport function scale(size, ratio, dest) {\n if (dest === undefined) {\n dest = [0, 0];\n }\n dest[0] = (size[0] * ratio + 0.5) | 0;\n dest[1] = (size[1] * ratio + 0.5) | 0;\n return dest;\n}\n\n/**\n * Returns an `Size` array for the passed in number (meaning: square) or\n * `Size` array.\n * (meaning: non-square),\n * @param {number|Size} size Width and height.\n * @param {Size} [dest] Optional reusable size array.\n * @return {Size} Size.\n * @api\n */\nexport function toSize(size, dest) {\n if (Array.isArray(size)) {\n return size;\n }\n if (dest === undefined) {\n dest = [size, size];\n } else {\n dest[0] = size;\n dest[1] = size;\n }\n return dest;\n}\n", "/**\n * @module ol/Map\n */\nimport BaseObject from './Object.js';\nimport Collection from './Collection.js';\nimport CollectionEventType from './CollectionEventType.js';\nimport CompositeMapRenderer from './renderer/Composite.js';\nimport EventType from './events/EventType.js';\nimport Layer from './layer/Layer.js';\nimport LayerGroup, {GroupEvent} from './layer/Group.js';\nimport MapBrowserEvent from './MapBrowserEvent.js';\nimport MapBrowserEventHandler from './MapBrowserEventHandler.js';\nimport MapBrowserEventType from './MapBrowserEventType.js';\nimport MapEvent from './MapEvent.js';\nimport MapEventType from './MapEventType.js';\nimport MapProperty from './MapProperty.js';\nimport ObjectEventType from './ObjectEventType.js';\nimport PointerEventType from './pointer/EventType.js';\nimport RenderEventType from './render/EventType.js';\nimport TileQueue, {getTilePriority} from './TileQueue.js';\nimport View from './View.js';\nimport ViewHint from './ViewHint.js';\nimport {DEVICE_PIXEL_RATIO, PASSIVE_EVENT_LISTENERS} from './has.js';\nimport {TRUE} from './functions.js';\nimport {\n apply as applyTransform,\n create as createTransform,\n} from './transform.js';\nimport {assert} from './asserts.js';\nimport {\n clone,\n createOrUpdateEmpty,\n equals as equalsExtent,\n getForViewAndSize,\n isEmpty,\n} from './extent.js';\nimport {defaults as defaultControls} from './control/defaults.js';\nimport {defaults as defaultInteractions} from './interaction/defaults.js';\nimport {equals} from './array.js';\nimport {fromUserCoordinate, toUserCoordinate} from './proj.js';\nimport {getUid} from './util.js';\nimport {hasArea} from './size.js';\nimport {listen, unlistenByKey} from './events.js';\nimport {removeNode} from './dom.js';\nimport {warn} from './console.js';\n\n/**\n * State of the current frame. Only `pixelRatio`, `time` and `viewState` should\n * be used in applications.\n * @typedef {Object} FrameState\n * @property {number} pixelRatio The pixel ratio of the frame.\n * @property {number} time The time when rendering of the frame was requested.\n * @property {import(\"./View.js\").State} viewState The state of the current view.\n * @property {boolean} animate Animate.\n * @property {import(\"./transform.js\").Transform} coordinateToPixelTransform CoordinateToPixelTransform.\n * @property {import(\"rbush\").default} declutterTree DeclutterTree.\n * @property {null|import(\"./extent.js\").Extent} extent Extent (in view projection coordinates).\n * @property {import(\"./extent.js\").Extent} [nextExtent] Next extent during an animation series.\n * @property {number} index Index.\n * @property {Array} layerStatesArray LayerStatesArray.\n * @property {number} layerIndex LayerIndex.\n * @property {import(\"./transform.js\").Transform} pixelToCoordinateTransform PixelToCoordinateTransform.\n * @property {Array} postRenderFunctions PostRenderFunctions.\n * @property {import(\"./size.js\").Size} size Size.\n * @property {TileQueue} tileQueue TileQueue.\n * @property {!Object>} usedTiles UsedTiles.\n * @property {Array} viewHints ViewHints.\n * @property {!Object>} wantedTiles WantedTiles.\n * @property {string} mapId The id of the map.\n * @property {Object} renderTargets Identifiers of previously rendered elements.\n */\n\n/**\n * @typedef {function(Map, ?FrameState): any} PostRenderFunction\n */\n\n/**\n * @typedef {Object} AtPixelOptions\n * @property {undefined|function(import(\"./layer/Layer.js\").default): boolean} [layerFilter] Layer filter\n * function. The filter function will receive one argument, the\n * {@link module:ol/layer/Layer~Layer layer-candidate} and it should return a boolean value.\n * Only layers which are visible and for which this function returns `true`\n * will be tested for features. By default, all visible layers will be tested.\n * @property {number} [hitTolerance=0] Hit-detection tolerance in css pixels. Pixels\n * inside the radius around the given position will be checked for features.\n * @property {boolean} [checkWrapped=true] Check-Wrapped Will check for wrapped geometries inside the range of\n * +/- 1 world width. Works only if a projection is used that can be wrapped.\n */\n\n/**\n * @typedef {Object} MapOptionsInternal\n * @property {Collection} [controls] Controls.\n * @property {Collection} [interactions] Interactions.\n * @property {HTMLElement|Document} keyboardEventTarget KeyboardEventTarget.\n * @property {Collection} overlays Overlays.\n * @property {Object} values Values.\n */\n\n/**\n * @typedef {import(\"./ObjectEventType\").Types|'change:layergroup'|'change:size'|'change:target'|'change:view'} MapObjectEventTypes\n */\n\n/***\n * @template Return\n * @typedef {import(\"./Observable\").OnSignature &\n * import(\"./Observable\").OnSignature &\n * import(\"./Observable\").OnSignature &\n * import(\"./Observable\").OnSignature &\n * import(\"./Observable\").OnSignature &\n * import(\"./Observable\").CombinedOnSignature} MapEventHandler\n */\n\n/**\n * Object literal with config options for the map.\n * @typedef {Object} MapOptions\n * @property {Collection|Array} [controls]\n * Controls initially added to the map. If not specified,\n * {@link module:ol/control/defaults.defaults} is used.\n * @property {number} [pixelRatio=window.devicePixelRatio] The ratio between\n * physical pixels and device-independent pixels (dips) on the device.\n * @property {Collection|Array} [interactions]\n * Interactions that are initially added to the map. If not specified,\n * {@link module:ol/interaction/defaults.defaults} is used.\n * @property {HTMLElement|Document|string} [keyboardEventTarget] The element to\n * listen to keyboard events on. This determines when the `KeyboardPan` and\n * `KeyboardZoom` interactions trigger. For example, if this option is set to\n * `document` the keyboard interactions will always trigger. If this option is\n * not specified, the element the library listens to keyboard events on is the\n * map target (i.e. the user-provided div for the map). If this is not\n * `document`, the target element needs to be focused for key events to be\n * emitted, requiring that the target element has a `tabindex` attribute.\n * @property {Array|Collection|LayerGroup} [layers]\n * Layers. If this is not defined, a map with no layers will be rendered. Note\n * that layers are rendered in the order supplied, so if you want, for example,\n * a vector layer to appear on top of a tile layer, it must come after the tile\n * layer.\n * @property {number} [maxTilesLoading=16] Maximum number tiles to load\n * simultaneously.\n * @property {number} [moveTolerance=1] The minimum distance in pixels the\n * cursor must move to be detected as a map move event instead of a click.\n * Increasing this value can make it easier to click on the map.\n * @property {Collection|Array} [overlays]\n * Overlays initially added to the map. By default, no overlays are added.\n * @property {HTMLElement|string} [target] The container for the map, either the\n * element itself or the `id` of the element. If not specified at construction\n * time, {@link module:ol/Map~Map#setTarget} must be called for the map to be\n * rendered. If passed by element, the container can be in a secondary document.\n * **Note:** CSS `transform` support for the target element is limited to `scale`.\n * @property {View|Promise} [view] The map's view. No layer sources will be\n * fetched unless this is specified at construction time or through\n * {@link module:ol/Map~Map#setView}.\n */\n\n/**\n * @param {import(\"./layer/Base.js\").default} layer Layer.\n */\nfunction removeLayerMapProperty(layer) {\n if (layer instanceof Layer) {\n layer.setMapInternal(null);\n return;\n }\n if (layer instanceof LayerGroup) {\n layer.getLayers().forEach(removeLayerMapProperty);\n }\n}\n\n/**\n * @param {import(\"./layer/Base.js\").default} layer Layer.\n * @param {Map} map Map.\n */\nfunction setLayerMapProperty(layer, map) {\n if (layer instanceof Layer) {\n layer.setMapInternal(map);\n return;\n }\n if (layer instanceof LayerGroup) {\n const layers = layer.getLayers().getArray();\n for (let i = 0, ii = layers.length; i < ii; ++i) {\n setLayerMapProperty(layers[i], map);\n }\n }\n}\n\n/**\n * @classdesc\n * The map is the core component of OpenLayers. For a map to render, a view,\n * one or more layers, and a target container are needed:\n *\n * import Map from 'ol/Map.js';\n * import View from 'ol/View.js';\n * import TileLayer from 'ol/layer/Tile.js';\n * import OSM from 'ol/source/OSM.js';\n *\n * const map = new Map({\n * view: new View({\n * center: [0, 0],\n * zoom: 1,\n * }),\n * layers: [\n * new TileLayer({\n * source: new OSM(),\n * }),\n * ],\n * target: 'map',\n * });\n *\n * The above snippet creates a map using a {@link module:ol/layer/Tile~TileLayer} to\n * display {@link module:ol/source/OSM~OSM} OSM data and render it to a DOM\n * element with the id `map`.\n *\n * The constructor places a viewport container (with CSS class name\n * `ol-viewport`) in the target element (see `getViewport()`), and then two\n * further elements within the viewport: one with CSS class name\n * `ol-overlaycontainer-stopevent` for controls and some overlays, and one with\n * CSS class name `ol-overlaycontainer` for other overlays (see the `stopEvent`\n * option of {@link module:ol/Overlay~Overlay} for the difference). The map\n * itself is placed in a further element within the viewport.\n *\n * Layers are stored as a {@link module:ol/Collection~Collection} in\n * layerGroups. A top-level group is provided by the library. This is what is\n * accessed by `getLayerGroup` and `setLayerGroup`. Layers entered in the\n * options are added to this group, and `addLayer` and `removeLayer` change the\n * layer collection in the group. `getLayers` is a convenience function for\n * `getLayerGroup().getLayers()`. Note that {@link module:ol/layer/Group~LayerGroup}\n * is a subclass of {@link module:ol/layer/Base~BaseLayer}, so layers entered in the\n * options or added with `addLayer` can be groups, which can contain further\n * groups, and so on.\n *\n * @fires import(\"./MapBrowserEvent.js\").MapBrowserEvent\n * @fires import(\"./MapEvent.js\").MapEvent\n * @fires import(\"./render/Event.js\").default#precompose\n * @fires import(\"./render/Event.js\").default#postcompose\n * @fires import(\"./render/Event.js\").default#rendercomplete\n * @api\n */\nclass Map extends BaseObject {\n /**\n * @param {MapOptions} [options] Map options.\n */\n constructor(options) {\n super();\n\n options = options || {};\n\n /***\n * @type {MapEventHandler}\n */\n this.on;\n\n /***\n * @type {MapEventHandler}\n */\n this.once;\n\n /***\n * @type {MapEventHandler}\n */\n this.un;\n\n const optionsInternal = createOptionsInternal(options);\n\n /**\n * @private\n * @type {boolean|undefined}\n */\n this.renderComplete_;\n\n /**\n * @private\n * @type {boolean}\n */\n this.loaded_ = true;\n\n /** @private */\n this.boundHandleBrowserEvent_ = this.handleBrowserEvent.bind(this);\n\n /**\n * @type {number}\n * @private\n */\n this.maxTilesLoading_ =\n options.maxTilesLoading !== undefined ? options.maxTilesLoading : 16;\n\n /**\n * @private\n * @type {number}\n */\n this.pixelRatio_ =\n options.pixelRatio !== undefined\n ? options.pixelRatio\n : DEVICE_PIXEL_RATIO;\n\n /**\n * @private\n * @type {ReturnType}\n */\n this.postRenderTimeoutHandle_;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.animationDelayKey_;\n\n /**\n * @private\n */\n this.animationDelay_ = this.animationDelay_.bind(this);\n\n /**\n * @private\n * @type {import(\"./transform.js\").Transform}\n */\n this.coordinateToPixelTransform_ = createTransform();\n\n /**\n * @private\n * @type {import(\"./transform.js\").Transform}\n */\n this.pixelToCoordinateTransform_ = createTransform();\n\n /**\n * @private\n * @type {number}\n */\n this.frameIndex_ = 0;\n\n /**\n * @private\n * @type {?FrameState}\n */\n this.frameState_ = null;\n\n /**\n * The extent at the previous 'moveend' event.\n * @private\n * @type {import(\"./extent.js\").Extent}\n */\n this.previousExtent_ = null;\n\n /**\n * @private\n * @type {?import(\"./events.js\").EventsKey}\n */\n this.viewPropertyListenerKey_ = null;\n\n /**\n * @private\n * @type {?import(\"./events.js\").EventsKey}\n */\n this.viewChangeListenerKey_ = null;\n\n /**\n * @private\n * @type {?Array}\n */\n this.layerGroupPropertyListenerKeys_ = null;\n\n /**\n * @private\n * @type {!HTMLElement}\n */\n this.viewport_ = document.createElement('div');\n this.viewport_.className =\n 'ol-viewport' + ('ontouchstart' in window ? ' ol-touch' : '');\n this.viewport_.style.position = 'relative';\n this.viewport_.style.overflow = 'hidden';\n this.viewport_.style.width = '100%';\n this.viewport_.style.height = '100%';\n\n /**\n * @private\n * @type {!HTMLElement}\n */\n this.overlayContainer_ = document.createElement('div');\n this.overlayContainer_.style.position = 'absolute';\n this.overlayContainer_.style.zIndex = '0';\n this.overlayContainer_.style.width = '100%';\n this.overlayContainer_.style.height = '100%';\n this.overlayContainer_.style.pointerEvents = 'none';\n this.overlayContainer_.className = 'ol-overlaycontainer';\n this.viewport_.appendChild(this.overlayContainer_);\n\n /**\n * @private\n * @type {!HTMLElement}\n */\n this.overlayContainerStopEvent_ = document.createElement('div');\n this.overlayContainerStopEvent_.style.position = 'absolute';\n this.overlayContainerStopEvent_.style.zIndex = '0';\n this.overlayContainerStopEvent_.style.width = '100%';\n this.overlayContainerStopEvent_.style.height = '100%';\n this.overlayContainerStopEvent_.style.pointerEvents = 'none';\n this.overlayContainerStopEvent_.className = 'ol-overlaycontainer-stopevent';\n this.viewport_.appendChild(this.overlayContainerStopEvent_);\n\n /**\n * @private\n * @type {MapBrowserEventHandler}\n */\n this.mapBrowserEventHandler_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.moveTolerance_ = options.moveTolerance;\n\n /**\n * @private\n * @type {HTMLElement|Document}\n */\n this.keyboardEventTarget_ = optionsInternal.keyboardEventTarget;\n\n /**\n * @private\n * @type {?Array}\n */\n this.targetChangeHandlerKeys_ = null;\n\n /**\n * @private\n * @type {HTMLElement|null}\n */\n this.targetElement_ = null;\n\n /**\n * @type {ResizeObserver}\n */\n this.resizeObserver_ = new ResizeObserver(() => this.updateSize());\n\n /**\n * @type {Collection}\n * @protected\n */\n this.controls = optionsInternal.controls || defaultControls();\n\n /**\n * @type {Collection}\n * @protected\n */\n this.interactions =\n optionsInternal.interactions ||\n defaultInteractions({\n onFocusOnly: true,\n });\n\n /**\n * @type {Collection}\n * @private\n */\n this.overlays_ = optionsInternal.overlays;\n\n /**\n * A lookup of overlays by id.\n * @private\n * @type {Object}\n */\n this.overlayIdIndex_ = {};\n\n /**\n * @type {import(\"./renderer/Map.js\").default|null}\n * @private\n */\n this.renderer_ = null;\n\n /**\n * @private\n * @type {!Array}\n */\n this.postRenderFunctions_ = [];\n\n /**\n * @private\n * @type {TileQueue}\n */\n this.tileQueue_ = new TileQueue(\n this.getTilePriority.bind(this),\n this.handleTileChange_.bind(this)\n );\n\n this.addChangeListener(\n MapProperty.LAYERGROUP,\n this.handleLayerGroupChanged_\n );\n this.addChangeListener(MapProperty.VIEW, this.handleViewChanged_);\n this.addChangeListener(MapProperty.SIZE, this.handleSizeChanged_);\n this.addChangeListener(MapProperty.TARGET, this.handleTargetChanged_);\n\n // setProperties will trigger the rendering of the map if the map\n // is \"defined\" already.\n this.setProperties(optionsInternal.values);\n\n const map = this;\n if (options.view && !(options.view instanceof View)) {\n options.view.then(function (viewOptions) {\n map.setView(new View(viewOptions));\n });\n }\n\n this.controls.addEventListener(\n CollectionEventType.ADD,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent\n */\n (event) => {\n event.element.setMap(this);\n }\n );\n\n this.controls.addEventListener(\n CollectionEventType.REMOVE,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (event) => {\n event.element.setMap(null);\n }\n );\n\n this.interactions.addEventListener(\n CollectionEventType.ADD,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (event) => {\n event.element.setMap(this);\n }\n );\n\n this.interactions.addEventListener(\n CollectionEventType.REMOVE,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (event) => {\n event.element.setMap(null);\n }\n );\n\n this.overlays_.addEventListener(\n CollectionEventType.ADD,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (event) => {\n this.addOverlayInternal_(event.element);\n }\n );\n\n this.overlays_.addEventListener(\n CollectionEventType.REMOVE,\n /**\n * @param {import(\"./Collection.js\").CollectionEvent} event CollectionEvent.\n */\n (event) => {\n const id = event.element.getId();\n if (id !== undefined) {\n delete this.overlayIdIndex_[id.toString()];\n }\n event.element.setMap(null);\n }\n );\n\n this.controls.forEach(\n /**\n * @param {import(\"./control/Control.js\").default} control Control.\n */\n (control) => {\n control.setMap(this);\n }\n );\n\n this.interactions.forEach(\n /**\n * @param {import(\"./interaction/Interaction.js\").default} interaction Interaction.\n */\n (interaction) => {\n interaction.setMap(this);\n }\n );\n\n this.overlays_.forEach(this.addOverlayInternal_.bind(this));\n }\n\n /**\n * Add the given control to the map.\n * @param {import(\"./control/Control.js\").default} control Control.\n * @api\n */\n addControl(control) {\n this.getControls().push(control);\n }\n\n /**\n * Add the given interaction to the map. If you want to add an interaction\n * at another point of the collection use `getInteractions()` and the methods\n * available on {@link module:ol/Collection~Collection}. This can be used to\n * stop the event propagation from the handleEvent function. The interactions\n * get to handle the events in the reverse order of this collection.\n * @param {import(\"./interaction/Interaction.js\").default} interaction Interaction to add.\n * @api\n */\n addInteraction(interaction) {\n this.getInteractions().push(interaction);\n }\n\n /**\n * Adds the given layer to the top of this map. If you want to add a layer\n * elsewhere in the stack, use `getLayers()` and the methods available on\n * {@link module:ol/Collection~Collection}.\n * @param {import(\"./layer/Base.js\").default} layer Layer.\n * @api\n */\n addLayer(layer) {\n const layers = this.getLayerGroup().getLayers();\n layers.push(layer);\n }\n\n /**\n * @param {import(\"./layer/Group.js\").GroupEvent} event The layer add event.\n * @private\n */\n handleLayerAdd_(event) {\n setLayerMapProperty(event.layer, this);\n }\n\n /**\n * Add the given overlay to the map.\n * @param {import(\"./Overlay.js\").default} overlay Overlay.\n * @api\n */\n addOverlay(overlay) {\n this.getOverlays().push(overlay);\n }\n\n /**\n * This deals with map's overlay collection changes.\n * @param {import(\"./Overlay.js\").default} overlay Overlay.\n * @private\n */\n addOverlayInternal_(overlay) {\n const id = overlay.getId();\n if (id !== undefined) {\n this.overlayIdIndex_[id.toString()] = overlay;\n }\n overlay.setMap(this);\n }\n\n /**\n *\n * Clean up.\n */\n disposeInternal() {\n this.controls.clear();\n this.interactions.clear();\n this.overlays_.clear();\n this.resizeObserver_.disconnect();\n this.setTarget(null);\n super.disposeInternal();\n }\n\n /**\n * Detect features that intersect a pixel on the viewport, and execute a\n * callback with each intersecting feature. Layers included in the detection can\n * be configured through the `layerFilter` option in `options`.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel.\n * @param {function(import(\"./Feature.js\").FeatureLike, import(\"./layer/Layer.js\").default, import(\"./geom/SimpleGeometry.js\").default): T} callback Feature callback. The callback will be\n * called with two arguments. The first argument is one\n * {@link module:ol/Feature~Feature feature} or\n * {@link module:ol/render/Feature~RenderFeature render feature} at the pixel, the second is\n * the {@link module:ol/layer/Layer~Layer layer} of the feature and will be null for\n * unmanaged layers. To stop detection, callback functions can return a\n * truthy value.\n * @param {AtPixelOptions} [options] Optional options.\n * @return {T|undefined} Callback result, i.e. the return value of last\n * callback execution, or the first truthy callback return value.\n * @template T\n * @api\n */\n forEachFeatureAtPixel(pixel, callback, options) {\n if (!this.frameState_ || !this.renderer_) {\n return;\n }\n const coordinate = this.getCoordinateFromPixelInternal(pixel);\n options = options !== undefined ? options : {};\n const hitTolerance =\n options.hitTolerance !== undefined ? options.hitTolerance : 0;\n const layerFilter =\n options.layerFilter !== undefined ? options.layerFilter : TRUE;\n const checkWrapped = options.checkWrapped !== false;\n return this.renderer_.forEachFeatureAtCoordinate(\n coordinate,\n this.frameState_,\n hitTolerance,\n checkWrapped,\n callback,\n null,\n layerFilter,\n null\n );\n }\n\n /**\n * Get all features that intersect a pixel on the viewport.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel.\n * @param {AtPixelOptions} [options] Optional options.\n * @return {Array} The detected features or\n * an empty array if none were found.\n * @api\n */\n getFeaturesAtPixel(pixel, options) {\n const features = [];\n this.forEachFeatureAtPixel(\n pixel,\n function (feature) {\n features.push(feature);\n },\n options\n );\n return features;\n }\n\n /**\n * Get all layers from all layer groups.\n * @return {Array} Layers.\n * @api\n */\n getAllLayers() {\n const layers = [];\n function addLayersFrom(layerGroup) {\n layerGroup.forEach(function (layer) {\n if (layer instanceof LayerGroup) {\n addLayersFrom(layer.getLayers());\n } else {\n layers.push(layer);\n }\n });\n }\n addLayersFrom(this.getLayers());\n return layers;\n }\n\n /**\n * Detect if features intersect a pixel on the viewport. Layers included in the\n * detection can be configured through the `layerFilter` option.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel.\n * @param {AtPixelOptions} [options] Optional options.\n * @return {boolean} Is there a feature at the given pixel?\n * @api\n */\n hasFeatureAtPixel(pixel, options) {\n if (!this.frameState_ || !this.renderer_) {\n return false;\n }\n const coordinate = this.getCoordinateFromPixelInternal(pixel);\n options = options !== undefined ? options : {};\n const layerFilter =\n options.layerFilter !== undefined ? options.layerFilter : TRUE;\n const hitTolerance =\n options.hitTolerance !== undefined ? options.hitTolerance : 0;\n const checkWrapped = options.checkWrapped !== false;\n return this.renderer_.hasFeatureAtCoordinate(\n coordinate,\n this.frameState_,\n hitTolerance,\n checkWrapped,\n layerFilter,\n null\n );\n }\n\n /**\n * Returns the coordinate in user projection for a browser event.\n * @param {MouseEvent} event Event.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate.\n * @api\n */\n getEventCoordinate(event) {\n return this.getCoordinateFromPixel(this.getEventPixel(event));\n }\n\n /**\n * Returns the coordinate in view projection for a browser event.\n * @param {MouseEvent} event Event.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate.\n */\n getEventCoordinateInternal(event) {\n return this.getCoordinateFromPixelInternal(this.getEventPixel(event));\n }\n\n /**\n * Returns the map pixel position for a browser event relative to the viewport.\n * @param {UIEvent|{clientX: number, clientY: number}} event Event.\n * @return {import(\"./pixel.js\").Pixel} Pixel.\n * @api\n */\n getEventPixel(event) {\n const viewport = this.viewport_;\n const viewportPosition = viewport.getBoundingClientRect();\n const viewportSize = this.getSize();\n const scaleX = viewportPosition.width / viewportSize[0];\n const scaleY = viewportPosition.height / viewportSize[1];\n const eventPosition =\n //FIXME Are we really calling this with a TouchEvent anywhere?\n 'changedTouches' in event\n ? /** @type {TouchEvent} */ (event).changedTouches[0]\n : /** @type {MouseEvent} */ (event);\n\n return [\n (eventPosition.clientX - viewportPosition.left) / scaleX,\n (eventPosition.clientY - viewportPosition.top) / scaleY,\n ];\n }\n\n /**\n * Get the target in which this map is rendered.\n * Note that this returns what is entered as an option or in setTarget:\n * if that was an element, it returns an element; if a string, it returns that.\n * @return {HTMLElement|string|undefined} The Element or id of the Element that the\n * map is rendered in.\n * @observable\n * @api\n */\n getTarget() {\n return /** @type {HTMLElement|string|undefined} */ (\n this.get(MapProperty.TARGET)\n );\n }\n\n /**\n * Get the DOM element into which this map is rendered. In contrast to\n * `getTarget` this method always return an `Element`, or `null` if the\n * map has no target.\n * @return {HTMLElement} The element that the map is rendered in.\n * @api\n */\n getTargetElement() {\n return this.targetElement_;\n }\n\n /**\n * Get the coordinate for a given pixel. This returns a coordinate in the\n * user projection.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel position in the map viewport.\n * @return {import(\"./coordinate.js\").Coordinate} The coordinate for the pixel position.\n * @api\n */\n getCoordinateFromPixel(pixel) {\n return toUserCoordinate(\n this.getCoordinateFromPixelInternal(pixel),\n this.getView().getProjection()\n );\n }\n\n /**\n * Get the coordinate for a given pixel. This returns a coordinate in the\n * map view projection.\n * @param {import(\"./pixel.js\").Pixel} pixel Pixel position in the map viewport.\n * @return {import(\"./coordinate.js\").Coordinate} The coordinate for the pixel position.\n */\n getCoordinateFromPixelInternal(pixel) {\n const frameState = this.frameState_;\n if (!frameState) {\n return null;\n }\n return applyTransform(frameState.pixelToCoordinateTransform, pixel.slice());\n }\n\n /**\n * Get the map controls. Modifying this collection changes the controls\n * associated with the map.\n * @return {Collection} Controls.\n * @api\n */\n getControls() {\n return this.controls;\n }\n\n /**\n * Get the map overlays. Modifying this collection changes the overlays\n * associated with the map.\n * @return {Collection} Overlays.\n * @api\n */\n getOverlays() {\n return this.overlays_;\n }\n\n /**\n * Get an overlay by its identifier (the value returned by overlay.getId()).\n * Note that the index treats string and numeric identifiers as the same. So\n * `map.getOverlayById(2)` will return an overlay with id `'2'` or `2`.\n * @param {string|number} id Overlay identifier.\n * @return {import(\"./Overlay.js\").default} Overlay.\n * @api\n */\n getOverlayById(id) {\n const overlay = this.overlayIdIndex_[id.toString()];\n return overlay !== undefined ? overlay : null;\n }\n\n /**\n * Get the map interactions. Modifying this collection changes the interactions\n * associated with the map.\n *\n * Interactions are used for e.g. pan, zoom and rotate.\n * @return {Collection} Interactions.\n * @api\n */\n getInteractions() {\n return this.interactions;\n }\n\n /**\n * Get the layergroup associated with this map.\n * @return {LayerGroup} A layer group containing the layers in this map.\n * @observable\n * @api\n */\n getLayerGroup() {\n return /** @type {LayerGroup} */ (this.get(MapProperty.LAYERGROUP));\n }\n\n /**\n * Clear any existing layers and add layers to the map.\n * @param {Array|Collection} layers The layers to be added to the map.\n * @api\n */\n setLayers(layers) {\n const group = this.getLayerGroup();\n if (layers instanceof Collection) {\n group.setLayers(layers);\n return;\n }\n\n const collection = group.getLayers();\n collection.clear();\n collection.extend(layers);\n }\n\n /**\n * Get the collection of layers associated with this map.\n * @return {!Collection} Layers.\n * @api\n */\n getLayers() {\n const layers = this.getLayerGroup().getLayers();\n return layers;\n }\n\n /**\n * @return {boolean} Layers have sources that are still loading.\n */\n getLoadingOrNotReady() {\n const layerStatesArray = this.getLayerGroup().getLayerStatesArray();\n for (let i = 0, ii = layerStatesArray.length; i < ii; ++i) {\n const state = layerStatesArray[i];\n if (!state.visible) {\n continue;\n }\n const renderer = state.layer.getRenderer();\n if (renderer && !renderer.ready) {\n return true;\n }\n const source = state.layer.getSource();\n if (source && source.loading) {\n return true;\n }\n }\n return false;\n }\n\n /**\n * Get the pixel for a coordinate. This takes a coordinate in the user\n * projection and returns the corresponding pixel.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate A map coordinate.\n * @return {import(\"./pixel.js\").Pixel} A pixel position in the map viewport.\n * @api\n */\n getPixelFromCoordinate(coordinate) {\n const viewCoordinate = fromUserCoordinate(\n coordinate,\n this.getView().getProjection()\n );\n return this.getPixelFromCoordinateInternal(viewCoordinate);\n }\n\n /**\n * Get the pixel for a coordinate. This takes a coordinate in the map view\n * projection and returns the corresponding pixel.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate A map coordinate.\n * @return {import(\"./pixel.js\").Pixel} A pixel position in the map viewport.\n */\n getPixelFromCoordinateInternal(coordinate) {\n const frameState = this.frameState_;\n if (!frameState) {\n return null;\n }\n return applyTransform(\n frameState.coordinateToPixelTransform,\n coordinate.slice(0, 2)\n );\n }\n\n /**\n * Get the map renderer.\n * @return {import(\"./renderer/Map.js\").default|null} Renderer\n */\n getRenderer() {\n return this.renderer_;\n }\n\n /**\n * Get the size of this map.\n * @return {import(\"./size.js\").Size|undefined} The size in pixels of the map in the DOM.\n * @observable\n * @api\n */\n getSize() {\n return /** @type {import(\"./size.js\").Size|undefined} */ (\n this.get(MapProperty.SIZE)\n );\n }\n\n /**\n * Get the view associated with this map. A view manages properties such as\n * center and resolution.\n * @return {View} The view that controls this map.\n * @observable\n * @api\n */\n getView() {\n return /** @type {View} */ (this.get(MapProperty.VIEW));\n }\n\n /**\n * Get the element that serves as the map viewport.\n * @return {HTMLElement} Viewport.\n * @api\n */\n getViewport() {\n return this.viewport_;\n }\n\n /**\n * Get the element that serves as the container for overlays. Elements added to\n * this container will let mousedown and touchstart events through to the map,\n * so clicks and gestures on an overlay will trigger {@link module:ol/MapBrowserEvent~MapBrowserEvent}\n * events.\n * @return {!HTMLElement} The map's overlay container.\n */\n getOverlayContainer() {\n return this.overlayContainer_;\n }\n\n /**\n * Get the element that serves as a container for overlays that don't allow\n * event propagation. Elements added to this container won't let mousedown and\n * touchstart events through to the map, so clicks and gestures on an overlay\n * don't trigger any {@link module:ol/MapBrowserEvent~MapBrowserEvent}.\n * @return {!HTMLElement} The map's overlay container that stops events.\n */\n getOverlayContainerStopEvent() {\n return this.overlayContainerStopEvent_;\n }\n\n /**\n * @return {!Document} The document where the map is displayed.\n */\n getOwnerDocument() {\n const targetElement = this.getTargetElement();\n return targetElement ? targetElement.ownerDocument : document;\n }\n\n /**\n * @param {import(\"./Tile.js\").default} tile Tile.\n * @param {string} tileSourceKey Tile source key.\n * @param {import(\"./coordinate.js\").Coordinate} tileCenter Tile center.\n * @param {number} tileResolution Tile resolution.\n * @return {number} Tile priority.\n */\n getTilePriority(tile, tileSourceKey, tileCenter, tileResolution) {\n return getTilePriority(\n this.frameState_,\n tile,\n tileSourceKey,\n tileCenter,\n tileResolution\n );\n }\n\n /**\n * @param {UIEvent} browserEvent Browser event.\n * @param {string} [type] Type.\n */\n handleBrowserEvent(browserEvent, type) {\n type = type || browserEvent.type;\n const mapBrowserEvent = new MapBrowserEvent(type, this, browserEvent);\n this.handleMapBrowserEvent(mapBrowserEvent);\n }\n\n /**\n * @param {MapBrowserEvent} mapBrowserEvent The event to handle.\n */\n handleMapBrowserEvent(mapBrowserEvent) {\n if (!this.frameState_) {\n // With no view defined, we cannot translate pixels into geographical\n // coordinates so interactions cannot be used.\n return;\n }\n const originalEvent = /** @type {PointerEvent} */ (\n mapBrowserEvent.originalEvent\n );\n const eventType = originalEvent.type;\n if (\n eventType === PointerEventType.POINTERDOWN ||\n eventType === EventType.WHEEL ||\n eventType === EventType.KEYDOWN\n ) {\n const doc = this.getOwnerDocument();\n const rootNode = this.viewport_.getRootNode\n ? this.viewport_.getRootNode()\n : doc;\n const target = /** @type {Node} */ (originalEvent.target);\n if (\n // Abort if the target is a child of the container for elements whose events are not meant\n // to be handled by map interactions.\n this.overlayContainerStopEvent_.contains(target) ||\n // Abort if the event target is a child of the container that is no longer in the page.\n // It's possible for the target to no longer be in the page if it has been removed in an\n // event listener, this might happen in a Control that recreates it's content based on\n // user interaction either manually or via a render in something like https://reactjs.org/\n !(rootNode === doc ? doc.documentElement : rootNode).contains(target)\n ) {\n return;\n }\n }\n mapBrowserEvent.frameState = this.frameState_;\n if (this.dispatchEvent(mapBrowserEvent) !== false) {\n const interactionsArray = this.getInteractions().getArray().slice();\n for (let i = interactionsArray.length - 1; i >= 0; i--) {\n const interaction = interactionsArray[i];\n if (\n interaction.getMap() !== this ||\n !interaction.getActive() ||\n !this.getTargetElement()\n ) {\n continue;\n }\n const cont = interaction.handleEvent(mapBrowserEvent);\n if (!cont || mapBrowserEvent.propagationStopped) {\n break;\n }\n }\n }\n }\n\n /**\n * @protected\n */\n handlePostRender() {\n const frameState = this.frameState_;\n\n // Manage the tile queue\n // Image loads are expensive and a limited resource, so try to use them\n // efficiently:\n // * When the view is static we allow a large number of parallel tile loads\n // to complete the frame as quickly as possible.\n // * When animating or interacting, image loads can cause janks, so we reduce\n // the maximum number of loads per frame and limit the number of parallel\n // tile loads to remain reactive to view changes and to reduce the chance of\n // loading tiles that will quickly disappear from view.\n const tileQueue = this.tileQueue_;\n if (!tileQueue.isEmpty()) {\n let maxTotalLoading = this.maxTilesLoading_;\n let maxNewLoads = maxTotalLoading;\n if (frameState) {\n const hints = frameState.viewHints;\n if (hints[ViewHint.ANIMATING] || hints[ViewHint.INTERACTING]) {\n const lowOnFrameBudget = Date.now() - frameState.time > 8;\n maxTotalLoading = lowOnFrameBudget ? 0 : 8;\n maxNewLoads = lowOnFrameBudget ? 0 : 2;\n }\n }\n if (tileQueue.getTilesLoading() < maxTotalLoading) {\n tileQueue.reprioritize(); // FIXME only call if view has changed\n tileQueue.loadMoreTiles(maxTotalLoading, maxNewLoads);\n }\n }\n\n if (frameState && this.renderer_ && !frameState.animate) {\n if (this.renderComplete_ === true) {\n if (this.hasListener(RenderEventType.RENDERCOMPLETE)) {\n this.renderer_.dispatchRenderEvent(\n RenderEventType.RENDERCOMPLETE,\n frameState\n );\n }\n if (this.loaded_ === false) {\n this.loaded_ = true;\n this.dispatchEvent(\n new MapEvent(MapEventType.LOADEND, this, frameState)\n );\n }\n } else if (this.loaded_ === true) {\n this.loaded_ = false;\n this.dispatchEvent(\n new MapEvent(MapEventType.LOADSTART, this, frameState)\n );\n }\n }\n\n const postRenderFunctions = this.postRenderFunctions_;\n for (let i = 0, ii = postRenderFunctions.length; i < ii; ++i) {\n postRenderFunctions[i](this, frameState);\n }\n postRenderFunctions.length = 0;\n }\n\n /**\n * @private\n */\n handleSizeChanged_() {\n if (this.getView() && !this.getView().getAnimating()) {\n this.getView().resolveConstraints(0);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n handleTargetChanged_() {\n if (this.mapBrowserEventHandler_) {\n for (let i = 0, ii = this.targetChangeHandlerKeys_.length; i < ii; ++i) {\n unlistenByKey(this.targetChangeHandlerKeys_[i]);\n }\n this.targetChangeHandlerKeys_ = null;\n this.viewport_.removeEventListener(\n EventType.CONTEXTMENU,\n this.boundHandleBrowserEvent_\n );\n this.viewport_.removeEventListener(\n EventType.WHEEL,\n this.boundHandleBrowserEvent_\n );\n this.mapBrowserEventHandler_.dispose();\n this.mapBrowserEventHandler_ = null;\n removeNode(this.viewport_);\n }\n\n if (this.targetElement_) {\n this.resizeObserver_.unobserve(this.targetElement_);\n const rootNode = this.targetElement_.getRootNode();\n if (rootNode instanceof ShadowRoot) {\n this.resizeObserver_.unobserve(rootNode.host);\n }\n this.setSize(undefined);\n }\n\n // target may be undefined, null, a string or an Element.\n // If it's a string we convert it to an Element before proceeding.\n // If it's not now an Element we remove the viewport from the DOM.\n // If it's an Element we append the viewport element to it.\n\n const target = this.getTarget();\n const targetElement =\n typeof target === 'string' ? document.getElementById(target) : target;\n this.targetElement_ = targetElement;\n if (!targetElement) {\n if (this.renderer_) {\n clearTimeout(this.postRenderTimeoutHandle_);\n this.postRenderTimeoutHandle_ = undefined;\n this.postRenderFunctions_.length = 0;\n this.renderer_.dispose();\n this.renderer_ = null;\n }\n if (this.animationDelayKey_) {\n cancelAnimationFrame(this.animationDelayKey_);\n this.animationDelayKey_ = undefined;\n }\n } else {\n targetElement.appendChild(this.viewport_);\n if (!this.renderer_) {\n this.renderer_ = new CompositeMapRenderer(this);\n }\n\n this.mapBrowserEventHandler_ = new MapBrowserEventHandler(\n this,\n this.moveTolerance_\n );\n for (const key in MapBrowserEventType) {\n this.mapBrowserEventHandler_.addEventListener(\n MapBrowserEventType[key],\n this.handleMapBrowserEvent.bind(this)\n );\n }\n this.viewport_.addEventListener(\n EventType.CONTEXTMENU,\n this.boundHandleBrowserEvent_,\n false\n );\n this.viewport_.addEventListener(\n EventType.WHEEL,\n this.boundHandleBrowserEvent_,\n PASSIVE_EVENT_LISTENERS ? {passive: false} : false\n );\n\n const keyboardEventTarget = !this.keyboardEventTarget_\n ? targetElement\n : this.keyboardEventTarget_;\n this.targetChangeHandlerKeys_ = [\n listen(\n keyboardEventTarget,\n EventType.KEYDOWN,\n this.handleBrowserEvent,\n this\n ),\n listen(\n keyboardEventTarget,\n EventType.KEYPRESS,\n this.handleBrowserEvent,\n this\n ),\n ];\n const rootNode = targetElement.getRootNode();\n if (rootNode instanceof ShadowRoot) {\n this.resizeObserver_.observe(rootNode.host);\n }\n this.resizeObserver_.observe(targetElement);\n }\n\n this.updateSize();\n // updateSize calls setSize, so no need to call this.render\n // ourselves here.\n }\n\n /**\n * @private\n */\n handleTileChange_() {\n this.render();\n }\n\n /**\n * @private\n */\n handleViewPropertyChanged_() {\n this.render();\n }\n\n /**\n * @private\n */\n handleViewChanged_() {\n if (this.viewPropertyListenerKey_) {\n unlistenByKey(this.viewPropertyListenerKey_);\n this.viewPropertyListenerKey_ = null;\n }\n if (this.viewChangeListenerKey_) {\n unlistenByKey(this.viewChangeListenerKey_);\n this.viewChangeListenerKey_ = null;\n }\n const view = this.getView();\n if (view) {\n this.updateViewportSize_();\n\n this.viewPropertyListenerKey_ = listen(\n view,\n ObjectEventType.PROPERTYCHANGE,\n this.handleViewPropertyChanged_,\n this\n );\n this.viewChangeListenerKey_ = listen(\n view,\n EventType.CHANGE,\n this.handleViewPropertyChanged_,\n this\n );\n\n view.resolveConstraints(0);\n }\n this.render();\n }\n\n /**\n * @private\n */\n handleLayerGroupChanged_() {\n if (this.layerGroupPropertyListenerKeys_) {\n this.layerGroupPropertyListenerKeys_.forEach(unlistenByKey);\n this.layerGroupPropertyListenerKeys_ = null;\n }\n const layerGroup = this.getLayerGroup();\n if (layerGroup) {\n this.handleLayerAdd_(new GroupEvent('addlayer', layerGroup));\n this.layerGroupPropertyListenerKeys_ = [\n listen(layerGroup, ObjectEventType.PROPERTYCHANGE, this.render, this),\n listen(layerGroup, EventType.CHANGE, this.render, this),\n listen(layerGroup, 'addlayer', this.handleLayerAdd_, this),\n listen(layerGroup, 'removelayer', this.handleLayerRemove_, this),\n ];\n }\n this.render();\n }\n\n /**\n * @return {boolean} Is rendered.\n */\n isRendered() {\n return !!this.frameState_;\n }\n\n /**\n * @private\n */\n animationDelay_() {\n this.animationDelayKey_ = undefined;\n this.renderFrame_(Date.now());\n }\n\n /**\n * Requests an immediate render in a synchronous manner.\n * @api\n */\n renderSync() {\n if (this.animationDelayKey_) {\n cancelAnimationFrame(this.animationDelayKey_);\n }\n this.animationDelay_();\n }\n\n /**\n * Redraws all text after new fonts have loaded\n */\n redrawText() {\n const layerStates = this.getLayerGroup().getLayerStatesArray();\n for (let i = 0, ii = layerStates.length; i < ii; ++i) {\n const layer = layerStates[i].layer;\n if (layer.hasRenderer()) {\n layer.getRenderer().handleFontsChanged();\n }\n }\n }\n\n /**\n * Request a map rendering (at the next animation frame).\n * @api\n */\n render() {\n if (this.renderer_ && this.animationDelayKey_ === undefined) {\n this.animationDelayKey_ = requestAnimationFrame(this.animationDelay_);\n }\n }\n\n /**\n * This method is meant to be called in a layer's `prerender` listener. It causes all collected\n * declutter items to be decluttered and rendered on the map immediately. This is useful for\n * layers that need to appear entirely above the decluttered items of layers lower in the layer\n * stack.\n * @api\n */\n flushDeclutterItems() {\n const frameState = this.frameState_;\n if (!frameState) {\n return;\n }\n this.renderer_.flushDeclutterItems(frameState);\n }\n\n /**\n * Remove the given control from the map.\n * @param {import(\"./control/Control.js\").default} control Control.\n * @return {import(\"./control/Control.js\").default|undefined} The removed control (or undefined\n * if the control was not found).\n * @api\n */\n removeControl(control) {\n return this.getControls().remove(control);\n }\n\n /**\n * Remove the given interaction from the map.\n * @param {import(\"./interaction/Interaction.js\").default} interaction Interaction to remove.\n * @return {import(\"./interaction/Interaction.js\").default|undefined} The removed interaction (or\n * undefined if the interaction was not found).\n * @api\n */\n removeInteraction(interaction) {\n return this.getInteractions().remove(interaction);\n }\n\n /**\n * Removes the given layer from the map.\n * @param {import(\"./layer/Base.js\").default} layer Layer.\n * @return {import(\"./layer/Base.js\").default|undefined} The removed layer (or undefined if the\n * layer was not found).\n * @api\n */\n removeLayer(layer) {\n const layers = this.getLayerGroup().getLayers();\n return layers.remove(layer);\n }\n\n /**\n * @param {import(\"./layer/Group.js\").GroupEvent} event The layer remove event.\n * @private\n */\n handleLayerRemove_(event) {\n removeLayerMapProperty(event.layer);\n }\n\n /**\n * Remove the given overlay from the map.\n * @param {import(\"./Overlay.js\").default} overlay Overlay.\n * @return {import(\"./Overlay.js\").default|undefined} The removed overlay (or undefined\n * if the overlay was not found).\n * @api\n */\n removeOverlay(overlay) {\n return this.getOverlays().remove(overlay);\n }\n\n /**\n * @param {number} time Time.\n * @private\n */\n renderFrame_(time) {\n const size = this.getSize();\n const view = this.getView();\n const previousFrameState = this.frameState_;\n /** @type {?FrameState} */\n let frameState = null;\n if (size !== undefined && hasArea(size) && view && view.isDef()) {\n const viewHints = view.getHints(\n this.frameState_ ? this.frameState_.viewHints : undefined\n );\n const viewState = view.getState();\n frameState = {\n animate: false,\n coordinateToPixelTransform: this.coordinateToPixelTransform_,\n declutterTree: null,\n extent: getForViewAndSize(\n viewState.center,\n viewState.resolution,\n viewState.rotation,\n size\n ),\n index: this.frameIndex_++,\n layerIndex: 0,\n layerStatesArray: this.getLayerGroup().getLayerStatesArray(),\n pixelRatio: this.pixelRatio_,\n pixelToCoordinateTransform: this.pixelToCoordinateTransform_,\n postRenderFunctions: [],\n size: size,\n tileQueue: this.tileQueue_,\n time: time,\n usedTiles: {},\n viewState: viewState,\n viewHints: viewHints,\n wantedTiles: {},\n mapId: getUid(this),\n renderTargets: {},\n };\n if (viewState.nextCenter && viewState.nextResolution) {\n const rotation = isNaN(viewState.nextRotation)\n ? viewState.rotation\n : viewState.nextRotation;\n\n frameState.nextExtent = getForViewAndSize(\n viewState.nextCenter,\n viewState.nextResolution,\n rotation,\n size\n );\n }\n }\n\n this.frameState_ = frameState;\n this.renderer_.renderFrame(frameState);\n\n if (frameState) {\n if (frameState.animate) {\n this.render();\n }\n Array.prototype.push.apply(\n this.postRenderFunctions_,\n frameState.postRenderFunctions\n );\n\n if (previousFrameState) {\n const moveStart =\n !this.previousExtent_ ||\n (!isEmpty(this.previousExtent_) &&\n !equalsExtent(frameState.extent, this.previousExtent_));\n if (moveStart) {\n this.dispatchEvent(\n new MapEvent(MapEventType.MOVESTART, this, previousFrameState)\n );\n this.previousExtent_ = createOrUpdateEmpty(this.previousExtent_);\n }\n }\n\n const idle =\n this.previousExtent_ &&\n !frameState.viewHints[ViewHint.ANIMATING] &&\n !frameState.viewHints[ViewHint.INTERACTING] &&\n !equalsExtent(frameState.extent, this.previousExtent_);\n\n if (idle) {\n this.dispatchEvent(\n new MapEvent(MapEventType.MOVEEND, this, frameState)\n );\n clone(frameState.extent, this.previousExtent_);\n }\n }\n\n this.dispatchEvent(new MapEvent(MapEventType.POSTRENDER, this, frameState));\n\n this.renderComplete_ =\n this.hasListener(MapEventType.LOADSTART) ||\n this.hasListener(MapEventType.LOADEND) ||\n this.hasListener(RenderEventType.RENDERCOMPLETE)\n ? !this.tileQueue_.getTilesLoading() &&\n !this.tileQueue_.getCount() &&\n !this.getLoadingOrNotReady()\n : undefined;\n\n if (!this.postRenderTimeoutHandle_) {\n this.postRenderTimeoutHandle_ = setTimeout(() => {\n this.postRenderTimeoutHandle_ = undefined;\n this.handlePostRender();\n }, 0);\n }\n }\n\n /**\n * Sets the layergroup of this map.\n * @param {LayerGroup} layerGroup A layer group containing the layers in this map.\n * @observable\n * @api\n */\n setLayerGroup(layerGroup) {\n const oldLayerGroup = this.getLayerGroup();\n if (oldLayerGroup) {\n this.handleLayerRemove_(new GroupEvent('removelayer', oldLayerGroup));\n }\n this.set(MapProperty.LAYERGROUP, layerGroup);\n }\n\n /**\n * Set the size of this map.\n * @param {import(\"./size.js\").Size|undefined} size The size in pixels of the map in the DOM.\n * @observable\n * @api\n */\n setSize(size) {\n this.set(MapProperty.SIZE, size);\n }\n\n /**\n * Set the target element to render this map into.\n * @param {HTMLElement|string} [target] The Element or id of the Element\n * that the map is rendered in.\n * @observable\n * @api\n */\n setTarget(target) {\n this.set(MapProperty.TARGET, target);\n }\n\n /**\n * Set the view for this map.\n * @param {View|Promise} view The view that controls this map.\n * It is also possible to pass a promise that resolves to options for constructing a view. This\n * alternative allows view properties to be resolved by sources or other components that load\n * view-related metadata.\n * @observable\n * @api\n */\n setView(view) {\n if (!view || view instanceof View) {\n this.set(MapProperty.VIEW, view);\n return;\n }\n this.set(MapProperty.VIEW, new View());\n\n const map = this;\n view.then(function (viewOptions) {\n map.setView(new View(viewOptions));\n });\n }\n\n /**\n * Force a recalculation of the map viewport size. This should be called when\n * third-party code changes the size of the map viewport.\n * @api\n */\n updateSize() {\n const targetElement = this.getTargetElement();\n\n let size = undefined;\n if (targetElement) {\n const computedStyle = getComputedStyle(targetElement);\n const width =\n targetElement.offsetWidth -\n parseFloat(computedStyle['borderLeftWidth']) -\n parseFloat(computedStyle['paddingLeft']) -\n parseFloat(computedStyle['paddingRight']) -\n parseFloat(computedStyle['borderRightWidth']);\n const height =\n targetElement.offsetHeight -\n parseFloat(computedStyle['borderTopWidth']) -\n parseFloat(computedStyle['paddingTop']) -\n parseFloat(computedStyle['paddingBottom']) -\n parseFloat(computedStyle['borderBottomWidth']);\n if (!isNaN(width) && !isNaN(height)) {\n size = [width, height];\n if (\n !hasArea(size) &&\n !!(\n targetElement.offsetWidth ||\n targetElement.offsetHeight ||\n targetElement.getClientRects().length\n )\n ) {\n warn(\n \"No map visible because the map container's width or height are 0.\"\n );\n }\n }\n }\n\n const oldSize = this.getSize();\n if (size && (!oldSize || !equals(size, oldSize))) {\n this.setSize(size);\n this.updateViewportSize_();\n }\n }\n\n /**\n * Recomputes the viewport size and save it on the view object (if any)\n * @private\n */\n updateViewportSize_() {\n const view = this.getView();\n if (view) {\n let size = undefined;\n const computedStyle = getComputedStyle(this.viewport_);\n if (computedStyle.width && computedStyle.height) {\n size = [\n parseInt(computedStyle.width, 10),\n parseInt(computedStyle.height, 10),\n ];\n }\n view.setViewportSize(size);\n }\n }\n}\n\n/**\n * @param {MapOptions} options Map options.\n * @return {MapOptionsInternal} Internal map options.\n */\nfunction createOptionsInternal(options) {\n /**\n * @type {HTMLElement|Document}\n */\n let keyboardEventTarget = null;\n if (options.keyboardEventTarget !== undefined) {\n keyboardEventTarget =\n typeof options.keyboardEventTarget === 'string'\n ? document.getElementById(options.keyboardEventTarget)\n : options.keyboardEventTarget;\n }\n\n /**\n * @type {Object}\n */\n const values = {};\n\n const layerGroup =\n options.layers &&\n typeof (/** @type {?} */ (options.layers).getLayers) === 'function'\n ? /** @type {LayerGroup} */ (options.layers)\n : new LayerGroup({\n layers:\n /** @type {Collection|Array} */ (\n options.layers\n ),\n });\n values[MapProperty.LAYERGROUP] = layerGroup;\n\n values[MapProperty.TARGET] = options.target;\n\n values[MapProperty.VIEW] =\n options.view instanceof View ? options.view : new View();\n\n /** @type {Collection} */\n let controls;\n if (options.controls !== undefined) {\n if (Array.isArray(options.controls)) {\n controls = new Collection(options.controls.slice());\n } else {\n assert(\n typeof (/** @type {?} */ (options.controls).getArray) === 'function',\n 47\n ); // Expected `controls` to be an array or an `import(\"./Collection.js\").Collection`\n controls = options.controls;\n }\n }\n\n /** @type {Collection} */\n let interactions;\n if (options.interactions !== undefined) {\n if (Array.isArray(options.interactions)) {\n interactions = new Collection(options.interactions.slice());\n } else {\n assert(\n typeof (/** @type {?} */ (options.interactions).getArray) ===\n 'function',\n 48\n ); // Expected `interactions` to be an array or an `import(\"./Collection.js\").Collection`\n interactions = options.interactions;\n }\n }\n\n /** @type {Collection} */\n let overlays;\n if (options.overlays !== undefined) {\n if (Array.isArray(options.overlays)) {\n overlays = new Collection(options.overlays.slice());\n } else {\n assert(\n typeof (/** @type {?} */ (options.overlays).getArray) === 'function',\n 49\n ); // Expected `overlays` to be an array or an `import(\"./Collection.js\").Collection`\n overlays = options.overlays;\n }\n } else {\n overlays = new Collection();\n }\n\n return {\n controls: controls,\n interactions: interactions,\n keyboardEventTarget: keyboardEventTarget,\n overlays: overlays,\n values: values,\n };\n}\nexport default Map;\n", "/**\n * @module ol/TileRange\n */\n\n/**\n * A representation of a contiguous block of tiles. A tile range is specified\n * by its min/max tile coordinates and is inclusive of coordinates.\n */\nclass TileRange {\n /**\n * @param {number} minX Minimum X.\n * @param {number} maxX Maximum X.\n * @param {number} minY Minimum Y.\n * @param {number} maxY Maximum Y.\n */\n constructor(minX, maxX, minY, maxY) {\n /**\n * @type {number}\n */\n this.minX = minX;\n\n /**\n * @type {number}\n */\n this.maxX = maxX;\n\n /**\n * @type {number}\n */\n this.minY = minY;\n\n /**\n * @type {number}\n */\n this.maxY = maxY;\n }\n\n /**\n * @param {import(\"./tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {boolean} Contains tile coordinate.\n */\n contains(tileCoord) {\n return this.containsXY(tileCoord[1], tileCoord[2]);\n }\n\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Contains.\n */\n containsTileRange(tileRange) {\n return (\n this.minX <= tileRange.minX &&\n tileRange.maxX <= this.maxX &&\n this.minY <= tileRange.minY &&\n tileRange.maxY <= this.maxY\n );\n }\n\n /**\n * @param {number} x Tile coordinate x.\n * @param {number} y Tile coordinate y.\n * @return {boolean} Contains coordinate.\n */\n containsXY(x, y) {\n return this.minX <= x && x <= this.maxX && this.minY <= y && y <= this.maxY;\n }\n\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Equals.\n */\n equals(tileRange) {\n return (\n this.minX == tileRange.minX &&\n this.minY == tileRange.minY &&\n this.maxX == tileRange.maxX &&\n this.maxY == tileRange.maxY\n );\n }\n\n /**\n * @param {TileRange} tileRange Tile range.\n */\n extend(tileRange) {\n if (tileRange.minX < this.minX) {\n this.minX = tileRange.minX;\n }\n if (tileRange.maxX > this.maxX) {\n this.maxX = tileRange.maxX;\n }\n if (tileRange.minY < this.minY) {\n this.minY = tileRange.minY;\n }\n if (tileRange.maxY > this.maxY) {\n this.maxY = tileRange.maxY;\n }\n }\n\n /**\n * @return {number} Height.\n */\n getHeight() {\n return this.maxY - this.minY + 1;\n }\n\n /**\n * @return {import(\"./size.js\").Size} Size.\n */\n getSize() {\n return [this.getWidth(), this.getHeight()];\n }\n\n /**\n * @return {number} Width.\n */\n getWidth() {\n return this.maxX - this.minX + 1;\n }\n\n /**\n * @param {TileRange} tileRange Tile range.\n * @return {boolean} Intersects.\n */\n intersects(tileRange) {\n return (\n this.minX <= tileRange.maxX &&\n this.maxX >= tileRange.minX &&\n this.minY <= tileRange.maxY &&\n this.maxY >= tileRange.minY\n );\n }\n}\n\n/**\n * @param {number} minX Minimum X.\n * @param {number} maxX Maximum X.\n * @param {number} minY Minimum Y.\n * @param {number} maxY Maximum Y.\n * @param {TileRange} [tileRange] TileRange.\n * @return {TileRange} Tile range.\n */\nexport function createOrUpdate(minX, maxX, minY, maxY, tileRange) {\n if (tileRange !== undefined) {\n tileRange.minX = minX;\n tileRange.maxX = maxX;\n tileRange.minY = minY;\n tileRange.maxY = maxY;\n return tileRange;\n }\n return new TileRange(minX, maxX, minY, maxY);\n}\n\nexport default TileRange;\n", "/**\n * @module ol/tilecoord\n */\n\n/**\n * An array of three numbers representing the location of a tile in a tile\n * grid. The order is `z` (zoom level), `x` (column), and `y` (row).\n * @typedef {Array} TileCoord\n * @api\n */\n\n/**\n * @param {number} z Z.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {TileCoord} [tileCoord] Tile coordinate.\n * @return {TileCoord} Tile coordinate.\n */\nexport function createOrUpdate(z, x, y, tileCoord) {\n if (tileCoord !== undefined) {\n tileCoord[0] = z;\n tileCoord[1] = x;\n tileCoord[2] = y;\n return tileCoord;\n }\n return [z, x, y];\n}\n\n/**\n * @param {number} z Z.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {string} Key.\n */\nexport function getKeyZXY(z, x, y) {\n return z + '/' + x + '/' + y;\n}\n\n/**\n * Get the key for a tile coord.\n * @param {TileCoord} tileCoord The tile coord.\n * @return {string} Key.\n */\nexport function getKey(tileCoord) {\n return getKeyZXY(tileCoord[0], tileCoord[1], tileCoord[2]);\n}\n\n/**\n * Get the tile cache key for a tile key obtained through `tile.getKey()`.\n * @param {string} tileKey The tile key.\n * @return {string} The cache key.\n */\nexport function getCacheKeyForTileKey(tileKey) {\n const [z, x, y] = tileKey\n .substring(tileKey.lastIndexOf('/') + 1, tileKey.length)\n .split(',')\n .map(Number);\n return getKeyZXY(z, x, y);\n}\n\n/**\n * Get a tile coord given a key.\n * @param {string} key The tile coord key.\n * @return {TileCoord} The tile coord.\n */\nexport function fromKey(key) {\n return key.split('/').map(Number);\n}\n\n/**\n * @param {TileCoord} tileCoord Tile coord.\n * @return {number} Hash.\n */\nexport function hash(tileCoord) {\n return (tileCoord[1] << tileCoord[0]) + tileCoord[2];\n}\n\n/**\n * @param {TileCoord} tileCoord Tile coordinate.\n * @param {!import(\"./tilegrid/TileGrid.js\").default} tileGrid Tile grid.\n * @return {boolean} Tile coordinate is within extent and zoom level range.\n */\nexport function withinExtentAndZ(tileCoord, tileGrid) {\n const z = tileCoord[0];\n const x = tileCoord[1];\n const y = tileCoord[2];\n\n if (tileGrid.getMinZoom() > z || z > tileGrid.getMaxZoom()) {\n return false;\n }\n const tileRange = tileGrid.getFullTileRange(z);\n if (!tileRange) {\n return true;\n }\n return tileRange.containsXY(x, y);\n}\n", "/**\n * @module ol/tilegrid/TileGrid\n */\nimport TileRange, {\n createOrUpdate as createOrUpdateTileRange,\n} from '../TileRange.js';\nimport {DEFAULT_TILE_SIZE} from './common.js';\nimport {assert} from '../asserts.js';\nimport {ceil, clamp, floor} from '../math.js';\nimport {createOrUpdate, getTopLeft} from '../extent.js';\nimport {createOrUpdate as createOrUpdateTileCoord} from '../tilecoord.js';\nimport {intersectsLinearRing} from '../geom/flat/intersectsextent.js';\nimport {isSorted, linearFindNearest} from '../array.js';\nimport {toSize} from '../size.js';\n\n/**\n * @private\n * @type {import(\"../tilecoord.js\").TileCoord}\n */\nconst tmpTileCoord = [0, 0, 0];\n\n/**\n * Number of decimal digits to consider in integer values when rounding.\n * @type {number}\n */\nconst DECIMALS = 5;\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../extent.js\").Extent} [extent] Extent for the tile grid. No tiles outside this\n * extent will be requested by {@link module:ol/source/Tile~TileSource} sources. When no `origin` or\n * `origins` are configured, the `origin` will be set to the top-left corner of the extent.\n * @property {number} [minZoom=0] Minimum zoom.\n * @property {import(\"../coordinate.js\").Coordinate} [origin] The tile grid origin, i.e. where the `x`\n * and `y` axes meet (`[z, 0, 0]`). Tile coordinates increase left to right and downwards. If not\n * specified, `extent` or `origins` must be provided.\n * @property {Array} [origins] Tile grid origins, i.e. where\n * the `x` and `y` axes meet (`[z, 0, 0]`), for each zoom level. If given, the array length\n * should match the length of the `resolutions` array, i.e. each resolution can have a different\n * origin. Tile coordinates increase left to right and downwards. If not specified, `extent` or\n * `origin` must be provided.\n * @property {!Array} resolutions Resolutions. The array index of each resolution needs\n * to match the zoom level. This means that even if a `minZoom` is configured, the resolutions\n * array will have a length of `maxZoom + 1`.\n * @property {Array} [sizes] Number of tile rows and columns\n * of the grid for each zoom level. If specified the values\n * define each zoom level's extent together with the `origin` or `origins`.\n * A grid `extent` can be configured in addition, and will further limit the extent\n * for which tile requests are made by sources. If the bottom-left corner of\n * an extent is used as `origin` or `origins`, then the `y` value must be\n * negative because OpenLayers tile coordinates use the top left as the origin.\n * @property {number|import(\"../size.js\").Size} [tileSize] Tile size.\n * Default is `[256, 256]`.\n * @property {Array} [tileSizes] Tile sizes. If given, the array length\n * should match the length of the `resolutions` array, i.e. each resolution can have a different\n * tile size.\n */\n\n/**\n * @classdesc\n * Base class for setting the grid pattern for sources accessing tiled-image\n * servers.\n * @api\n */\nclass TileGrid {\n /**\n * @param {Options} options Tile grid options.\n */\n constructor(options) {\n /**\n * @protected\n * @type {number}\n */\n this.minZoom = options.minZoom !== undefined ? options.minZoom : 0;\n\n /**\n * @private\n * @type {!Array}\n */\n this.resolutions_ = options.resolutions;\n assert(\n isSorted(\n this.resolutions_,\n function (a, b) {\n return b - a;\n },\n true\n ),\n 17\n ); // `resolutions` must be sorted in descending order\n\n // check if we've got a consistent zoom factor and origin\n let zoomFactor;\n if (!options.origins) {\n for (let i = 0, ii = this.resolutions_.length - 1; i < ii; ++i) {\n if (!zoomFactor) {\n zoomFactor = this.resolutions_[i] / this.resolutions_[i + 1];\n } else {\n if (this.resolutions_[i] / this.resolutions_[i + 1] !== zoomFactor) {\n zoomFactor = undefined;\n break;\n }\n }\n }\n }\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.zoomFactor_ = zoomFactor;\n\n /**\n * @protected\n * @type {number}\n */\n this.maxZoom = this.resolutions_.length - 1;\n\n /**\n * @private\n * @type {import(\"../coordinate.js\").Coordinate|null}\n */\n this.origin_ = options.origin !== undefined ? options.origin : null;\n\n /**\n * @private\n * @type {Array}\n */\n this.origins_ = null;\n if (options.origins !== undefined) {\n this.origins_ = options.origins;\n assert(this.origins_.length == this.resolutions_.length, 20); // Number of `origins` and `resolutions` must be equal\n }\n\n const extent = options.extent;\n\n if (extent !== undefined && !this.origin_ && !this.origins_) {\n this.origin_ = getTopLeft(extent);\n }\n\n assert(\n (!this.origin_ && this.origins_) || (this.origin_ && !this.origins_),\n 18\n ); // Either `origin` or `origins` must be configured, never both\n\n /**\n * @private\n * @type {Array}\n */\n this.tileSizes_ = null;\n if (options.tileSizes !== undefined) {\n this.tileSizes_ = options.tileSizes;\n assert(this.tileSizes_.length == this.resolutions_.length, 19); // Number of `tileSizes` and `resolutions` must be equal\n }\n\n /**\n * @private\n * @type {number|import(\"../size.js\").Size}\n */\n this.tileSize_ =\n options.tileSize !== undefined\n ? options.tileSize\n : !this.tileSizes_\n ? DEFAULT_TILE_SIZE\n : null;\n assert(\n (!this.tileSize_ && this.tileSizes_) ||\n (this.tileSize_ && !this.tileSizes_),\n 22\n ); // Either `tileSize` or `tileSizes` must be configured, never both\n\n /**\n * @private\n * @type {import(\"../extent.js\").Extent}\n */\n this.extent_ = extent !== undefined ? extent : null;\n\n /**\n * @private\n * @type {Array}\n */\n this.fullTileRanges_ = null;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.tmpSize_ = [0, 0];\n\n /**\n * @private\n * @type {import(\"../extent.js\").Extent}\n */\n this.tmpExtent_ = [0, 0, 0, 0];\n\n if (options.sizes !== undefined) {\n this.fullTileRanges_ = options.sizes.map(function (size, z) {\n const tileRange = new TileRange(\n Math.min(0, size[0]),\n Math.max(size[0] - 1, -1),\n Math.min(0, size[1]),\n Math.max(size[1] - 1, -1)\n );\n if (extent) {\n const restrictedTileRange = this.getTileRangeForExtentAndZ(extent, z);\n tileRange.minX = Math.max(restrictedTileRange.minX, tileRange.minX);\n tileRange.maxX = Math.min(restrictedTileRange.maxX, tileRange.maxX);\n tileRange.minY = Math.max(restrictedTileRange.minY, tileRange.minY);\n tileRange.maxY = Math.min(restrictedTileRange.maxY, tileRange.maxY);\n }\n return tileRange;\n }, this);\n } else if (extent) {\n this.calculateTileRanges_(extent);\n }\n }\n\n /**\n * Call a function with each tile coordinate for a given extent and zoom level.\n *\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {number} zoom Integer zoom level.\n * @param {function(import(\"../tilecoord.js\").TileCoord): void} callback Function called with each tile coordinate.\n * @api\n */\n forEachTileCoord(extent, zoom, callback) {\n const tileRange = this.getTileRangeForExtentAndZ(extent, zoom);\n for (let i = tileRange.minX, ii = tileRange.maxX; i <= ii; ++i) {\n for (let j = tileRange.minY, jj = tileRange.maxY; j <= jj; ++j) {\n callback([zoom, i, j]);\n }\n }\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {function(number, import(\"../TileRange.js\").default): boolean} callback Callback.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary import(\"../extent.js\").Extent object.\n * @return {boolean} Callback succeeded.\n */\n forEachTileCoordParentTileRange(\n tileCoord,\n callback,\n tempTileRange,\n tempExtent\n ) {\n let tileRange, x, y;\n let tileCoordExtent = null;\n let z = tileCoord[0] - 1;\n if (this.zoomFactor_ === 2) {\n x = tileCoord[1];\n y = tileCoord[2];\n } else {\n tileCoordExtent = this.getTileCoordExtent(tileCoord, tempExtent);\n }\n while (z >= this.minZoom) {\n if (this.zoomFactor_ === 2) {\n x = Math.floor(x / 2);\n y = Math.floor(y / 2);\n tileRange = createOrUpdateTileRange(x, x, y, y, tempTileRange);\n } else {\n tileRange = this.getTileRangeForExtentAndZ(\n tileCoordExtent,\n z,\n tempTileRange\n );\n }\n if (callback(z, tileRange)) {\n return true;\n }\n --z;\n }\n return false;\n }\n\n /**\n * Get the extent for this tile grid, if it was configured.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getExtent() {\n return this.extent_;\n }\n\n /**\n * Get the maximum zoom level for the grid.\n * @return {number} Max zoom.\n * @api\n */\n getMaxZoom() {\n return this.maxZoom;\n }\n\n /**\n * Get the minimum zoom level for the grid.\n * @return {number} Min zoom.\n * @api\n */\n getMinZoom() {\n return this.minZoom;\n }\n\n /**\n * Get the origin for the grid at the given zoom level.\n * @param {number} z Integer zoom level.\n * @return {import(\"../coordinate.js\").Coordinate} Origin.\n * @api\n */\n getOrigin(z) {\n if (this.origin_) {\n return this.origin_;\n }\n return this.origins_[z];\n }\n\n /**\n * Get the resolution for the given zoom level.\n * @param {number} z Integer zoom level.\n * @return {number} Resolution.\n * @api\n */\n getResolution(z) {\n return this.resolutions_[z];\n }\n\n /**\n * Get the list of resolutions for the tile grid.\n * @return {Array} Resolutions.\n * @api\n */\n getResolutions() {\n return this.resolutions_;\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary import(\"../extent.js\").Extent object.\n * @return {import(\"../TileRange.js\").default|null} Tile range.\n */\n getTileCoordChildTileRange(tileCoord, tempTileRange, tempExtent) {\n if (tileCoord[0] < this.maxZoom) {\n if (this.zoomFactor_ === 2) {\n const minX = tileCoord[1] * 2;\n const minY = tileCoord[2] * 2;\n return createOrUpdateTileRange(\n minX,\n minX + 1,\n minY,\n minY + 1,\n tempTileRange\n );\n }\n const tileCoordExtent = this.getTileCoordExtent(\n tileCoord,\n tempExtent || this.tmpExtent_\n );\n return this.getTileRangeForExtentAndZ(\n tileCoordExtent,\n tileCoord[0] + 1,\n tempTileRange\n );\n }\n return null;\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {number} z Integer zoom level.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary import(\"../TileRange.js\").default object.\n * @return {import(\"../TileRange.js\").default|null} Tile range.\n */\n getTileRangeForTileCoordAndZ(tileCoord, z, tempTileRange) {\n if (z > this.maxZoom || z < this.minZoom) {\n return null;\n }\n\n const tileCoordZ = tileCoord[0];\n const tileCoordX = tileCoord[1];\n const tileCoordY = tileCoord[2];\n\n if (z === tileCoordZ) {\n return createOrUpdateTileRange(\n tileCoordX,\n tileCoordY,\n tileCoordX,\n tileCoordY,\n tempTileRange\n );\n }\n\n if (this.zoomFactor_) {\n const factor = Math.pow(this.zoomFactor_, z - tileCoordZ);\n const minX = Math.floor(tileCoordX * factor);\n const minY = Math.floor(tileCoordY * factor);\n if (z < tileCoordZ) {\n return createOrUpdateTileRange(minX, minX, minY, minY, tempTileRange);\n }\n\n const maxX = Math.floor(factor * (tileCoordX + 1)) - 1;\n const maxY = Math.floor(factor * (tileCoordY + 1)) - 1;\n return createOrUpdateTileRange(minX, maxX, minY, maxY, tempTileRange);\n }\n\n const tileCoordExtent = this.getTileCoordExtent(tileCoord, this.tmpExtent_);\n return this.getTileRangeForExtentAndZ(tileCoordExtent, z, tempTileRange);\n }\n\n /**\n * Get a tile range for the given extent and integer zoom level.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @param {number} z Integer zoom level.\n * @param {import(\"../TileRange.js\").default} [tempTileRange] Temporary tile range object.\n * @return {import(\"../TileRange.js\").default} Tile range.\n */\n getTileRangeForExtentAndZ(extent, z, tempTileRange) {\n this.getTileCoordForXYAndZ_(extent[0], extent[3], z, false, tmpTileCoord);\n const minX = tmpTileCoord[1];\n const minY = tmpTileCoord[2];\n this.getTileCoordForXYAndZ_(extent[2], extent[1], z, true, tmpTileCoord);\n const maxX = tmpTileCoord[1];\n const maxY = tmpTileCoord[2];\n return createOrUpdateTileRange(minX, maxX, minY, maxY, tempTileRange);\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {import(\"../coordinate.js\").Coordinate} Tile center.\n */\n getTileCoordCenter(tileCoord) {\n const origin = this.getOrigin(tileCoord[0]);\n const resolution = this.getResolution(tileCoord[0]);\n const tileSize = toSize(this.getTileSize(tileCoord[0]), this.tmpSize_);\n return [\n origin[0] + (tileCoord[1] + 0.5) * tileSize[0] * resolution,\n origin[1] - (tileCoord[2] + 0.5) * tileSize[1] * resolution,\n ];\n }\n\n /**\n * Get the extent of a tile coordinate.\n *\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @param {import(\"../extent.js\").Extent} [tempExtent] Temporary extent object.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getTileCoordExtent(tileCoord, tempExtent) {\n const origin = this.getOrigin(tileCoord[0]);\n const resolution = this.getResolution(tileCoord[0]);\n const tileSize = toSize(this.getTileSize(tileCoord[0]), this.tmpSize_);\n const minX = origin[0] + tileCoord[1] * tileSize[0] * resolution;\n const minY = origin[1] - (tileCoord[2] + 1) * tileSize[1] * resolution;\n const maxX = minX + tileSize[0] * resolution;\n const maxY = minY + tileSize[1] * resolution;\n return createOrUpdate(minX, minY, maxX, maxY, tempExtent);\n }\n\n /**\n * Get the tile coordinate for the given map coordinate and resolution. This\n * method considers that coordinates that intersect tile boundaries should be\n * assigned the higher tile coordinate.\n *\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} resolution Resolution.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Destination import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @api\n */\n getTileCoordForCoordAndResolution(coordinate, resolution, opt_tileCoord) {\n return this.getTileCoordForXYAndResolution_(\n coordinate[0],\n coordinate[1],\n resolution,\n false,\n opt_tileCoord\n );\n }\n\n /**\n * Note that this method should not be called for resolutions that correspond\n * to an integer zoom level. Instead call the `getTileCoordForXYAndZ_` method.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {number} resolution Resolution (for a non-integer zoom level).\n * @param {boolean} reverseIntersectionPolicy Instead of letting edge\n * intersections go to the higher tile coordinate, let edge intersections\n * go to the lower tile coordinate.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Temporary import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @private\n */\n getTileCoordForXYAndResolution_(\n x,\n y,\n resolution,\n reverseIntersectionPolicy,\n opt_tileCoord\n ) {\n const z = this.getZForResolution(resolution);\n const scale = resolution / this.getResolution(z);\n const origin = this.getOrigin(z);\n const tileSize = toSize(this.getTileSize(z), this.tmpSize_);\n\n let tileCoordX = (scale * (x - origin[0])) / resolution / tileSize[0];\n let tileCoordY = (scale * (origin[1] - y)) / resolution / tileSize[1];\n\n if (reverseIntersectionPolicy) {\n tileCoordX = ceil(tileCoordX, DECIMALS) - 1;\n tileCoordY = ceil(tileCoordY, DECIMALS) - 1;\n } else {\n tileCoordX = floor(tileCoordX, DECIMALS);\n tileCoordY = floor(tileCoordY, DECIMALS);\n }\n\n return createOrUpdateTileCoord(z, tileCoordX, tileCoordY, opt_tileCoord);\n }\n\n /**\n * Although there is repetition between this method and `getTileCoordForXYAndResolution_`,\n * they should have separate implementations. This method is for integer zoom\n * levels. The other method should only be called for resolutions corresponding\n * to non-integer zoom levels.\n * @param {number} x Map x coordinate.\n * @param {number} y Map y coordinate.\n * @param {number} z Integer zoom level.\n * @param {boolean} reverseIntersectionPolicy Instead of letting edge\n * intersections go to the higher tile coordinate, let edge intersections\n * go to the lower tile coordinate.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Temporary import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @private\n */\n getTileCoordForXYAndZ_(x, y, z, reverseIntersectionPolicy, opt_tileCoord) {\n const origin = this.getOrigin(z);\n const resolution = this.getResolution(z);\n const tileSize = toSize(this.getTileSize(z), this.tmpSize_);\n\n let tileCoordX = (x - origin[0]) / resolution / tileSize[0];\n let tileCoordY = (origin[1] - y) / resolution / tileSize[1];\n\n if (reverseIntersectionPolicy) {\n tileCoordX = ceil(tileCoordX, DECIMALS) - 1;\n tileCoordY = ceil(tileCoordY, DECIMALS) - 1;\n } else {\n tileCoordX = floor(tileCoordX, DECIMALS);\n tileCoordY = floor(tileCoordY, DECIMALS);\n }\n\n return createOrUpdateTileCoord(z, tileCoordX, tileCoordY, opt_tileCoord);\n }\n\n /**\n * Get a tile coordinate given a map coordinate and zoom level.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} z Zoom level.\n * @param {import(\"../tilecoord.js\").TileCoord} [opt_tileCoord] Destination import(\"../tilecoord.js\").TileCoord object.\n * @return {import(\"../tilecoord.js\").TileCoord} Tile coordinate.\n * @api\n */\n getTileCoordForCoordAndZ(coordinate, z, opt_tileCoord) {\n return this.getTileCoordForXYAndZ_(\n coordinate[0],\n coordinate[1],\n z,\n false,\n opt_tileCoord\n );\n }\n\n /**\n * @param {import(\"../tilecoord.js\").TileCoord} tileCoord Tile coordinate.\n * @return {number} Tile resolution.\n */\n getTileCoordResolution(tileCoord) {\n return this.resolutions_[tileCoord[0]];\n }\n\n /**\n * Get the tile size for a zoom level. The type of the return value matches the\n * `tileSize` or `tileSizes` that the tile grid was configured with. To always\n * get an {@link import(\"../size.js\").Size}, run the result through {@link module:ol/size.toSize}.\n * @param {number} z Z.\n * @return {number|import(\"../size.js\").Size} Tile size.\n * @api\n */\n getTileSize(z) {\n if (this.tileSize_) {\n return this.tileSize_;\n }\n return this.tileSizes_[z];\n }\n\n /**\n * @param {number} z Zoom level.\n * @return {import(\"../TileRange.js\").default} Extent tile range for the specified zoom level.\n */\n getFullTileRange(z) {\n if (!this.fullTileRanges_) {\n return this.extent_\n ? this.getTileRangeForExtentAndZ(this.extent_, z)\n : null;\n }\n return this.fullTileRanges_[z];\n }\n\n /**\n * @param {number} resolution Resolution.\n * @param {number|import(\"../array.js\").NearestDirectionFunction} [opt_direction]\n * If 0, the nearest resolution will be used.\n * If 1, the nearest higher resolution (lower Z) will be used. If -1, the\n * nearest lower resolution (higher Z) will be used. Default is 0.\n * Use a {@link module:ol/array~NearestDirectionFunction} for more precise control.\n *\n * For example to change tile Z at the midpoint of zoom levels\n * ```js\n * function(value, high, low) {\n * return value - low * Math.sqrt(high / low);\n * }\n * ```\n * @return {number} Z.\n * @api\n */\n getZForResolution(resolution, opt_direction) {\n const z = linearFindNearest(\n this.resolutions_,\n resolution,\n opt_direction || 0\n );\n return clamp(z, this.minZoom, this.maxZoom);\n }\n\n /**\n * The tile with the provided tile coordinate intersects the given viewport.\n * @param {import('../tilecoord.js').TileCoord} tileCoord Tile coordinate.\n * @param {Array} viewport Viewport as returned from {@link module:ol/extent.getRotatedViewport}.\n * @return {boolean} The tile with the provided tile coordinate intersects the given viewport.\n */\n tileCoordIntersectsViewport(tileCoord, viewport) {\n return intersectsLinearRing(\n viewport,\n 0,\n viewport.length,\n 2,\n this.getTileCoordExtent(tileCoord)\n );\n }\n\n /**\n * @param {!import(\"../extent.js\").Extent} extent Extent for this tile grid.\n * @private\n */\n calculateTileRanges_(extent) {\n const length = this.resolutions_.length;\n const fullTileRanges = new Array(length);\n for (let z = this.minZoom; z < length; ++z) {\n fullTileRanges[z] = this.getTileRangeForExtentAndZ(extent, z);\n }\n this.fullTileRanges_ = fullTileRanges;\n }\n}\n\nexport default TileGrid;\n", "/**\n * @module ol/tilegrid/WMTS\n */\n\nimport TileGrid from './TileGrid.js';\nimport {get as getProjection} from '../proj.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../extent.js\").Extent} [extent] Extent for the tile grid. No tiles\n * outside this extent will be requested by {@link module:ol/source/Tile~TileSource} sources.\n * When no `origin` or `origins` are configured, the `origin` will be set to the\n * top-left corner of the extent.\n * @property {import(\"../coordinate.js\").Coordinate} [origin] The tile grid origin, i.e.\n * where the `x` and `y` axes meet (`[z, 0, 0]`). Tile coordinates increase left\n * to right and downwards. If not specified, `extent` or `origins` must be provided.\n * @property {Array} [origins] Tile grid origins,\n * i.e. where the `x` and `y` axes meet (`[z, 0, 0]`), for each zoom level. If\n * given, the array length should match the length of the `resolutions` array, i.e.\n * each resolution can have a different origin. Tile coordinates increase left to\n * right and downwards. If not specified, `extent` or `origin` must be provided.\n * @property {!Array} resolutions Resolutions. The array index of each\n * resolution needs to match the zoom level. This means that even if a `minZoom`\n * is configured, the resolutions array will have a length of `maxZoom + 1`\n * @property {!Array} matrixIds matrix IDs. The length of this array needs\n * to match the length of the `resolutions` array.\n * @property {Array} [sizes] Number of tile rows and columns\n * of the grid for each zoom level. The values here are the `TileMatrixWidth` and\n * `TileMatrixHeight` advertised in the GetCapabilities response of the WMTS, and\n * define each zoom level's extent together with the `origin` or `origins`.\n * A grid `extent` can be configured in addition, and will further limit the extent for\n * which tile requests are made by sources. If the bottom-left corner of\n * an extent is used as `origin` or `origins`, then the `y` value must be\n * negative because OpenLayers tile coordinates use the top left as the origin.\n * @property {number|import(\"../size.js\").Size} [tileSize] Tile size.\n * @property {Array} [tileSizes] Tile sizes. The length of\n * this array needs to match the length of the `resolutions` array.\n */\n\n/**\n * @classdesc\n * Set the grid pattern for sources accessing WMTS tiled-image servers.\n * @api\n */\nclass WMTSTileGrid extends TileGrid {\n /**\n * @param {Options} options WMTS options.\n */\n constructor(options) {\n super({\n extent: options.extent,\n origin: options.origin,\n origins: options.origins,\n resolutions: options.resolutions,\n tileSize: options.tileSize,\n tileSizes: options.tileSizes,\n sizes: options.sizes,\n });\n\n /**\n * @private\n * @type {!Array}\n */\n this.matrixIds_ = options.matrixIds;\n }\n\n /**\n * @param {number} z Z.\n * @return {string} MatrixId..\n */\n getMatrixId(z) {\n return this.matrixIds_[z];\n }\n\n /**\n * Get the list of matrix identifiers.\n * @return {Array} MatrixIds.\n * @api\n */\n getMatrixIds() {\n return this.matrixIds_;\n }\n}\n\nexport default WMTSTileGrid;\n\n/**\n * Create a tile grid from a WMTS capabilities matrix set and an\n * optional TileMatrixSetLimits.\n * @param {Object} matrixSet An object representing a matrixSet in the\n * capabilities document.\n * @param {import(\"../extent.js\").Extent} [extent] An optional extent to restrict the tile\n * ranges the server provides.\n * @param {Array} [matrixLimits] An optional object representing\n * the available matrices for tileGrid.\n * @return {WMTSTileGrid} WMTS tileGrid instance.\n * @api\n */\nexport function createFromCapabilitiesMatrixSet(\n matrixSet,\n extent,\n matrixLimits\n) {\n /** @type {!Array} */\n const resolutions = [];\n /** @type {!Array} */\n const matrixIds = [];\n /** @type {!Array} */\n const origins = [];\n /** @type {!Array} */\n const tileSizes = [];\n /** @type {!Array} */\n const sizes = [];\n\n matrixLimits = matrixLimits !== undefined ? matrixLimits : [];\n\n const supportedCRSPropName = 'SupportedCRS';\n const matrixIdsPropName = 'TileMatrix';\n const identifierPropName = 'Identifier';\n const scaleDenominatorPropName = 'ScaleDenominator';\n const topLeftCornerPropName = 'TopLeftCorner';\n const tileWidthPropName = 'TileWidth';\n const tileHeightPropName = 'TileHeight';\n\n const code = matrixSet[supportedCRSPropName];\n const projection = getProjection(code);\n const metersPerUnit = projection.getMetersPerUnit();\n // swap origin x and y coordinates if axis orientation is lat/long\n const switchOriginXY = projection.getAxisOrientation().substr(0, 2) == 'ne';\n\n matrixSet[matrixIdsPropName].sort(function (a, b) {\n return b[scaleDenominatorPropName] - a[scaleDenominatorPropName];\n });\n\n matrixSet[matrixIdsPropName].forEach(function (elt) {\n let matrixAvailable;\n // use of matrixLimits to filter TileMatrices from GetCapabilities\n // TileMatrixSet from unavailable matrix levels.\n if (matrixLimits.length > 0) {\n matrixAvailable = matrixLimits.find(function (elt_ml) {\n if (elt[identifierPropName] == elt_ml[matrixIdsPropName]) {\n return true;\n }\n // Fallback for tileMatrix identifiers that don't get prefixed\n // by their tileMatrixSet identifiers.\n if (!elt[identifierPropName].includes(':')) {\n return (\n matrixSet[identifierPropName] + ':' + elt[identifierPropName] ===\n elt_ml[matrixIdsPropName]\n );\n }\n return false;\n });\n } else {\n matrixAvailable = true;\n }\n\n if (matrixAvailable) {\n matrixIds.push(elt[identifierPropName]);\n const resolution =\n (elt[scaleDenominatorPropName] * 0.28e-3) / metersPerUnit;\n const tileWidth = elt[tileWidthPropName];\n const tileHeight = elt[tileHeightPropName];\n if (switchOriginXY) {\n origins.push([\n elt[topLeftCornerPropName][1],\n elt[topLeftCornerPropName][0],\n ]);\n } else {\n origins.push(elt[topLeftCornerPropName]);\n }\n resolutions.push(resolution);\n tileSizes.push(\n tileWidth == tileHeight ? tileWidth : [tileWidth, tileHeight]\n );\n sizes.push([elt['MatrixWidth'], elt['MatrixHeight']]);\n }\n });\n\n return new WMTSTileGrid({\n extent: extent,\n origins: origins,\n resolutions: resolutions,\n matrixIds: matrixIds,\n tileSizes: tileSizes,\n sizes: sizes,\n });\n}\n", "import OlMap from 'ol/Map'\nimport View from 'ol/View'\nimport Group from 'ol/layer/Group'\nimport WMTSTileGrid from 'ol/tilegrid/WMTS'\nimport proj4 from 'proj4/dist/proj4'\nimport { register } from 'ol/proj/proj4'\nimport { get as getProjection } from 'ol/proj'\nimport { createEmpty, extend } from 'ol/extent'\nimport { defaults as defaultControls, ScaleLine, ZoomSlider, Attribution, FullScreen } from 'ol/control'\nimport { defaults as defaultInteractions } from 'ol/interaction/defaults'\nimport MyLocation from './control/MyLocation'\nimport LayerSwitcher from './control/LayerSwitcher'\nimport CreateMarkers from './control/markers/CreateMarkers'\nimport { createLayer } from './CreateLayer'\nimport { fromLonLat } from 'ol/proj'\nimport CreateMarkerTooltip from './control/markers/CreateMarkerTooltip'\nimport { Center, Extent, Resolutions, MatrixIds } from './constants'\nimport VectorLayer from 'ol/layer/Vector'\n\nimport 'ol/ol.css'\nimport './Map.styl'\nimport './ZoomSlider.styl'\nimport './ScaleLine.styl'\nimport './FullScreen.styl'\nimport { none } from 'ol/centerconstraint'\n\nexport default class Map {\n\n markers = []\n icons = {}\n markerLayerGroup\n markerLayers\n popup\n showPopup\n\n set markers(markers) {\n this.setMarkers(markers)\n }\n\n constructor(opt) {\n\n this.icons = opt.icons || {}\n\n const background = opt.background || ''\n const zoomSlider = typeof opt.zoomSlider === 'undefined' ? true : opt.zoomSlider\n const scaleLine = typeof opt.scaleLine === 'undefined' ? true : opt.scaleLine\n const layerSwitcher = opt.layerSwitcher || false\n const myLocation = typeof opt.myLocation === 'undefined' ? true : opt.myLocation\n const view = opt.view\n const autoCenter = view && view.center === 'auto'\n const center = (view && typeof view.center !== 'string') ?\n (view.center || Center) : Center\n const autoZoom = view && view.zoom === 'auto'\n const mouseWheelZoom = typeof opt.mouseWheelZoom === 'undefined' ? true : opt.mouseWheelZoom\n const overrideExtent = opt.extent || false\n\n this.zoom = view ? view.zoom || 2 : 2\n const fullScreen = typeof opt.fullScreen === 'undefined' ? true : opt.fullScreen\n\n this.popup = opt.popup || null\n this.showPopup = typeof opt.showPopup === 'undefined' ? true : opt.showPopup\n\n this._target = opt.target || 'map'\n this._source = opt.source || 'kf'\n this._token = opt.token || ''\n this._username = opt.username || ''\n this._password = opt.password || ''\n this.autocenter = autoCenter\n this.autoZoom = autoZoom\n\n proj4.defs('EPSG:25832', '+proj=utm +zone=32 +ellps=GRS80 +units=m +no_defs')\n register(proj4)\n const projection = getProjection('EPSG:25832')\n\n projection.setExtent(Extent)\n\n const kfTileGrid = new WMTSTileGrid({\n extent: Extent,\n resolutions: Resolutions,\n matrixIds: MatrixIds\n })\n const kfTileGrid2 = new WMTSTileGrid({\n extent: Extent,\n resolutions: Resolutions,\n matrixIds: ['L00', 'L01', 'L02', 'L03', 'L04', 'L05', 'L06', 'L07', 'L08', 'L09', 'L10', 'L11', 'L12', 'L13']\n })\n const dfTileGrid = new WMTSTileGrid({\n extent: Extent,\n resolutions: Resolutions,\n matrixIds: ['00', '01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12', '13']\n })\n const kfAuth = {\n source: 'kf',\n token: this._token\n }\n const dfAuth = {\n source: 'df',\n username: this._username,\n password: this._password\n }\n const layers = []\n\n if (this._username && this._password) { // Datafordeleren bruger\n layers.push(createLayer({\n name: 'dtk_skaermkort',\n type: 'WMTS',\n title: 'Sk\u00E6rmkort',\n visible: background === 'dtk_skaermkort',\n service: 'DKskaermkort/topo_skaermkort_wmts/1.0.0/Wmts',\n layer: 'topo_skaermkort',\n matrixSet: 'View1',\n format: 'image/jpeg',\n tileGrid: dfTileGrid,\n auth: dfAuth\n }))\n layers.push(createLayer({\n name: 'dtk_skaermkort_daempet',\n type: 'WMTS',\n title: 'Sk\u00E6rmkort d\u00E6mpet',\n visible: background !== 'orto_foraar' && background !== 'forvaltning' &&\n background !== 'dtk_skaermkort',\n service: 'DKskaermkort/topo_skaermkort_daempet/1.0.0/Wmts',\n layer: 'topo_skaermkort_daempet',\n matrixSet: 'View1',\n format: 'image/jpeg',\n tileGrid: dfTileGrid,\n auth: dfAuth\n }))\n layers.push(createLayer({\n name: 'orto_foraar',\n type: 'WMTS',\n title: 'Ortofoto',\n color: 'white',\n visible: background === 'orto_foraar',\n service: 'GeoDanmarkOrto/orto_foraar_wmts/1.0.0/Wmts',\n layer: 'orto_foraar_wmts',\n matrixSet: 'KortforsyningTilingDK',\n format: 'image/jpeg',\n tileGrid: dfTileGrid,\n auth: dfAuth\n }))\n } else if (this._token) { // Dataforsyningen bruger\n layers.push(createLayer({\n name: 'dtk_skaermkort',\n type: 'WMTS',\n title: 'Sk\u00E6rmkort',\n visible: background === 'dtk_skaermkort',\n service: 'topo_skaermkort_wmts_DAF',\n layer: 'topo_skaermkort',\n matrixSet: 'View1',\n format: 'image/jpeg',\n tileGrid: kfTileGrid,\n auth: kfAuth\n }))\n layers.push(createLayer({\n name: 'dtk_skaermkort_daempet',\n type: 'WMTS',\n title: 'Sk\u00E6rmkort d\u00E6mpet',\n visible: background !== 'orto_foraar' && background !== 'forvaltning' &&\n background !== 'dtk_skaermkort',\n service: 'topo_skaermkort_daempet_DAF',\n layer: 'topo_skaermkort_daempet',\n matrixSet: 'View1',\n format: 'image/jpeg',\n tileGrid: kfTileGrid,\n auth: kfAuth\n }))\n layers.push(createLayer({\n name: 'orto_foraar',\n type: 'WMTS',\n title: 'Ortofoto',\n color: 'white',\n visible: background === 'orto_foraar',\n service: 'orto_foraar_wmts_DAF',\n layer: 'orto_foraar_wmts',\n matrixSet: 'KortforsyningTilingDK',\n format: 'image/jpeg',\n tileGrid: kfTileGrid,\n auth: kfAuth\n }))\n }\n if (this._token) { // Dataforsyningen bruger\n layers.push(createLayer({\n name: 'forvaltning',\n type: 'WMS',\n title: 'Basiskort',\n visible: background === 'forvaltning',\n service: 'forvaltning2',\n layer: 'basis_kort',\n format: 'image/png',\n auth: kfAuth\n }))\n layers.push(createLayer({\n name: 'kommunikation',\n type: 'WMS',\n title: 'Kommunikation',\n visible: background === 'kommunikation',\n service: 'kommunikation',\n layer: 'Kommunikationskort',\n format: 'image/png',\n auth: kfAuth\n }))\n layers.push(createLayer({\n name: 'natur_friluftskort',\n type: 'WMTS',\n title: 'Natur og Friluftskort',\n visible: background === 'natur_friluftskort',\n service: 'natur_friluftskort',\n layer: 'nfkort',\n matrixSet: 'View1',\n format: 'image/jpeg',\n tileGrid: kfTileGrid2,\n auth: kfAuth\n }))\n }\n\n const overlays = []\n\n if (opt.overlays) {\n opt.overlays.forEach(function (e) {\n if (e.source === 'kf') {\n e.auth = kfAuth\n e.tileGrid = kfTileGrid\n } else if (e.source === 'df') {\n e.auth = dfAuth\n e.tileGrid = dfTileGrid\n }\n overlays.push(createLayer(e))\n })\n }\n\n this._map = new OlMap({\n target: this._target,\n layers: [\n new Group({\n 'title': 'Base maps', // This title of the group is shown in the layer switcher\n layers: layers\n }),\n new Group({\n 'title': 'Kort',\n layers: overlays\n }),\n new Group({\n 'title': 'Hidden',\n layers: []\n })\n ],\n controls: defaultControls({ attribution: false, zoom: zoomSlider }),\n interactions: defaultInteractions({ mouseWheelZoom: mouseWheelZoom }),\n view: new View({\n center: fromLonLat(center, 'EPSG:25832'),\n zoom: this.zoom,\n resolutions: kfTileGrid.getResolutions(),\n projection: projection,\n extent: overrideExtent ? overrideExtent : Extent\n })\n })\n this._map.addControl(new Attribution({ collapsible: false }))\n scaleLine && this._map.addControl(new ScaleLine())\n zoomSlider && this._map.addControl(new ZoomSlider())\n fullScreen && this._map.addControl(new FullScreen())\n myLocation && this._map.addControl(new MyLocation({ zoomSlider: zoomSlider }))\n this._layerSwitcher = new LayerSwitcher({ visible: layerSwitcher })\n this._map.addControl(this._layerSwitcher)\n\n this.setMarkers(opt.markers)\n\n this._map.on('click', function (evt) {\n const focus = document.activeElement\n\n focus.blur()\n })\n\n if (zoomSlider) {\n this.adjustControlsCss()\n }\n\n this._map.on('change:size', () => {\n this.adjustControlsCss()\n })\n }\n\n async setMarkers(markers) {\n\n if (!markers) {\n return\n }\n\n this.markerLayers = await CreateMarkers(markers, this.icons, this)\n this._map.removeLayer(this.markerLayerGroup)\n this.markerLayerGroup = new Group({layers: this.markerLayers})\n this._map.addLayer(this.markerLayerGroup)\n this.autoCenter()\n\n this.showPopup && CreateMarkerTooltip(this, this.popup)\n }\n\n addVectorLayer(vector, styles, name) {\n this._map.addLayer(new VectorLayer({\n name: name,\n visible: false,\n source: vector,\n style: styles\n }))\n }\n\n getVectorLayer(name) {\n return this._map.getLayers().getArray().find(function (e) {\n return e.get('name') === 'name'\n })\n }\n\n autoCenter() {\n if (!this.autocenter || !this.markerLayers[0]) {\n return\n }\n const extent = createEmpty()\n\n this.markerLayers.forEach(function (layer) {\n extend(extent, layer.getSource().getExtent())\n })\n if (extent[0] === Infinity) {\n return\n }\n this._map.getView().fit(extent)\n this._map.getView().setZoom(Math.floor(this._map.getView().getZoom()))\n if (!this.autoZoom) {\n this._map.getView().setZoom(this.zoom)\n }\n this._map.updateSize()\n }\n\n toggleBackground(background) {\n this._layerSwitcher.toggleBackground(background)\n }\n\n toggleLayer(layer, value) {\n const layers = this._map.getLayers().getArray()\n const vectorLayer = layers.find(function (e) {\n return e.get('name') === layer\n })\n\n if (vectorLayer) {\n vectorLayer.setVisible(value)\n return\n }\n const overlays = layers.find(function (e) {\n return e.get('title') === 'Kort'\n })\n\n overlays.get('layers').getArray().forEach(function (e, idx, a) {\n if (e.get('name') === layer) {\n e.setVisible(value)\n }\n })\n }\n\n adjustControlsCss() {\n const findElementBelongingToThisMap = (collection) => {\n const array = Array.from(collection)\n return array.find((el) => {\n return !!el.closest('#' + this.target)\n })\n }\n const slider = findElementBelongingToThisMap(document.getElementsByClassName('ol-zoomslider'))\n const button = findElementBelongingToThisMap(document.getElementsByClassName('ol-zoom-out'))\n const myLoc = findElementBelongingToThisMap(document.getElementsByClassName('ol-my-location'))\n const mapHeight = document.getElementById(this.target).offsetHeight\n\n if (mapHeight < 300) {\n if (slider) {\n slider.style.display = none\n }\n if (myLoc) {\n myLoc.style.bottom = '97px'\n }\n } else {\n if (button) {\n const m = Math.floor(mapHeight * 0.25) + 6 + 'px' // 25% + 6px\n button.style.marginTop = m\n }\n }\n }\n\n // calls the given function with the feature as parameter\n addOnFeatureClickFunction(callback) {\n const map = this._map\n map.on('singleclick', function (evt) {\n const feature = map.forEachFeatureAtPixel(evt.pixel,\n function (feature) {\n return feature\n })\n callback(feature)\n })\n }\n\n get olMap() {\n return this._map\n }\n\n get target() {\n return this._target\n }\n}\n", "/**\n * @module ol/proj/proj4\n */\nimport Projection from './Projection.js';\nimport {\n addCoordinateTransforms,\n addEquivalentProjections,\n addProjection,\n createSafeCoordinateTransform,\n get,\n} from '../proj.js';\nimport {get as getTransform} from './transforms.js';\n\n/**\n * @type {import(\"proj4\")|null}\n */\nlet registered = null;\n\n/**\n * @return {boolean} Proj4 has been registered.\n */\nexport function isRegistered() {\n return !!registered;\n}\n\n/**\n * Unsets the shared proj4 previously set with register.\n */\nexport function unregister() {\n registered = null;\n}\n\n/**\n * Make projections defined in proj4 (with `proj4.defs()`) available in\n * OpenLayers. Requires proj4 >= 2.8.0.\n *\n * This function should be called whenever changes are made to the proj4\n * registry, e.g. after calling `proj4.defs()`. Existing transforms will not be\n * modified by this function.\n *\n * @param {import(\"proj4\")} proj4 Proj4.\n * @api\n */\nexport function register(proj4) {\n registered = proj4;\n\n const projCodes = Object.keys(proj4.defs);\n const len = projCodes.length;\n let i, j;\n for (i = 0; i < len; ++i) {\n const code = projCodes[i];\n if (!get(code)) {\n const def = proj4.defs(code);\n let units = /** @type {import(\"./Units.js\").Units} */ (def.units);\n if (!units && def.projName === 'longlat') {\n units = 'degrees';\n }\n addProjection(\n new Projection({\n code: code,\n axisOrientation: def.axis,\n metersPerUnit: def.to_meter,\n units,\n })\n );\n }\n }\n for (i = 0; i < len; ++i) {\n const code1 = projCodes[i];\n const proj1 = get(code1);\n for (j = 0; j < len; ++j) {\n const code2 = projCodes[j];\n const proj2 = get(code2);\n if (!getTransform(code1, code2)) {\n if (proj4.defs[code1] === proj4.defs[code2]) {\n addEquivalentProjections([proj1, proj2]);\n } else {\n const transform = proj4(code1, code2);\n addCoordinateTransforms(\n proj1,\n proj2,\n createSafeCoordinateTransform(proj1, proj2, transform.forward),\n createSafeCoordinateTransform(proj2, proj1, transform.inverse)\n );\n }\n }\n }\n }\n}\n\n/**\n * @param {number} code The EPSG code.\n * @return {Promise} The proj4 definition.\n */\nlet epsgLookup = async function (code) {\n const response = await fetch(`https://epsg.io/${code}.proj4`);\n if (!response.ok) {\n throw new Error(`Unexpected response from epsg.io: ${response.status}`);\n }\n return response.text();\n};\n\n/**\n * Set the lookup function for getting proj4 definitions given an EPSG code.\n * By default, the {@link module:ol/proj/proj4.fromEPSGCode} function uses the\n * epsg.io website for proj4 definitions. This can be changed by providing a\n * different lookup function.\n *\n * @param {function(number):Promise} func The lookup function.\n * @api\n */\nexport function setEPSGLookup(func) {\n epsgLookup = func;\n}\n\n/**\n * Get the current EPSG lookup function.\n *\n * @return {function(number):Promise} The EPSG lookup function.\n */\nexport function getEPSGLookup() {\n return epsgLookup;\n}\n\n/**\n * Get a projection from an EPSG code. This function fetches the projection\n * definition from the epsg.io website, registers this definition for use with\n * proj4, and returns a configured projection. You must call import proj4 and\n * call {@link module:ol/proj/proj4.register} before using this function.\n *\n * If the projection definition is already registered with proj4, it will not\n * be fetched again (so it is ok to call this function multiple times with the\n * same code).\n *\n * @param {number|string} code The EPSG code (e.g. 4326 or 'EPSG:4326').\n * @return {Promise} The projection.\n * @api\n */\nexport async function fromEPSGCode(code) {\n if (typeof code === 'string') {\n code = parseInt(code.split(':').pop(), 10);\n }\n\n const proj4 = registered;\n if (!proj4) {\n throw new Error('Proj4 must be registered first with register(proj4)');\n }\n\n const epsgCode = 'EPSG:' + code;\n if (proj4.defs(epsgCode)) {\n return get(epsgCode);\n }\n\n proj4.defs(epsgCode, await epsgLookup(code));\n register(proj4);\n\n return get(epsgCode);\n}\n\n/**\n * Generate an EPSG lookup function which uses the MapTiler Coordinates API to find projection\n * definitions which do not require proj4 to be configured to handle `+nadgrids` parameters.\n * Call {@link module:ol/proj/proj4.setEPSGLookup} use the function for lookups\n * `setEPSGLookup(epsgLookupMapTiler('{YOUR_MAPTILER_API_KEY_HERE}'))`.\n *\n * @param {string} key MapTiler API key. Get your own API key at https://www.maptiler.com/cloud/.\n * @return {function(number):Promise} The EPSG lookup function.\n * @api\n */\nexport function epsgLookupMapTiler(key) {\n return async function (code) {\n const response = await fetch(\n `https://api.maptiler.com/coordinates/search/code:${code}.json?transformations=true&exports=true&key=${key}`\n );\n if (!response.ok) {\n throw new Error(\n `Unexpected response from maptiler.com: ${response.status}`\n );\n }\n return response.json().then((json) => {\n const results = json['results'];\n if (results?.length > 0) {\n const result = results.filter(\n (r) => r['id']?.['authority'] === 'EPSG' && r['id']?.['code'] === code\n )[0];\n if (result) {\n const transforms = result['transformations'];\n if (transforms?.length > 0) {\n // use default transform if it does not require grids\n const defaultTransform = result['default_transformation'];\n if (\n transforms.filter(\n (t) =>\n t['id']?.['authority'] === defaultTransform?.['authority'] &&\n t['id']?.['code'] === defaultTransform?.['code'] &&\n t['grids']?.length === 0\n ).length > 0\n ) {\n return result['exports']?.['proj4'];\n }\n // otherwise use most accurate alternative without grids\n const transform = transforms\n .filter(\n (t) =>\n t['grids']?.length === 0 &&\n t['target_crs']?.['authority'] === 'EPSG' &&\n t['target_crs']?.['code'] === 4326 &&\n t['deprecated'] === false &&\n t['usable'] === true\n )\n .sort((t1, t2) => t1['accuracy'] - t2['accuracy'])[0]?.[\n 'exports'\n ]?.['proj4'];\n if (transform) {\n return transform;\n }\n }\n // fallback to default\n return result['exports']?.['proj4'];\n }\n }\n });\n };\n}\n", "/**\n * @module ol/control/FullScreen\n */\nimport Control from './Control.js';\nimport EventType from '../events/EventType.js';\nimport MapProperty from '../MapProperty.js';\nimport {CLASS_CONTROL, CLASS_UNSELECTABLE, CLASS_UNSUPPORTED} from '../css.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport {replaceNode} from '../dom.js';\n\nconst events = [\n 'fullscreenchange',\n 'webkitfullscreenchange',\n 'MSFullscreenChange',\n];\n\n/**\n * @enum {string}\n */\nconst FullScreenEventType = {\n /**\n * Triggered after the map entered fullscreen.\n * @event FullScreenEventType#enterfullscreen\n * @api\n */\n ENTERFULLSCREEN: 'enterfullscreen',\n\n /**\n * Triggered after the map leave fullscreen.\n * @event FullScreenEventType#leavefullscreen\n * @api\n */\n LEAVEFULLSCREEN: 'leavefullscreen',\n};\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature &\n * import(\"../Observable\").CombinedOnSignature} FullScreenOnSignature\n */\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-full-screen'] CSS class name.\n * @property {string|Text|HTMLElement} [label='\\u2922'] Text label to use for the button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string|Text|HTMLElement} [labelActive='\\u00d7'] Text label to use for the\n * button when full-screen is active.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [activeClassName=className + '-true'] CSS class name for the button\n * when full-screen is active.\n * @property {string} [inactiveClassName=className + '-false'] CSS class name for the button\n * when full-screen is inactive.\n * @property {string} [tipLabel='Toggle full-screen'] Text label to use for the button tip.\n * @property {boolean} [keys=false] Full keyboard access.\n * @property {HTMLElement|string} [target] Specify a target if you want the\n * control to be rendered outside of the map's viewport.\n * @property {HTMLElement|string} [source] The element to be displayed\n * fullscreen. When not provided, the element containing the map viewport will\n * be displayed fullscreen.\n */\n\n/**\n * @classdesc\n * Provides a button that when clicked fills up the full screen with the map.\n * The full screen source element is by default the element containing the map viewport unless\n * overridden by providing the `source` option. In which case, the dom\n * element introduced using this parameter will be displayed in full screen.\n *\n * When in full screen mode, a close button is shown to exit full screen mode.\n * The [Fullscreen API](https://www.w3.org/TR/fullscreen/) is used to\n * toggle the map in full screen mode.\n *\n * @fires FullScreenEventType#enterfullscreen\n * @fires FullScreenEventType#leavefullscreen\n * @api\n */\nclass FullScreen extends Control {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super({\n element: document.createElement('div'),\n target: options.target,\n });\n\n /***\n * @type {FullScreenOnSignature}\n */\n this.on;\n\n /***\n * @type {FullScreenOnSignature}\n */\n this.once;\n\n /***\n * @type {FullScreenOnSignature}\n */\n this.un;\n\n /**\n * @private\n * @type {boolean}\n */\n this.keys_ = options.keys !== undefined ? options.keys : false;\n\n /**\n * @private\n * @type {HTMLElement|string|undefined}\n */\n this.source_ = options.source;\n\n /**\n * @type {boolean}\n * @private\n */\n this.isInFullscreen_ = false;\n\n /**\n * @private\n */\n this.boundHandleMapTargetChange_ = this.handleMapTargetChange_.bind(this);\n\n /**\n * @private\n * @type {string}\n */\n this.cssClassName_ =\n options.className !== undefined ? options.className : 'ol-full-screen';\n\n /**\n * @private\n * @type {Array}\n */\n this.documentListeners_ = [];\n\n /**\n * @private\n * @type {Array}\n */\n this.activeClassName_ =\n options.activeClassName !== undefined\n ? options.activeClassName.split(' ')\n : [this.cssClassName_ + '-true'];\n\n /**\n * @private\n * @type {Array}\n */\n this.inactiveClassName_ =\n options.inactiveClassName !== undefined\n ? options.inactiveClassName.split(' ')\n : [this.cssClassName_ + '-false'];\n\n const label = options.label !== undefined ? options.label : '\\u2922';\n\n /**\n * @private\n * @type {Text|HTMLElement}\n */\n this.labelNode_ =\n typeof label === 'string' ? document.createTextNode(label) : label;\n\n const labelActive =\n options.labelActive !== undefined ? options.labelActive : '\\u00d7';\n\n /**\n * @private\n * @type {Text|HTMLElement}\n */\n this.labelActiveNode_ =\n typeof labelActive === 'string'\n ? document.createTextNode(labelActive)\n : labelActive;\n\n const tipLabel = options.tipLabel ? options.tipLabel : 'Toggle full-screen';\n\n /**\n * @private\n * @type {HTMLElement}\n */\n this.button_ = document.createElement('button');\n this.button_.title = tipLabel;\n this.button_.setAttribute('type', 'button');\n this.button_.appendChild(this.labelNode_);\n this.button_.addEventListener(\n EventType.CLICK,\n this.handleClick_.bind(this),\n false\n );\n this.setClassName_(this.button_, this.isInFullscreen_);\n\n this.element.className = `${this.cssClassName_} ${CLASS_UNSELECTABLE} ${CLASS_CONTROL}`;\n this.element.appendChild(this.button_);\n }\n\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(event) {\n event.preventDefault();\n this.handleFullScreen_();\n }\n\n /**\n * @private\n */\n handleFullScreen_() {\n const map = this.getMap();\n if (!map) {\n return;\n }\n const doc = map.getOwnerDocument();\n if (!isFullScreenSupported(doc)) {\n return;\n }\n if (isFullScreen(doc)) {\n exitFullScreen(doc);\n } else {\n let element;\n if (this.source_) {\n element =\n typeof this.source_ === 'string'\n ? doc.getElementById(this.source_)\n : this.source_;\n } else {\n element = map.getTargetElement();\n }\n if (this.keys_) {\n requestFullScreenWithKeys(element);\n } else {\n requestFullScreen(element);\n }\n }\n }\n\n /**\n * @private\n */\n handleFullScreenChange_() {\n const map = this.getMap();\n if (!map) {\n return;\n }\n const wasInFullscreen = this.isInFullscreen_;\n this.isInFullscreen_ = isFullScreen(map.getOwnerDocument());\n if (wasInFullscreen !== this.isInFullscreen_) {\n this.setClassName_(this.button_, this.isInFullscreen_);\n if (this.isInFullscreen_) {\n replaceNode(this.labelActiveNode_, this.labelNode_);\n this.dispatchEvent(FullScreenEventType.ENTERFULLSCREEN);\n } else {\n replaceNode(this.labelNode_, this.labelActiveNode_);\n this.dispatchEvent(FullScreenEventType.LEAVEFULLSCREEN);\n }\n map.updateSize();\n }\n }\n\n /**\n * @param {HTMLElement} element Target element\n * @param {boolean} fullscreen True if fullscreen class name should be active\n * @private\n */\n setClassName_(element, fullscreen) {\n if (fullscreen) {\n element.classList.remove(...this.inactiveClassName_);\n element.classList.add(...this.activeClassName_);\n } else {\n element.classList.remove(...this.activeClassName_);\n element.classList.add(...this.inactiveClassName_);\n }\n }\n\n /**\n * Remove the control from its current map and attach it to the new map.\n * Pass `null` to just remove the control from the current map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default|null} map Map.\n * @api\n */\n setMap(map) {\n const oldMap = this.getMap();\n if (oldMap) {\n oldMap.removeChangeListener(\n MapProperty.TARGET,\n this.boundHandleMapTargetChange_\n );\n }\n\n super.setMap(map);\n\n this.handleMapTargetChange_();\n if (map) {\n map.addChangeListener(\n MapProperty.TARGET,\n this.boundHandleMapTargetChange_\n );\n }\n }\n\n /**\n * @private\n */\n handleMapTargetChange_() {\n const listeners = this.documentListeners_;\n for (let i = 0, ii = listeners.length; i < ii; ++i) {\n unlistenByKey(listeners[i]);\n }\n listeners.length = 0;\n\n const map = this.getMap();\n if (map) {\n const doc = map.getOwnerDocument();\n if (isFullScreenSupported(doc)) {\n this.element.classList.remove(CLASS_UNSUPPORTED);\n } else {\n this.element.classList.add(CLASS_UNSUPPORTED);\n }\n\n for (let i = 0, ii = events.length; i < ii; ++i) {\n listeners.push(\n listen(doc, events[i], this.handleFullScreenChange_, this)\n );\n }\n this.handleFullScreenChange_();\n }\n }\n}\n\n/**\n * @param {Document} doc The root document to check.\n * @return {boolean} Fullscreen is supported by the current platform.\n */\nfunction isFullScreenSupported(doc) {\n const body = doc.body;\n return !!(\n body['webkitRequestFullscreen'] ||\n (body.requestFullscreen && doc.fullscreenEnabled)\n );\n}\n\n/**\n * @param {Document} doc The root document to check.\n * @return {boolean} Element is currently in fullscreen.\n */\nfunction isFullScreen(doc) {\n return !!(doc['webkitIsFullScreen'] || doc.fullscreenElement);\n}\n\n/**\n * Request to fullscreen an element.\n * @param {HTMLElement} element Element to request fullscreen\n */\nfunction requestFullScreen(element) {\n if (element.requestFullscreen) {\n element.requestFullscreen();\n } else if (element['webkitRequestFullscreen']) {\n element['webkitRequestFullscreen']();\n }\n}\n\n/**\n * Request to fullscreen an element with keyboard input.\n * @param {HTMLElement} element Element to request fullscreen\n */\nfunction requestFullScreenWithKeys(element) {\n if (element['webkitRequestFullscreen']) {\n element['webkitRequestFullscreen']();\n } else {\n requestFullScreen(element);\n }\n}\n\n/**\n * Exit fullscreen.\n * @param {Document} doc The document to exit fullscren from\n */\nfunction exitFullScreen(doc) {\n if (doc.exitFullscreen) {\n doc.exitFullscreen();\n } else if (doc['webkitExitFullscreen']) {\n doc['webkitExitFullscreen']();\n }\n}\n\nexport default FullScreen;\n", "/**\n * @module ol/Overlay\n */\nimport BaseObject from './Object.js';\nimport MapEventType from './MapEventType.js';\nimport {CLASS_SELECTABLE} from './css.js';\nimport {containsExtent} from './extent.js';\nimport {listen, unlistenByKey} from './events.js';\nimport {outerHeight, outerWidth, removeChildren, removeNode} from './dom.js';\n\n/**\n * @typedef {'bottom-left' | 'bottom-center' | 'bottom-right' | 'center-left' | 'center-center' | 'center-right' | 'top-left' | 'top-center' | 'top-right'} Positioning\n * The overlay position: `'bottom-left'`, `'bottom-center'`, `'bottom-right'`,\n * `'center-left'`, `'center-center'`, `'center-right'`, `'top-left'`,\n * `'top-center'`, or `'top-right'`.\n */\n\n/**\n * @typedef {Object} Options\n * @property {number|string} [id] Set the overlay id. The overlay id can be used\n * with the {@link module:ol/Map~Map#getOverlayById} method.\n * @property {HTMLElement} [element] The overlay element.\n * @property {Array} [offset=[0, 0]] Offsets in pixels used when positioning\n * the overlay. The first element in the\n * array is the horizontal offset. A positive value shifts the overlay right.\n * The second element in the array is the vertical offset. A positive value\n * shifts the overlay down.\n * @property {import(\"./coordinate.js\").Coordinate} [position] The overlay position\n * in map projection.\n * @property {Positioning} [positioning='top-left'] Defines how\n * the overlay is actually positioned with respect to its `position` property.\n * Possible values are `'bottom-left'`, `'bottom-center'`, `'bottom-right'`,\n * `'center-left'`, `'center-center'`, `'center-right'`, `'top-left'`,\n * `'top-center'`, and `'top-right'`.\n * @property {boolean} [stopEvent=true] Whether event propagation to the map\n * viewport should be stopped. If `true` the overlay is placed in the same\n * container as that of the controls (CSS class name\n * `ol-overlaycontainer-stopevent`); if `false` it is placed in the container\n * with CSS class name specified by the `className` property.\n * @property {boolean} [insertFirst=true] Whether the overlay is inserted first\n * in the overlay container, or appended. If the overlay is placed in the same\n * container as that of the controls (see the `stopEvent` option) you will\n * probably set `insertFirst` to `true` so the overlay is displayed below the\n * controls.\n * @property {PanIntoViewOptions|boolean} [autoPan=false] Pan the map when calling\n * `setPosition`, so that the overlay is entirely visible in the current viewport.\n * @property {string} [className='ol-overlay-container ol-selectable'] CSS class\n * name.\n */\n\n/**\n * @typedef {Object} PanOptions\n * @property {number} [duration=1000] The duration of the animation in\n * milliseconds.\n * @property {function(number):number} [easing] The easing function to use. Can\n * be one from {@link module:ol/easing} or a custom function.\n * Default is {@link module:ol/easing.inAndOut}.\n */\n\n/**\n * @typedef {Object} PanIntoViewOptions\n * @property {PanOptions} [animation={}] The animation parameters for the pan\n * @property {number} [margin=20] The margin (in pixels) between the\n * overlay and the borders of the map when panning into view.\n */\n\n/**\n * @enum {string}\n * @protected\n */\nconst Property = {\n ELEMENT: 'element',\n MAP: 'map',\n OFFSET: 'offset',\n POSITION: 'position',\n POSITIONING: 'positioning',\n};\n\n/**\n * @typedef {import(\"./ObjectEventType\").Types|'change:element'|'change:map'|'change:offset'|'change:position'|\n * 'change:positioning'} OverlayObjectEventTypes\n */\n\n/***\n * @template Return\n * @typedef {import(\"./Observable\").OnSignature &\n * import(\"./Observable\").OnSignature &\n * import(\"./Observable\").CombinedOnSignature} OverlayOnSignature\n */\n\n/**\n * @classdesc\n * An element to be displayed over the map and attached to a single map\n * location. Like {@link module:ol/control/Control~Control}, Overlays are\n * visible widgets. Unlike Controls, they are not in a fixed position on the\n * screen, but are tied to a geographical coordinate, so panning the map will\n * move an Overlay but not a Control.\n *\n * Example:\n *\n * import Overlay from 'ol/Overlay.js';\n *\n * // ...\n * const popup = new Overlay({\n * element: document.getElementById('popup'),\n * });\n * popup.setPosition(coordinate);\n * map.addOverlay(popup);\n *\n * @api\n */\nclass Overlay extends BaseObject {\n /**\n * @param {Options} options Overlay options.\n */\n constructor(options) {\n super();\n\n /***\n * @type {OverlayOnSignature}\n */\n this.on;\n\n /***\n * @type {OverlayOnSignature}\n */\n this.once;\n\n /***\n * @type {OverlayOnSignature}\n */\n this.un;\n\n /**\n * @protected\n * @type {Options}\n */\n this.options = options;\n\n /**\n * @protected\n * @type {number|string|undefined}\n */\n this.id = options.id;\n\n /**\n * @protected\n * @type {boolean}\n */\n this.insertFirst =\n options.insertFirst !== undefined ? options.insertFirst : true;\n\n /**\n * @protected\n * @type {boolean}\n */\n this.stopEvent = options.stopEvent !== undefined ? options.stopEvent : true;\n\n /**\n * @protected\n * @type {HTMLElement}\n */\n this.element = document.createElement('div');\n this.element.className =\n options.className !== undefined\n ? options.className\n : 'ol-overlay-container ' + CLASS_SELECTABLE;\n this.element.style.position = 'absolute';\n this.element.style.pointerEvents = 'auto';\n\n /**\n * @protected\n * @type {PanIntoViewOptions|undefined}\n */\n this.autoPan = options.autoPan === true ? {} : options.autoPan || undefined;\n\n /**\n * @protected\n * @type {{transform_: string,\n * visible: boolean}}\n */\n this.rendered = {\n transform_: '',\n visible: true,\n };\n\n /**\n * @protected\n * @type {?import(\"./events.js\").EventsKey}\n */\n this.mapPostrenderListenerKey = null;\n\n this.addChangeListener(Property.ELEMENT, this.handleElementChanged);\n this.addChangeListener(Property.MAP, this.handleMapChanged);\n this.addChangeListener(Property.OFFSET, this.handleOffsetChanged);\n this.addChangeListener(Property.POSITION, this.handlePositionChanged);\n this.addChangeListener(Property.POSITIONING, this.handlePositioningChanged);\n\n if (options.element !== undefined) {\n this.setElement(options.element);\n }\n\n this.setOffset(options.offset !== undefined ? options.offset : [0, 0]);\n\n this.setPositioning(options.positioning || 'top-left');\n\n if (options.position !== undefined) {\n this.setPosition(options.position);\n }\n }\n\n /**\n * Get the DOM element of this overlay.\n * @return {HTMLElement|undefined} The Element containing the overlay.\n * @observable\n * @api\n */\n getElement() {\n return /** @type {HTMLElement|undefined} */ (this.get(Property.ELEMENT));\n }\n\n /**\n * Get the overlay identifier which is set on constructor.\n * @return {number|string|undefined} Id.\n * @api\n */\n getId() {\n return this.id;\n }\n\n /**\n * Get the map associated with this overlay.\n * @return {import(\"./Map.js\").default|null} The map that the\n * overlay is part of.\n * @observable\n * @api\n */\n getMap() {\n return /** @type {import(\"./Map.js\").default|null} */ (\n this.get(Property.MAP) || null\n );\n }\n\n /**\n * Get the offset of this overlay.\n * @return {Array} The offset.\n * @observable\n * @api\n */\n getOffset() {\n return /** @type {Array} */ (this.get(Property.OFFSET));\n }\n\n /**\n * Get the current position of this overlay.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} The spatial point that the overlay is\n * anchored at.\n * @observable\n * @api\n */\n getPosition() {\n return /** @type {import(\"./coordinate.js\").Coordinate|undefined} */ (\n this.get(Property.POSITION)\n );\n }\n\n /**\n * Get the current positioning of this overlay.\n * @return {Positioning} How the overlay is positioned\n * relative to its point on the map.\n * @observable\n * @api\n */\n getPositioning() {\n return /** @type {Positioning} */ (this.get(Property.POSITIONING));\n }\n\n /**\n * @protected\n */\n handleElementChanged() {\n removeChildren(this.element);\n const element = this.getElement();\n if (element) {\n this.element.appendChild(element);\n }\n }\n\n /**\n * @protected\n */\n handleMapChanged() {\n if (this.mapPostrenderListenerKey) {\n removeNode(this.element);\n unlistenByKey(this.mapPostrenderListenerKey);\n this.mapPostrenderListenerKey = null;\n }\n const map = this.getMap();\n if (map) {\n this.mapPostrenderListenerKey = listen(\n map,\n MapEventType.POSTRENDER,\n this.render,\n this\n );\n this.updatePixelPosition();\n const container = this.stopEvent\n ? map.getOverlayContainerStopEvent()\n : map.getOverlayContainer();\n if (this.insertFirst) {\n container.insertBefore(this.element, container.childNodes[0] || null);\n } else {\n container.appendChild(this.element);\n }\n this.performAutoPan();\n }\n }\n\n /**\n * @protected\n */\n render() {\n this.updatePixelPosition();\n }\n\n /**\n * @protected\n */\n handleOffsetChanged() {\n this.updatePixelPosition();\n }\n\n /**\n * @protected\n */\n handlePositionChanged() {\n this.updatePixelPosition();\n this.performAutoPan();\n }\n\n /**\n * @protected\n */\n handlePositioningChanged() {\n this.updatePixelPosition();\n }\n\n /**\n * Set the DOM element to be associated with this overlay.\n * @param {HTMLElement|undefined} element The Element containing the overlay.\n * @observable\n * @api\n */\n setElement(element) {\n this.set(Property.ELEMENT, element);\n }\n\n /**\n * Set the map to be associated with this overlay.\n * @param {import(\"./Map.js\").default|null} map The map that the\n * overlay is part of. Pass `null` to just remove the overlay from the current map.\n * @observable\n * @api\n */\n setMap(map) {\n this.set(Property.MAP, map);\n }\n\n /**\n * Set the offset for this overlay.\n * @param {Array} offset Offset.\n * @observable\n * @api\n */\n setOffset(offset) {\n this.set(Property.OFFSET, offset);\n }\n\n /**\n * Set the position for this overlay. If the position is `undefined` the\n * overlay is hidden.\n * @param {import(\"./coordinate.js\").Coordinate|undefined} position The spatial point that the overlay\n * is anchored at.\n * @observable\n * @api\n */\n setPosition(position) {\n this.set(Property.POSITION, position);\n }\n\n /**\n * Pan the map so that the overlay is entirely visible in the current viewport\n * (if necessary) using the configured autoPan parameters\n * @protected\n */\n performAutoPan() {\n if (this.autoPan) {\n this.panIntoView(this.autoPan);\n }\n }\n\n /**\n * Pan the map so that the overlay is entirely visible in the current viewport\n * (if necessary).\n * @param {PanIntoViewOptions} [panIntoViewOptions] Options for the pan action\n * @api\n */\n panIntoView(panIntoViewOptions) {\n const map = this.getMap();\n\n if (!map || !map.getTargetElement() || !this.get(Property.POSITION)) {\n return;\n }\n\n const mapRect = this.getRect(map.getTargetElement(), map.getSize());\n const element = this.getElement();\n const overlayRect = this.getRect(element, [\n outerWidth(element),\n outerHeight(element),\n ]);\n\n panIntoViewOptions = panIntoViewOptions || {};\n\n const myMargin =\n panIntoViewOptions.margin === undefined ? 20 : panIntoViewOptions.margin;\n if (!containsExtent(mapRect, overlayRect)) {\n // the overlay is not completely inside the viewport, so pan the map\n const offsetLeft = overlayRect[0] - mapRect[0];\n const offsetRight = mapRect[2] - overlayRect[2];\n const offsetTop = overlayRect[1] - mapRect[1];\n const offsetBottom = mapRect[3] - overlayRect[3];\n\n const delta = [0, 0];\n if (offsetLeft < 0) {\n // move map to the left\n delta[0] = offsetLeft - myMargin;\n } else if (offsetRight < 0) {\n // move map to the right\n delta[0] = Math.abs(offsetRight) + myMargin;\n }\n if (offsetTop < 0) {\n // move map up\n delta[1] = offsetTop - myMargin;\n } else if (offsetBottom < 0) {\n // move map down\n delta[1] = Math.abs(offsetBottom) + myMargin;\n }\n\n if (delta[0] !== 0 || delta[1] !== 0) {\n const center = /** @type {import(\"./coordinate.js\").Coordinate} */ (\n map.getView().getCenterInternal()\n );\n const centerPx = map.getPixelFromCoordinateInternal(center);\n if (!centerPx) {\n return;\n }\n const newCenterPx = [centerPx[0] + delta[0], centerPx[1] + delta[1]];\n\n const panOptions = panIntoViewOptions.animation || {};\n map.getView().animateInternal({\n center: map.getCoordinateFromPixelInternal(newCenterPx),\n duration: panOptions.duration,\n easing: panOptions.easing,\n });\n }\n }\n }\n\n /**\n * Get the extent of an element relative to the document\n * @param {HTMLElement} element The element.\n * @param {import(\"./size.js\").Size} size The size of the element.\n * @return {import(\"./extent.js\").Extent} The extent.\n * @protected\n */\n getRect(element, size) {\n const box = element.getBoundingClientRect();\n const offsetX = box.left + window.pageXOffset;\n const offsetY = box.top + window.pageYOffset;\n return [offsetX, offsetY, offsetX + size[0], offsetY + size[1]];\n }\n\n /**\n * Set the positioning for this overlay.\n * @param {Positioning} positioning how the overlay is\n * positioned relative to its point on the map.\n * @observable\n * @api\n */\n setPositioning(positioning) {\n this.set(Property.POSITIONING, positioning);\n }\n\n /**\n * Modify the visibility of the element.\n * @param {boolean} visible Element visibility.\n * @protected\n */\n setVisible(visible) {\n if (this.rendered.visible !== visible) {\n this.element.style.display = visible ? '' : 'none';\n this.rendered.visible = visible;\n }\n }\n\n /**\n * Update pixel position.\n * @protected\n */\n updatePixelPosition() {\n const map = this.getMap();\n const position = this.getPosition();\n if (!map || !map.isRendered() || !position) {\n this.setVisible(false);\n return;\n }\n\n const pixel = map.getPixelFromCoordinate(position);\n const mapSize = map.getSize();\n this.updateRenderedPosition(pixel, mapSize);\n }\n\n /**\n * @param {import(\"./pixel.js\").Pixel} pixel The pixel location.\n * @param {import(\"./size.js\").Size|undefined} mapSize The map size.\n * @protected\n */\n updateRenderedPosition(pixel, mapSize) {\n const style = this.element.style;\n const offset = this.getOffset();\n\n const positioning = this.getPositioning();\n\n this.setVisible(true);\n\n const x = Math.round(pixel[0] + offset[0]) + 'px';\n const y = Math.round(pixel[1] + offset[1]) + 'px';\n let posX = '0%';\n let posY = '0%';\n if (\n positioning == 'bottom-right' ||\n positioning == 'center-right' ||\n positioning == 'top-right'\n ) {\n posX = '-100%';\n } else if (\n positioning == 'bottom-center' ||\n positioning == 'center-center' ||\n positioning == 'top-center'\n ) {\n posX = '-50%';\n }\n if (\n positioning == 'bottom-left' ||\n positioning == 'bottom-center' ||\n positioning == 'bottom-right'\n ) {\n posY = '-100%';\n } else if (\n positioning == 'center-left' ||\n positioning == 'center-center' ||\n positioning == 'center-right'\n ) {\n posY = '-50%';\n }\n const transform = `translate(${posX}, ${posY}) translate(${x}, ${y})`;\n if (this.rendered.transform_ != transform) {\n this.rendered.transform_ = transform;\n style.transform = transform;\n }\n }\n\n /**\n * returns the options this Overlay has been created with\n * @return {Options} overlay options\n */\n getOptions() {\n return this.options;\n }\n}\n\nexport default Overlay;\n", "/**\n * @module ol/control/ScaleLine\n */\nimport Control from './Control.js';\nimport {CLASS_UNSELECTABLE} from '../css.js';\nimport {METERS_PER_UNIT, getPointResolution} from '../proj.js';\nimport {assert} from '../asserts.js';\n\n/**\n * @type {string}\n */\nconst UNITS_PROP = 'units';\n\n/**\n * @typedef {'degrees' | 'imperial' | 'nautical' | 'metric' | 'us'} Units\n * Units for the scale line.\n */\n\n/**\n * @const\n * @type {Array}\n */\nconst LEADING_DIGITS = [1, 2, 5];\n\n/**\n * @const\n * @type {number}\n */\nconst DEFAULT_DPI = 25.4 / 0.28;\n\n/***\n * @template Return\n * @typedef {import(\"../Observable\").OnSignature &\n * import(\"../Observable\").OnSignature &\n * import(\"../Observable\").CombinedOnSignature} ScaleLineOnSignature\n */\n\n/**\n * @typedef {Object} Options\n * @property {string} [className] CSS class name. The default is `ol-scale-bar` when configured with\n * `bar: true`. Otherwise the default is `ol-scale-line`.\n * @property {number} [minWidth=64] Minimum width in pixels at the OGC default dpi. The width will be\n * adjusted to match the dpi used.\n * @property {number} [maxWidth] Maximum width in pixels at the OGC default dpi. The width will be\n * adjusted to match the dpi used.\n * @property {function(import(\"../MapEvent.js\").default):void} [render] Function called when the control\n * should be re-rendered. This is called in a `requestAnimationFrame` callback.\n * @property {HTMLElement|string} [target] Specify a target if you want the control\n * to be rendered outside of the map's viewport.\n * @property {Units} [units='metric'] Units.\n * @property {boolean} [bar=false] Render scalebars instead of a line.\n * @property {number} [steps=4] Number of steps the scalebar should use. Use even numbers\n * for best results. Only applies when `bar` is `true`.\n * @property {boolean} [text=false] Render the text scale above of the scalebar. Only applies\n * when `bar` is `true`.\n * @property {number|undefined} [dpi=undefined] dpi of output device such as printer. Only applies\n * when `bar` is `true`. If undefined the OGC default screen pixel size of 0.28mm will be assumed.\n */\n\n/**\n * @classdesc\n * A control displaying rough y-axis distances, calculated for the center of the\n * viewport. For conformal projections (e.g. EPSG:3857, the default view\n * projection in OpenLayers), the scale is valid for all directions.\n * No scale line will be shown when the y-axis distance of a pixel at the\n * viewport center cannot be calculated in the view projection.\n * By default the scale line will show in the bottom left portion of the map,\n * but this can be changed by using the css selector `.ol-scale-line`.\n * When specifying `bar` as `true`, a scalebar will be rendered instead\n * of a scaleline.\n *\n * @api\n */\nclass ScaleLine extends Control {\n /**\n * @param {Options} [options] Scale line options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const element = document.createElement('div');\n element.style.pointerEvents = 'none';\n\n super({\n element: element,\n render: options.render,\n target: options.target,\n });\n\n /***\n * @type {ScaleLineOnSignature}\n */\n this.on;\n\n /***\n * @type {ScaleLineOnSignature}\n */\n this.once;\n\n /***\n * @type {ScaleLineOnSignature}\n */\n this.un;\n\n const className =\n options.className !== undefined\n ? options.className\n : options.bar\n ? 'ol-scale-bar'\n : 'ol-scale-line';\n\n /**\n * @private\n * @type {HTMLElement}\n */\n this.innerElement_ = document.createElement('div');\n this.innerElement_.className = className + '-inner';\n\n this.element.className = className + ' ' + CLASS_UNSELECTABLE;\n this.element.appendChild(this.innerElement_);\n\n /**\n * @private\n * @type {?import(\"../View.js\").State}\n */\n this.viewState_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.minWidth_ = options.minWidth !== undefined ? options.minWidth : 64;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.maxWidth_ = options.maxWidth;\n\n /**\n * @private\n * @type {boolean}\n */\n this.renderedVisible_ = false;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.renderedWidth_ = undefined;\n\n /**\n * @private\n * @type {string}\n */\n this.renderedHTML_ = '';\n\n this.addChangeListener(UNITS_PROP, this.handleUnitsChanged_);\n\n this.setUnits(options.units || 'metric');\n\n /**\n * @private\n * @type {boolean}\n */\n this.scaleBar_ = options.bar || false;\n\n /**\n * @private\n * @type {number}\n */\n this.scaleBarSteps_ = options.steps || 4;\n\n /**\n * @private\n * @type {boolean}\n */\n this.scaleBarText_ = options.text || false;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.dpi_ = options.dpi || undefined;\n }\n\n /**\n * Return the units to use in the scale line.\n * @return {Units} The units\n * to use in the scale line.\n * @observable\n * @api\n */\n getUnits() {\n return this.get(UNITS_PROP);\n }\n\n /**\n * @private\n */\n handleUnitsChanged_() {\n this.updateElement_();\n }\n\n /**\n * Set the units to use in the scale line.\n * @param {Units} units The units to use in the scale line.\n * @observable\n * @api\n */\n setUnits(units) {\n this.set(UNITS_PROP, units);\n }\n\n /**\n * Specify the dpi of output device such as printer.\n * @param {number|undefined} dpi The dpi of output device.\n * @api\n */\n setDpi(dpi) {\n this.dpi_ = dpi;\n }\n\n /**\n * @private\n */\n updateElement_() {\n const viewState = this.viewState_;\n\n if (!viewState) {\n if (this.renderedVisible_) {\n this.element.style.display = 'none';\n this.renderedVisible_ = false;\n }\n return;\n }\n\n const center = viewState.center;\n const projection = viewState.projection;\n const units = this.getUnits();\n const pointResolutionUnits = units == 'degrees' ? 'degrees' : 'm';\n let pointResolution = getPointResolution(\n projection,\n viewState.resolution,\n center,\n pointResolutionUnits\n );\n\n const minWidth =\n (this.minWidth_ * (this.dpi_ || DEFAULT_DPI)) / DEFAULT_DPI;\n\n const maxWidth =\n this.maxWidth_ !== undefined\n ? (this.maxWidth_ * (this.dpi_ || DEFAULT_DPI)) / DEFAULT_DPI\n : undefined;\n\n let nominalCount = minWidth * pointResolution;\n let suffix = '';\n if (units == 'degrees') {\n const metersPerDegree = METERS_PER_UNIT.degrees;\n nominalCount *= metersPerDegree;\n if (nominalCount < metersPerDegree / 60) {\n suffix = '\\u2033'; // seconds\n pointResolution *= 3600;\n } else if (nominalCount < metersPerDegree) {\n suffix = '\\u2032'; // minutes\n pointResolution *= 60;\n } else {\n suffix = '\\u00b0'; // degrees\n }\n } else if (units == 'imperial') {\n if (nominalCount < 0.9144) {\n suffix = 'in';\n pointResolution /= 0.0254;\n } else if (nominalCount < 1609.344) {\n suffix = 'ft';\n pointResolution /= 0.3048;\n } else {\n suffix = 'mi';\n pointResolution /= 1609.344;\n }\n } else if (units == 'nautical') {\n pointResolution /= 1852;\n suffix = 'NM';\n } else if (units == 'metric') {\n if (nominalCount < 0.001) {\n suffix = '\u03BCm';\n pointResolution *= 1000000;\n } else if (nominalCount < 1) {\n suffix = 'mm';\n pointResolution *= 1000;\n } else if (nominalCount < 1000) {\n suffix = 'm';\n } else {\n suffix = 'km';\n pointResolution /= 1000;\n }\n } else if (units == 'us') {\n if (nominalCount < 0.9144) {\n suffix = 'in';\n pointResolution *= 39.37;\n } else if (nominalCount < 1609.344) {\n suffix = 'ft';\n pointResolution /= 0.30480061;\n } else {\n suffix = 'mi';\n pointResolution /= 1609.3472;\n }\n } else {\n assert(false, 33); // Invalid units\n }\n\n let i = 3 * Math.floor(Math.log(minWidth * pointResolution) / Math.log(10));\n let count, width, decimalCount;\n let previousCount, previousWidth, previousDecimalCount;\n while (true) {\n decimalCount = Math.floor(i / 3);\n const decimal = Math.pow(10, decimalCount);\n count = LEADING_DIGITS[((i % 3) + 3) % 3] * decimal;\n width = Math.round(count / pointResolution);\n if (isNaN(width)) {\n this.element.style.display = 'none';\n this.renderedVisible_ = false;\n return;\n }\n if (maxWidth !== undefined && width >= maxWidth) {\n count = previousCount;\n width = previousWidth;\n decimalCount = previousDecimalCount;\n break;\n } else if (width >= minWidth) {\n break;\n }\n previousCount = count;\n previousWidth = width;\n previousDecimalCount = decimalCount;\n ++i;\n }\n const html = this.scaleBar_\n ? this.createScaleBar(width, count, suffix)\n : count.toFixed(decimalCount < 0 ? -decimalCount : 0) + ' ' + suffix;\n\n if (this.renderedHTML_ != html) {\n this.innerElement_.innerHTML = html;\n this.renderedHTML_ = html;\n }\n\n if (this.renderedWidth_ != width) {\n this.innerElement_.style.width = width + 'px';\n this.renderedWidth_ = width;\n }\n\n if (!this.renderedVisible_) {\n this.element.style.display = '';\n this.renderedVisible_ = true;\n }\n }\n\n /**\n * @private\n * @param {number} width The current width of the scalebar.\n * @param {number} scale The current scale.\n * @param {string} suffix The suffix to append to the scale text.\n * @return {string} The stringified HTML of the scalebar.\n */\n createScaleBar(width, scale, suffix) {\n const resolutionScale = this.getScaleForResolution();\n const mapScale =\n resolutionScale < 1\n ? Math.round(1 / resolutionScale).toLocaleString() + ' : 1'\n : '1 : ' + Math.round(resolutionScale).toLocaleString();\n const steps = this.scaleBarSteps_;\n const stepWidth = width / steps;\n const scaleSteps = [this.createMarker('absolute')];\n for (let i = 0; i < steps; ++i) {\n const cls =\n i % 2 === 0 ? 'ol-scale-singlebar-odd' : 'ol-scale-singlebar-even';\n scaleSteps.push(\n '
' +\n '
' +\n '
' +\n this.createMarker('relative') +\n // render text every second step, except when only 2 steps\n (i % 2 === 0 || steps === 2\n ? this.createStepText(i, width, false, scale, suffix)\n : '') +\n '
'\n );\n }\n // render text at the end\n scaleSteps.push(this.createStepText(steps, width, true, scale, suffix));\n\n const scaleBarText = this.scaleBarText_\n ? `
` +\n mapScale +\n '
'\n : '';\n return scaleBarText + scaleSteps.join('');\n }\n\n /**\n * Creates a marker at given position\n * @param {'absolute'|'relative'} position The position, absolute or relative\n * @return {string} The stringified div containing the marker\n */\n createMarker(position) {\n const top = position === 'absolute' ? 3 : -10;\n return (\n '
'\n );\n }\n\n /**\n * Creates the label for a marker marker at given position\n * @param {number} i The iterator\n * @param {number} width The width the scalebar will currently use\n * @param {boolean} isLast Flag indicating if we add the last step text\n * @param {number} scale The current scale for the whole scalebar\n * @param {string} suffix The suffix for the scale\n * @return {string} The stringified div containing the step text\n */\n createStepText(i, width, isLast, scale, suffix) {\n const length =\n i === 0 ? 0 : Math.round((scale / this.scaleBarSteps_) * i * 100) / 100;\n const lengthString = length + (i === 0 ? '' : ' ' + suffix);\n const margin = i === 0 ? -3 : (width / this.scaleBarSteps_) * -1;\n const minWidth = i === 0 ? 0 : (width / this.scaleBarSteps_) * 2;\n return (\n '
' +\n lengthString +\n '
'\n );\n }\n\n /**\n * Returns the appropriate scale for the given resolution and units.\n * @return {number} The appropriate scale.\n */\n getScaleForResolution() {\n const resolution = getPointResolution(\n this.viewState_.projection,\n this.viewState_.resolution,\n this.viewState_.center,\n 'm'\n );\n const dpi = this.dpi_ || DEFAULT_DPI;\n const inchesPerMeter = 1000 / 25.4;\n return resolution * inchesPerMeter * dpi;\n }\n\n /**\n * Update the scale line element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(mapEvent) {\n const frameState = mapEvent.frameState;\n if (!frameState) {\n this.viewState_ = null;\n } else {\n this.viewState_ = frameState.viewState;\n }\n this.updateElement_();\n }\n}\n\nexport default ScaleLine;\n", "/**\n * @module ol/control/ZoomSlider\n */\n\nimport Control from './Control.js';\nimport EventType from '../events/EventType.js';\nimport PointerEventType from '../pointer/EventType.js';\nimport {CLASS_CONTROL, CLASS_UNSELECTABLE} from '../css.js';\nimport {clamp} from '../math.js';\nimport {easeOut} from '../easing.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport {stopPropagation} from '../events/Event.js';\n\n/**\n * The enum for available directions.\n *\n * @enum {number}\n */\nconst Direction = {\n VERTICAL: 0,\n HORIZONTAL: 1,\n};\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-zoomslider'] CSS class name.\n * @property {number} [duration=200] Animation duration in milliseconds.\n * @property {function(import(\"../MapEvent.js\").default):void} [render] Function called when the control\n * should be re-rendered. This is called in a `requestAnimationFrame` callback.\n * @property {HTMLElement|string} [target] Specify a target if you want the control to be\n * rendered outside of the map's viewport.\n */\n\n/**\n * @classdesc\n * A slider type of control for zooming.\n *\n * Example:\n *\n * map.addControl(new ZoomSlider());\n *\n * @api\n */\nclass ZoomSlider extends Control {\n /**\n * @param {Options} [options] Zoom slider options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super({\n target: options.target,\n element: document.createElement('div'),\n render: options.render,\n });\n\n /**\n * @type {!Array}\n * @private\n */\n this.dragListenerKeys_ = [];\n\n /**\n * Will hold the current resolution of the view.\n *\n * @type {number|undefined}\n * @private\n */\n this.currentResolution_ = undefined;\n\n /**\n * The direction of the slider. Will be determined from actual display of the\n * container and defaults to Direction.VERTICAL.\n *\n * @type {Direction}\n * @private\n */\n this.direction_ = Direction.VERTICAL;\n\n /**\n * @type {boolean}\n * @private\n */\n this.dragging_;\n\n /**\n * @type {number}\n * @private\n */\n this.heightLimit_ = 0;\n\n /**\n * @type {number}\n * @private\n */\n this.widthLimit_ = 0;\n\n /**\n * @type {number|undefined}\n * @private\n */\n this.startX_;\n\n /**\n * @type {number|undefined}\n * @private\n */\n this.startY_;\n\n /**\n * The calculated thumb size (border box plus margins). Set when initSlider_\n * is called.\n * @type {import(\"../size.js\").Size}\n * @private\n */\n this.thumbSize_ = null;\n\n /**\n * Whether the slider is initialized.\n * @type {boolean}\n * @private\n */\n this.sliderInitialized_ = false;\n\n /**\n * @type {number}\n * @private\n */\n this.duration_ = options.duration !== undefined ? options.duration : 200;\n\n const className =\n options.className !== undefined ? options.className : 'ol-zoomslider';\n const thumbElement = document.createElement('button');\n thumbElement.setAttribute('type', 'button');\n thumbElement.className = className + '-thumb ' + CLASS_UNSELECTABLE;\n const containerElement = this.element;\n containerElement.className =\n className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL;\n containerElement.appendChild(thumbElement);\n\n containerElement.addEventListener(\n PointerEventType.POINTERDOWN,\n this.handleDraggerStart_.bind(this),\n false\n );\n containerElement.addEventListener(\n PointerEventType.POINTERMOVE,\n this.handleDraggerDrag_.bind(this),\n false\n );\n containerElement.addEventListener(\n PointerEventType.POINTERUP,\n this.handleDraggerEnd_.bind(this),\n false\n );\n\n containerElement.addEventListener(\n EventType.CLICK,\n this.handleContainerClick_.bind(this),\n false\n );\n thumbElement.addEventListener(EventType.CLICK, stopPropagation, false);\n }\n\n /**\n * Remove the control from its current map and attach it to the new map.\n * Pass `null` to just remove the control from the current map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default|null} map Map.\n * @api\n */\n setMap(map) {\n super.setMap(map);\n if (map) {\n map.render();\n }\n }\n\n /**\n * Initializes the slider element. This will determine and set this controls\n * direction_ and also constrain the dragging of the thumb to always be within\n * the bounds of the container.\n *\n * @return {boolean} Initialization successful\n * @private\n */\n initSlider_() {\n const container = this.element;\n let containerWidth = container.offsetWidth;\n let containerHeight = container.offsetHeight;\n if (containerWidth === 0 && containerHeight === 0) {\n return (this.sliderInitialized_ = false);\n }\n\n const containerStyle = getComputedStyle(container);\n containerWidth -=\n parseFloat(containerStyle['paddingRight']) +\n parseFloat(containerStyle['paddingLeft']);\n containerHeight -=\n parseFloat(containerStyle['paddingTop']) +\n parseFloat(containerStyle['paddingBottom']);\n const thumb = /** @type {HTMLElement} */ (container.firstElementChild);\n const thumbStyle = getComputedStyle(thumb);\n const thumbWidth =\n thumb.offsetWidth +\n parseFloat(thumbStyle['marginRight']) +\n parseFloat(thumbStyle['marginLeft']);\n const thumbHeight =\n thumb.offsetHeight +\n parseFloat(thumbStyle['marginTop']) +\n parseFloat(thumbStyle['marginBottom']);\n this.thumbSize_ = [thumbWidth, thumbHeight];\n\n if (containerWidth > containerHeight) {\n this.direction_ = Direction.HORIZONTAL;\n this.widthLimit_ = containerWidth - thumbWidth;\n } else {\n this.direction_ = Direction.VERTICAL;\n this.heightLimit_ = containerHeight - thumbHeight;\n }\n return (this.sliderInitialized_ = true);\n }\n\n /**\n * @param {PointerEvent} event The browser event to handle.\n * @private\n */\n handleContainerClick_(event) {\n const view = this.getMap().getView();\n\n const relativePosition = this.getRelativePosition_(\n event.offsetX - this.thumbSize_[0] / 2,\n event.offsetY - this.thumbSize_[1] / 2\n );\n\n const resolution = this.getResolutionForPosition_(relativePosition);\n const zoom = view.getConstrainedZoom(view.getZoomForResolution(resolution));\n\n view.animateInternal({\n zoom: zoom,\n duration: this.duration_,\n easing: easeOut,\n });\n }\n\n /**\n * Handle dragger start events.\n * @param {PointerEvent} event The drag event.\n * @private\n */\n handleDraggerStart_(event) {\n if (!this.dragging_ && event.target === this.element.firstElementChild) {\n const element = /** @type {HTMLElement} */ (\n this.element.firstElementChild\n );\n this.getMap().getView().beginInteraction();\n this.startX_ = event.clientX - parseFloat(element.style.left);\n this.startY_ = event.clientY - parseFloat(element.style.top);\n this.dragging_ = true;\n\n if (this.dragListenerKeys_.length === 0) {\n const drag = this.handleDraggerDrag_;\n const end = this.handleDraggerEnd_;\n const doc = this.getMap().getOwnerDocument();\n this.dragListenerKeys_.push(\n listen(doc, PointerEventType.POINTERMOVE, drag, this),\n listen(doc, PointerEventType.POINTERUP, end, this)\n );\n }\n }\n }\n\n /**\n * Handle dragger drag events.\n *\n * @param {PointerEvent} event The drag event.\n * @private\n */\n handleDraggerDrag_(event) {\n if (this.dragging_) {\n const deltaX = event.clientX - this.startX_;\n const deltaY = event.clientY - this.startY_;\n const relativePosition = this.getRelativePosition_(deltaX, deltaY);\n this.currentResolution_ =\n this.getResolutionForPosition_(relativePosition);\n this.getMap().getView().setResolution(this.currentResolution_);\n }\n }\n\n /**\n * Handle dragger end events.\n * @param {PointerEvent} event The drag event.\n * @private\n */\n handleDraggerEnd_(event) {\n if (this.dragging_) {\n const view = this.getMap().getView();\n view.endInteraction();\n\n this.dragging_ = false;\n this.startX_ = undefined;\n this.startY_ = undefined;\n this.dragListenerKeys_.forEach(unlistenByKey);\n this.dragListenerKeys_.length = 0;\n }\n }\n\n /**\n * Positions the thumb inside its container according to the given resolution.\n *\n * @param {number} res The res.\n * @private\n */\n setThumbPosition_(res) {\n const position = this.getPositionForResolution_(res);\n const thumb = /** @type {HTMLElement} */ (this.element.firstElementChild);\n\n if (this.direction_ == Direction.HORIZONTAL) {\n thumb.style.left = this.widthLimit_ * position + 'px';\n } else {\n thumb.style.top = this.heightLimit_ * position + 'px';\n }\n }\n\n /**\n * Calculates the relative position of the thumb given x and y offsets. The\n * relative position scales from 0 to 1. The x and y offsets are assumed to be\n * in pixel units within the dragger limits.\n *\n * @param {number} x Pixel position relative to the left of the slider.\n * @param {number} y Pixel position relative to the top of the slider.\n * @return {number} The relative position of the thumb.\n * @private\n */\n getRelativePosition_(x, y) {\n let amount;\n if (this.direction_ === Direction.HORIZONTAL) {\n amount = x / this.widthLimit_;\n } else {\n amount = y / this.heightLimit_;\n }\n return clamp(amount, 0, 1);\n }\n\n /**\n * Calculates the corresponding resolution of the thumb given its relative\n * position (where 0 is the minimum and 1 is the maximum).\n *\n * @param {number} position The relative position of the thumb.\n * @return {number} The corresponding resolution.\n * @private\n */\n getResolutionForPosition_(position) {\n const fn = this.getMap().getView().getResolutionForValueFunction();\n return fn(1 - position);\n }\n\n /**\n * Determines the relative position of the slider for the given resolution. A\n * relative position of 0 corresponds to the minimum view resolution. A\n * relative position of 1 corresponds to the maximum view resolution.\n *\n * @param {number} res The resolution.\n * @return {number} The relative position value (between 0 and 1).\n * @private\n */\n getPositionForResolution_(res) {\n const fn = this.getMap().getView().getValueForResolutionFunction();\n return clamp(1 - fn(res), 0, 1);\n }\n\n /**\n * Update the zoomslider element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(mapEvent) {\n if (!mapEvent.frameState) {\n return;\n }\n if (!this.sliderInitialized_ && !this.initSlider_()) {\n return;\n }\n const res = mapEvent.frameState.viewState.resolution;\n this.currentResolution_ = res;\n this.setThumbPosition_(res);\n }\n}\n\nexport default ZoomSlider;\n", "/**\n * @module ol/ImageState\n */\n\n/**\n * @enum {number}\n */\nexport default {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n ERROR: 3,\n EMPTY: 4,\n};\n", "/**\n * @module ol/style/Image\n */\nimport {abstract} from '../util.js';\nimport {toSize} from '../size.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} opacity Opacity.\n * @property {boolean} rotateWithView If the image should get rotated with the view.\n * @property {number} rotation Rotation.\n * @property {number|import(\"../size.js\").Size} scale Scale.\n * @property {Array} displacement Displacement.\n * @property {\"declutter\"|\"obstacle\"|\"none\"|undefined} declutterMode Declutter mode: `declutter`, `obstacle`, 'none */\n\n/**\n * @classdesc\n * A base class used for creating subclasses and not instantiated in\n * apps. Base class for {@link module:ol/style/Icon~Icon}, {@link module:ol/style/Circle~CircleStyle} and\n * {@link module:ol/style/RegularShape~RegularShape}.\n * @abstract\n * @api\n */\nclass ImageStyle {\n /**\n * @param {Options} options Options.\n */\n constructor(options) {\n /**\n * @private\n * @type {number}\n */\n this.opacity_ = options.opacity;\n\n /**\n * @private\n * @type {boolean}\n */\n this.rotateWithView_ = options.rotateWithView;\n\n /**\n * @private\n * @type {number}\n */\n this.rotation_ = options.rotation;\n\n /**\n * @private\n * @type {number|import(\"../size.js\").Size}\n */\n this.scale_ = options.scale;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.scaleArray_ = toSize(options.scale);\n\n /**\n * @private\n * @type {Array}\n */\n this.displacement_ = options.displacement;\n\n /**\n * @private\n * @type {\"declutter\"|\"obstacle\"|\"none\"|undefined}\n */\n this.declutterMode_ = options.declutterMode;\n }\n\n /**\n * Clones the style.\n * @return {ImageStyle} The cloned style.\n * @api\n */\n clone() {\n const scale = this.getScale();\n return new ImageStyle({\n opacity: this.getOpacity(),\n scale: Array.isArray(scale) ? scale.slice() : scale,\n rotation: this.getRotation(),\n rotateWithView: this.getRotateWithView(),\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n }\n\n /**\n * Get the symbolizer opacity.\n * @return {number} Opacity.\n * @api\n */\n getOpacity() {\n return this.opacity_;\n }\n\n /**\n * Determine whether the symbolizer rotates with the map.\n * @return {boolean} Rotate with map.\n * @api\n */\n getRotateWithView() {\n return this.rotateWithView_;\n }\n\n /**\n * Get the symoblizer rotation.\n * @return {number} Rotation.\n * @api\n */\n getRotation() {\n return this.rotation_;\n }\n\n /**\n * Get the symbolizer scale.\n * @return {number|import(\"../size.js\").Size} Scale.\n * @api\n */\n getScale() {\n return this.scale_;\n }\n\n /**\n * Get the symbolizer scale array.\n * @return {import(\"../size.js\").Size} Scale array.\n */\n getScaleArray() {\n return this.scaleArray_;\n }\n\n /**\n * Get the displacement of the shape\n * @return {Array} Shape's center displacement\n * @api\n */\n getDisplacement() {\n return this.displacement_;\n }\n\n /**\n * Get the declutter mode of the shape\n * @return {\"declutter\"|\"obstacle\"|\"none\"|undefined} Shape's declutter mode\n * @api\n */\n getDeclutterMode() {\n return this.declutterMode_;\n }\n\n /**\n * Get the anchor point in pixels. The anchor determines the center point for the\n * symbolizer.\n * @abstract\n * @return {Array} Anchor.\n */\n getAnchor() {\n return abstract();\n }\n\n /**\n * Get the image element for the symbolizer.\n * @abstract\n * @param {number} pixelRatio Pixel ratio.\n * @return {HTMLCanvasElement|HTMLVideoElement|HTMLImageElement} Image element.\n */\n getImage(pixelRatio) {\n return abstract();\n }\n\n /**\n * @abstract\n * @return {HTMLCanvasElement|HTMLVideoElement|HTMLImageElement} Image element.\n */\n getHitDetectionImage() {\n return abstract();\n }\n\n /**\n * Get the image pixel ratio.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Pixel ratio.\n */\n getPixelRatio(pixelRatio) {\n return 1;\n }\n\n /**\n * @abstract\n * @return {import(\"../ImageState.js\").default} Image state.\n */\n getImageState() {\n return abstract();\n }\n\n /**\n * @abstract\n * @return {import(\"../size.js\").Size} Image size.\n */\n getImageSize() {\n return abstract();\n }\n\n /**\n * Get the origin of the symbolizer.\n * @abstract\n * @return {Array} Origin.\n */\n getOrigin() {\n return abstract();\n }\n\n /**\n * Get the size of the symbolizer (in pixels).\n * @abstract\n * @return {import(\"../size.js\").Size} Size.\n */\n getSize() {\n return abstract();\n }\n\n /**\n * Set the displacement.\n *\n * @param {Array} displacement Displacement.\n * @api\n */\n setDisplacement(displacement) {\n this.displacement_ = displacement;\n }\n\n /**\n * Set the opacity.\n *\n * @param {number} opacity Opacity.\n * @api\n */\n setOpacity(opacity) {\n this.opacity_ = opacity;\n }\n\n /**\n * Set whether to rotate the style with the view.\n *\n * @param {boolean} rotateWithView Rotate with map.\n * @api\n */\n setRotateWithView(rotateWithView) {\n this.rotateWithView_ = rotateWithView;\n }\n\n /**\n * Set the rotation.\n *\n * @param {number} rotation Rotation.\n * @api\n */\n setRotation(rotation) {\n this.rotation_ = rotation;\n }\n\n /**\n * Set the scale.\n *\n * @param {number|import(\"../size.js\").Size} scale Scale.\n * @api\n */\n setScale(scale) {\n this.scale_ = scale;\n this.scaleArray_ = toSize(scale);\n }\n\n /**\n * @abstract\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n listenImageChange(listener) {\n abstract();\n }\n\n /**\n * Load not yet loaded URI.\n * @abstract\n */\n load() {\n abstract();\n }\n\n /**\n * @abstract\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n unlistenImageChange(listener) {\n abstract();\n }\n}\n\nexport default ImageStyle;\n", "/**\n * @module ol/colorlike\n */\nimport {toString} from './color.js';\n\n/**\n * A type accepted by CanvasRenderingContext2D.fillStyle\n * or CanvasRenderingContext2D.strokeStyle.\n * Represents a color, pattern, or gradient. The origin for patterns and\n * gradients as fill style is an increment of 512 css pixels from map coordinate\n * `[0, 0]`. For seamless repeat patterns, width and height of the pattern image\n * must be a factor of two (2, 4, 8, ..., 512).\n *\n * @typedef {string|CanvasPattern|CanvasGradient} ColorLike\n * @api\n */\n\n/**\n * @param {import(\"./color.js\").Color|ColorLike} color Color.\n * @return {ColorLike} The color as an {@link ol/colorlike~ColorLike}.\n * @api\n */\nexport function asColorLike(color) {\n if (Array.isArray(color)) {\n return toString(color);\n }\n return color;\n}\n", "/**\n * @module ol/style/RegularShape\n */\n\nimport ImageState from '../ImageState.js';\nimport ImageStyle from './Image.js';\nimport {asArray} from '../color.js';\nimport {asColorLike} from '../colorlike.js';\nimport {createCanvasContext2D} from '../dom.js';\nimport {\n defaultFillStyle,\n defaultLineJoin,\n defaultLineWidth,\n defaultMiterLimit,\n defaultStrokeStyle,\n} from '../render/canvas.js';\n\n/**\n * Specify radius for regular polygons, or radius1 and radius2 for stars.\n * @typedef {Object} Options\n * @property {import(\"./Fill.js\").default} [fill] Fill style.\n * @property {number} points Number of points for stars and regular polygons. In case of a polygon, the number of points\n * is the number of sides.\n * @property {number} [radius] Radius of a regular polygon.\n * @property {number} [radius1] First radius of a star. Ignored if radius is set.\n * @property {number} [radius2] Second radius of a star.\n * @property {number} [angle=0] Shape's angle in radians. A value of 0 will have one of the shape's points facing up.\n * @property {Array} [displacement=[0, 0]] Displacement of the shape in pixels.\n * Positive values will shift the shape right and up.\n * @property {import(\"./Stroke.js\").default} [stroke] Stroke style.\n * @property {number} [rotation=0] Rotation in radians (positive rotation clockwise).\n * @property {boolean} [rotateWithView=false] Whether to rotate the shape with the view.\n * @property {number|import(\"../size.js\").Size} [scale=1] Scale. Unless two dimensional scaling is required a better\n * result may be obtained with appropriate settings for `radius`, `radius1` and `radius2`.\n * @property {\"declutter\"|\"obstacle\"|\"none\"|undefined} [declutterMode] Declutter mode.\n */\n\n/**\n * @typedef {Object} RenderOptions\n * @property {import(\"../colorlike.js\").ColorLike} [strokeStyle] StrokeStyle.\n * @property {number} strokeWidth StrokeWidth.\n * @property {number} size Size.\n * @property {Array|null} lineDash LineDash.\n * @property {number} lineDashOffset LineDashOffset.\n * @property {CanvasLineJoin} lineJoin LineJoin.\n * @property {number} miterLimit MiterLimit.\n */\n\n/**\n * @classdesc\n * Set regular shape style for vector features. The resulting shape will be\n * a regular polygon when `radius` is provided, or a star when `radius1` and\n * `radius2` are provided.\n * @api\n */\nclass RegularShape extends ImageStyle {\n /**\n * @param {Options} options Options.\n */\n constructor(options) {\n /**\n * @type {boolean}\n */\n const rotateWithView =\n options.rotateWithView !== undefined ? options.rotateWithView : false;\n\n super({\n opacity: 1,\n rotateWithView: rotateWithView,\n rotation: options.rotation !== undefined ? options.rotation : 0,\n scale: options.scale !== undefined ? options.scale : 1,\n displacement:\n options.displacement !== undefined ? options.displacement : [0, 0],\n declutterMode: options.declutterMode,\n });\n\n /**\n * @private\n * @type {Object}\n */\n this.canvas_ = undefined;\n\n /**\n * @private\n * @type {HTMLCanvasElement}\n */\n this.hitDetectionCanvas_ = null;\n\n /**\n * @private\n * @type {import(\"./Fill.js\").default}\n */\n this.fill_ = options.fill !== undefined ? options.fill : null;\n\n /**\n * @private\n * @type {Array}\n */\n this.origin_ = [0, 0];\n\n /**\n * @private\n * @type {number}\n */\n this.points_ = options.points;\n\n /**\n * @protected\n * @type {number}\n */\n this.radius_ =\n options.radius !== undefined ? options.radius : options.radius1;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.radius2_ = options.radius2;\n\n /**\n * @private\n * @type {number}\n */\n this.angle_ = options.angle !== undefined ? options.angle : 0;\n\n /**\n * @private\n * @type {import(\"./Stroke.js\").default}\n */\n this.stroke_ = options.stroke !== undefined ? options.stroke : null;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.size_ = null;\n\n /**\n * @private\n * @type {RenderOptions}\n */\n this.renderOptions_ = null;\n\n this.render();\n }\n\n /**\n * Clones the style.\n * @return {RegularShape} The cloned style.\n * @api\n */\n clone() {\n const scale = this.getScale();\n const style = new RegularShape({\n fill: this.getFill() ? this.getFill().clone() : undefined,\n points: this.getPoints(),\n radius: this.getRadius(),\n radius2: this.getRadius2(),\n angle: this.getAngle(),\n stroke: this.getStroke() ? this.getStroke().clone() : undefined,\n rotation: this.getRotation(),\n rotateWithView: this.getRotateWithView(),\n scale: Array.isArray(scale) ? scale.slice() : scale,\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n style.setOpacity(this.getOpacity());\n return style;\n }\n\n /**\n * Get the anchor point in pixels. The anchor determines the center point for the\n * symbolizer.\n * @return {Array} Anchor.\n * @api\n */\n getAnchor() {\n const size = this.size_;\n if (!size) {\n return null;\n }\n const displacement = this.getDisplacement();\n const scale = this.getScaleArray();\n // anchor is scaled by renderer but displacement should not be scaled\n // so divide by scale here\n return [\n size[0] / 2 - displacement[0] / scale[0],\n size[1] / 2 + displacement[1] / scale[1],\n ];\n }\n\n /**\n * Get the angle used in generating the shape.\n * @return {number} Shape's rotation in radians.\n * @api\n */\n getAngle() {\n return this.angle_;\n }\n\n /**\n * Get the fill style for the shape.\n * @return {import(\"./Fill.js\").default} Fill style.\n * @api\n */\n getFill() {\n return this.fill_;\n }\n\n /**\n * Set the fill style.\n * @param {import(\"./Fill.js\").default} fill Fill style.\n * @api\n */\n setFill(fill) {\n this.fill_ = fill;\n this.render();\n }\n\n /**\n * @return {HTMLCanvasElement} Image element.\n */\n getHitDetectionImage() {\n if (!this.hitDetectionCanvas_) {\n this.createHitDetectionCanvas_(this.renderOptions_);\n }\n return this.hitDetectionCanvas_;\n }\n\n /**\n * Get the image icon.\n * @param {number} pixelRatio Pixel ratio.\n * @return {HTMLCanvasElement} Image or Canvas element.\n * @api\n */\n getImage(pixelRatio) {\n let image = this.canvas_[pixelRatio];\n if (!image) {\n const renderOptions = this.renderOptions_;\n const context = createCanvasContext2D(\n renderOptions.size * pixelRatio,\n renderOptions.size * pixelRatio\n );\n this.draw_(renderOptions, context, pixelRatio);\n\n image = context.canvas;\n this.canvas_[pixelRatio] = image;\n }\n return image;\n }\n\n /**\n * Get the image pixel ratio.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Pixel ratio.\n */\n getPixelRatio(pixelRatio) {\n return pixelRatio;\n }\n\n /**\n * @return {import(\"../size.js\").Size} Image size.\n */\n getImageSize() {\n return this.size_;\n }\n\n /**\n * @return {import(\"../ImageState.js\").default} Image state.\n */\n getImageState() {\n return ImageState.LOADED;\n }\n\n /**\n * Get the origin of the symbolizer.\n * @return {Array} Origin.\n * @api\n */\n getOrigin() {\n return this.origin_;\n }\n\n /**\n * Get the number of points for generating the shape.\n * @return {number} Number of points for stars and regular polygons.\n * @api\n */\n getPoints() {\n return this.points_;\n }\n\n /**\n * Get the (primary) radius for the shape.\n * @return {number} Radius.\n * @api\n */\n getRadius() {\n return this.radius_;\n }\n\n /**\n * Get the secondary radius for the shape.\n * @return {number|undefined} Radius2.\n * @api\n */\n getRadius2() {\n return this.radius2_;\n }\n\n /**\n * Get the size of the symbolizer (in pixels).\n * @return {import(\"../size.js\").Size} Size.\n * @api\n */\n getSize() {\n return this.size_;\n }\n\n /**\n * Get the stroke style for the shape.\n * @return {import(\"./Stroke.js\").default} Stroke style.\n * @api\n */\n getStroke() {\n return this.stroke_;\n }\n\n /**\n * Set the stroke style.\n * @param {import(\"./Stroke.js\").default} stroke Stroke style.\n * @api\n */\n setStroke(stroke) {\n this.stroke_ = stroke;\n this.render();\n }\n\n /**\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n listenImageChange(listener) {}\n\n /**\n * Load not yet loaded URI.\n */\n load() {}\n\n /**\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n unlistenImageChange(listener) {}\n\n /**\n * Calculate additional canvas size needed for the miter.\n * @param {string} lineJoin Line join\n * @param {number} strokeWidth Stroke width\n * @param {number} miterLimit Miter limit\n * @return {number} Additional canvas size needed\n * @private\n */\n calculateLineJoinSize_(lineJoin, strokeWidth, miterLimit) {\n if (\n strokeWidth === 0 ||\n this.points_ === Infinity ||\n (lineJoin !== 'bevel' && lineJoin !== 'miter')\n ) {\n return strokeWidth;\n }\n // m | ^\n // i | |\\ .\n // t >| #\\\n // e | |\\ \\ .\n // r \\s\\\n // | \\t\\ . .\n // \\r\\ . .\n // | \\o\\ . . . . .\n // e \\k\\ . . . .\n // | \\e\\ . . . . .\n // d \\ \\ . . . .\n // | _ _a_ _\\# . . .\n // r1 / ` . .\n // | . .\n // b / . .\n // | . .\n // / r2 . .\n // | . .\n // / . .\n // |\u03B1 . .\n // / . .\n // \u00B0 center\n let r1 = this.radius_;\n let r2 = this.radius2_ === undefined ? r1 : this.radius2_;\n if (r1 < r2) {\n const tmp = r1;\n r1 = r2;\n r2 = tmp;\n }\n const points =\n this.radius2_ === undefined ? this.points_ : this.points_ * 2;\n const alpha = (2 * Math.PI) / points;\n const a = r2 * Math.sin(alpha);\n const b = Math.sqrt(r2 * r2 - a * a);\n const d = r1 - b;\n const e = Math.sqrt(a * a + d * d);\n const miterRatio = e / a;\n if (lineJoin === 'miter' && miterRatio <= miterLimit) {\n return miterRatio * strokeWidth;\n }\n // Calculate the distance from center to the stroke corner where\n // it was cut short because of the miter limit.\n // l\n // ----+---- <= distance from center to here is maxr\n // /####|k ##\\\n // /#####^#####\\\n // /#### /+\\# s #\\\n // /### h/+++\\# t #\\\n // /### t/+++++\\# r #\\\n // /### a/+++++++\\# o #\\\n // /### p/++ fill +\\# k #\\\n ///#### /+++++^+++++\\# e #\\\n //#####/+++++/+\\+++++\\#####\\\n const k = strokeWidth / 2 / miterRatio;\n const l = (strokeWidth / 2) * (d / e);\n const maxr = Math.sqrt((r1 + k) * (r1 + k) + l * l);\n const bevelAdd = maxr - r1;\n if (this.radius2_ === undefined || lineJoin === 'bevel') {\n return bevelAdd * 2;\n }\n // If outer miter is over the miter limit the inner miter may reach through the\n // center and be longer than the bevel, same calculation as above but swap r1 / r2.\n const aa = r1 * Math.sin(alpha);\n const bb = Math.sqrt(r1 * r1 - aa * aa);\n const dd = r2 - bb;\n const ee = Math.sqrt(aa * aa + dd * dd);\n const innerMiterRatio = ee / aa;\n if (innerMiterRatio <= miterLimit) {\n const innerLength = (innerMiterRatio * strokeWidth) / 2 - r2 - r1;\n return 2 * Math.max(bevelAdd, innerLength);\n }\n return bevelAdd * 2;\n }\n\n /**\n * @return {RenderOptions} The render options\n * @protected\n */\n createRenderOptions() {\n let lineJoin = defaultLineJoin;\n let miterLimit = 0;\n let lineDash = null;\n let lineDashOffset = 0;\n let strokeStyle;\n let strokeWidth = 0;\n\n if (this.stroke_) {\n strokeStyle = this.stroke_.getColor();\n if (strokeStyle === null) {\n strokeStyle = defaultStrokeStyle;\n }\n strokeStyle = asColorLike(strokeStyle);\n strokeWidth = this.stroke_.getWidth();\n if (strokeWidth === undefined) {\n strokeWidth = defaultLineWidth;\n }\n lineDash = this.stroke_.getLineDash();\n lineDashOffset = this.stroke_.getLineDashOffset();\n lineJoin = this.stroke_.getLineJoin();\n if (lineJoin === undefined) {\n lineJoin = defaultLineJoin;\n }\n miterLimit = this.stroke_.getMiterLimit();\n if (miterLimit === undefined) {\n miterLimit = defaultMiterLimit;\n }\n }\n\n const add = this.calculateLineJoinSize_(lineJoin, strokeWidth, miterLimit);\n const maxRadius = Math.max(this.radius_, this.radius2_ || 0);\n const size = Math.ceil(2 * maxRadius + add);\n\n return {\n strokeStyle: strokeStyle,\n strokeWidth: strokeWidth,\n size: size,\n lineDash: lineDash,\n lineDashOffset: lineDashOffset,\n lineJoin: lineJoin,\n miterLimit: miterLimit,\n };\n }\n\n /**\n * @protected\n */\n render() {\n this.renderOptions_ = this.createRenderOptions();\n const size = this.renderOptions_.size;\n this.canvas_ = {};\n this.size_ = [size, size];\n }\n\n /**\n * @private\n * @param {RenderOptions} renderOptions Render options.\n * @param {CanvasRenderingContext2D} context The rendering context.\n * @param {number} pixelRatio The pixel ratio.\n */\n draw_(renderOptions, context, pixelRatio) {\n context.scale(pixelRatio, pixelRatio);\n // set origin to canvas center\n context.translate(renderOptions.size / 2, renderOptions.size / 2);\n\n this.createPath_(context);\n\n if (this.fill_) {\n let color = this.fill_.getColor();\n if (color === null) {\n color = defaultFillStyle;\n }\n context.fillStyle = asColorLike(color);\n context.fill();\n }\n if (this.stroke_) {\n context.strokeStyle = renderOptions.strokeStyle;\n context.lineWidth = renderOptions.strokeWidth;\n if (renderOptions.lineDash) {\n context.setLineDash(renderOptions.lineDash);\n context.lineDashOffset = renderOptions.lineDashOffset;\n }\n context.lineJoin = renderOptions.lineJoin;\n context.miterLimit = renderOptions.miterLimit;\n context.stroke();\n }\n }\n\n /**\n * @private\n * @param {RenderOptions} renderOptions Render options.\n */\n createHitDetectionCanvas_(renderOptions) {\n if (this.fill_) {\n let color = this.fill_.getColor();\n\n // determine if fill is transparent (or pattern or gradient)\n let opacity = 0;\n if (typeof color === 'string') {\n color = asArray(color);\n }\n if (color === null) {\n opacity = 1;\n } else if (Array.isArray(color)) {\n opacity = color.length === 4 ? color[3] : 1;\n }\n if (opacity === 0) {\n // if a transparent fill style is set, create an extra hit-detection image\n // with a default fill style\n const context = createCanvasContext2D(\n renderOptions.size,\n renderOptions.size\n );\n this.hitDetectionCanvas_ = context.canvas;\n\n this.drawHitDetectionCanvas_(renderOptions, context);\n }\n }\n if (!this.hitDetectionCanvas_) {\n this.hitDetectionCanvas_ = this.getImage(1);\n }\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D} context The context to draw in.\n */\n createPath_(context) {\n let points = this.points_;\n const radius = this.radius_;\n if (points === Infinity) {\n context.arc(0, 0, radius, 0, 2 * Math.PI);\n } else {\n const radius2 = this.radius2_ === undefined ? radius : this.radius2_;\n if (this.radius2_ !== undefined) {\n points *= 2;\n }\n const startAngle = this.angle_ - Math.PI / 2;\n const step = (2 * Math.PI) / points;\n for (let i = 0; i < points; i++) {\n const angle0 = startAngle + i * step;\n const radiusC = i % 2 === 0 ? radius : radius2;\n context.lineTo(radiusC * Math.cos(angle0), radiusC * Math.sin(angle0));\n }\n context.closePath();\n }\n }\n\n /**\n * @private\n * @param {RenderOptions} renderOptions Render options.\n * @param {CanvasRenderingContext2D} context The context.\n */\n drawHitDetectionCanvas_(renderOptions, context) {\n // set origin to canvas center\n context.translate(renderOptions.size / 2, renderOptions.size / 2);\n\n this.createPath_(context);\n\n context.fillStyle = defaultFillStyle;\n context.fill();\n if (this.stroke_) {\n context.strokeStyle = renderOptions.strokeStyle;\n context.lineWidth = renderOptions.strokeWidth;\n if (renderOptions.lineDash) {\n context.setLineDash(renderOptions.lineDash);\n context.lineDashOffset = renderOptions.lineDashOffset;\n }\n context.lineJoin = renderOptions.lineJoin;\n context.miterLimit = renderOptions.miterLimit;\n context.stroke();\n }\n }\n}\n\nexport default RegularShape;\n", "/**\n * @module ol/style/Circle\n */\n\nimport RegularShape from './RegularShape.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"./Fill.js\").default} [fill] Fill style.\n * @property {number} radius Circle radius.\n * @property {import(\"./Stroke.js\").default} [stroke] Stroke style.\n * @property {Array} [displacement=[0,0]] displacement\n * @property {number|import(\"../size.js\").Size} [scale=1] Scale. A two dimensional scale will produce an ellipse.\n * Unless two dimensional scaling is required a better result may be obtained with an appropriate setting for `radius`.\n * @property {number} [rotation=0] Rotation in radians\n * (positive rotation clockwise, meaningful only when used in conjunction with a two dimensional scale).\n * @property {boolean} [rotateWithView=false] Whether to rotate the shape with the view\n * (meaningful only when used in conjunction with a two dimensional scale).\n * @property {\"declutter\"|\"obstacle\"|\"none\"|undefined} [declutterMode] Declutter mode\n */\n\n/**\n * @classdesc\n * Set circle style for vector features.\n * @api\n */\nclass CircleStyle extends RegularShape {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {radius: 5};\n\n super({\n points: Infinity,\n fill: options.fill,\n radius: options.radius,\n stroke: options.stroke,\n scale: options.scale !== undefined ? options.scale : 1,\n rotation: options.rotation !== undefined ? options.rotation : 0,\n rotateWithView:\n options.rotateWithView !== undefined ? options.rotateWithView : false,\n displacement:\n options.displacement !== undefined ? options.displacement : [0, 0],\n declutterMode: options.declutterMode,\n });\n }\n\n /**\n * Clones the style.\n * @return {CircleStyle} The cloned style.\n * @api\n */\n clone() {\n const scale = this.getScale();\n const style = new CircleStyle({\n fill: this.getFill() ? this.getFill().clone() : undefined,\n stroke: this.getStroke() ? this.getStroke().clone() : undefined,\n radius: this.getRadius(),\n scale: Array.isArray(scale) ? scale.slice() : scale,\n rotation: this.getRotation(),\n rotateWithView: this.getRotateWithView(),\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n style.setOpacity(this.getOpacity());\n return style;\n }\n\n /**\n * Set the circle radius.\n *\n * @param {number} radius Circle radius.\n * @api\n */\n setRadius(radius) {\n this.radius_ = radius;\n this.render();\n }\n}\n\nexport default CircleStyle;\n", "/**\n * @module ol/style/Fill\n */\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|null} [color=null] A color, gradient or pattern.\n * See {@link module:ol/color~Color} and {@link module:ol/colorlike~ColorLike} for possible formats.\n * Default null; if null, the Canvas/renderer default black will be used.\n */\n\n/**\n * @classdesc\n * Set fill style for vector features.\n * @api\n */\nclass Fill {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n /**\n * @private\n * @type {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|null}\n */\n this.color_ = options.color !== undefined ? options.color : null;\n }\n\n /**\n * Clones the style. The color is not cloned if it is an {@link module:ol/colorlike~ColorLike}.\n * @return {Fill} The cloned style.\n * @api\n */\n clone() {\n const color = this.getColor();\n return new Fill({\n color: Array.isArray(color) ? color.slice() : color || undefined,\n });\n }\n\n /**\n * Get the fill color.\n * @return {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|null} Color.\n * @api\n */\n getColor() {\n return this.color_;\n }\n\n /**\n * Set the color.\n *\n * @param {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|null} color Color.\n * @api\n */\n setColor(color) {\n this.color_ = color;\n }\n}\n\nexport default Fill;\n", "/**\n * @module ol/style/Stroke\n */\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [color] A color, gradient or pattern.\n * See {@link module:ol/color~Color} and {@link module:ol/colorlike~ColorLike} for possible formats.\n * Default null; if null, the Canvas/renderer default black will be used.\n * @property {CanvasLineCap} [lineCap='round'] Line cap style: `butt`, `round`, or `square`.\n * @property {CanvasLineJoin} [lineJoin='round'] Line join style: `bevel`, `round`, or `miter`.\n * @property {Array} [lineDash] Line dash pattern. Default is `null` (no dash).\n * @property {number} [lineDashOffset=0] Line dash offset.\n * @property {number} [miterLimit=10] Miter limit.\n * @property {number} [width] Width.\n */\n\n/**\n * @classdesc\n * Set stroke style for vector features.\n * Note that the defaults given are the Canvas defaults, which will be used if\n * option is not defined. The `get` functions return whatever was entered in\n * the options; they will not return the default.\n * @api\n */\nclass Stroke {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n /**\n * @private\n * @type {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike}\n */\n this.color_ = options.color !== undefined ? options.color : null;\n\n /**\n * @private\n * @type {CanvasLineCap|undefined}\n */\n this.lineCap_ = options.lineCap;\n\n /**\n * @private\n * @type {Array|null}\n */\n this.lineDash_ = options.lineDash !== undefined ? options.lineDash : null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.lineDashOffset_ = options.lineDashOffset;\n\n /**\n * @private\n * @type {CanvasLineJoin|undefined}\n */\n this.lineJoin_ = options.lineJoin;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.miterLimit_ = options.miterLimit;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.width_ = options.width;\n }\n\n /**\n * Clones the style.\n * @return {Stroke} The cloned style.\n * @api\n */\n clone() {\n const color = this.getColor();\n return new Stroke({\n color: Array.isArray(color) ? color.slice() : color || undefined,\n lineCap: this.getLineCap(),\n lineDash: this.getLineDash() ? this.getLineDash().slice() : undefined,\n lineDashOffset: this.getLineDashOffset(),\n lineJoin: this.getLineJoin(),\n miterLimit: this.getMiterLimit(),\n width: this.getWidth(),\n });\n }\n\n /**\n * Get the stroke color.\n * @return {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} Color.\n * @api\n */\n getColor() {\n return this.color_;\n }\n\n /**\n * Get the line cap type for the stroke.\n * @return {CanvasLineCap|undefined} Line cap.\n * @api\n */\n getLineCap() {\n return this.lineCap_;\n }\n\n /**\n * Get the line dash style for the stroke.\n * @return {Array|null} Line dash.\n * @api\n */\n getLineDash() {\n return this.lineDash_;\n }\n\n /**\n * Get the line dash offset for the stroke.\n * @return {number|undefined} Line dash offset.\n * @api\n */\n getLineDashOffset() {\n return this.lineDashOffset_;\n }\n\n /**\n * Get the line join type for the stroke.\n * @return {CanvasLineJoin|undefined} Line join.\n * @api\n */\n getLineJoin() {\n return this.lineJoin_;\n }\n\n /**\n * Get the miter limit for the stroke.\n * @return {number|undefined} Miter limit.\n * @api\n */\n getMiterLimit() {\n return this.miterLimit_;\n }\n\n /**\n * Get the stroke width.\n * @return {number|undefined} Width.\n * @api\n */\n getWidth() {\n return this.width_;\n }\n\n /**\n * Set the color.\n *\n * @param {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} color Color.\n * @api\n */\n setColor(color) {\n this.color_ = color;\n }\n\n /**\n * Set the line cap.\n *\n * @param {CanvasLineCap|undefined} lineCap Line cap.\n * @api\n */\n setLineCap(lineCap) {\n this.lineCap_ = lineCap;\n }\n\n /**\n * Set the line dash.\n *\n * @param {Array|null} lineDash Line dash.\n * @api\n */\n setLineDash(lineDash) {\n this.lineDash_ = lineDash;\n }\n\n /**\n * Set the line dash offset.\n *\n * @param {number|undefined} lineDashOffset Line dash offset.\n * @api\n */\n setLineDashOffset(lineDashOffset) {\n this.lineDashOffset_ = lineDashOffset;\n }\n\n /**\n * Set the line join.\n *\n * @param {CanvasLineJoin|undefined} lineJoin Line join.\n * @api\n */\n setLineJoin(lineJoin) {\n this.lineJoin_ = lineJoin;\n }\n\n /**\n * Set the miter limit.\n *\n * @param {number|undefined} miterLimit Miter limit.\n * @api\n */\n setMiterLimit(miterLimit) {\n this.miterLimit_ = miterLimit;\n }\n\n /**\n * Set the width.\n *\n * @param {number|undefined} width Width.\n * @api\n */\n setWidth(width) {\n this.width_ = width;\n }\n}\n\nexport default Stroke;\n", "/**\n * @module ol/style/Style\n */\n\nimport CircleStyle from './Circle.js';\nimport Fill from './Fill.js';\nimport Stroke from './Stroke.js';\nimport {assert} from '../asserts.js';\n\n/**\n * A function that takes an {@link module:ol/Feature~Feature} and a `{number}`\n * representing the view's resolution. The function should return a\n * {@link module:ol/style/Style~Style} or an array of them. This way e.g. a\n * vector layer can be styled. If the function returns `undefined`, the\n * feature will not be rendered.\n *\n * @typedef {function(import(\"../Feature.js\").FeatureLike, number):(Style|Array