From 721a76516ec4ca4fc57e4f9ddce405aa3f23f7e3 Mon Sep 17 00:00:00 2001 From: Jachym Cepicky Date: Wed, 5 Apr 2017 16:42:04 +0200 Subject: [PATCH] New webpack-based build system (#6) * Introducing WebPack build stack * core examples build implemented * browser build enabled * compile in css too * cleaning from old closure code * removing skydome.jpg * introducing import-based build * more clean global namespace export * geographiclib and proj4 as external libraries * README update * Fixing all demos * README update --- .babelrc | 4 + .eslintrc | 29 + .gitignore | 6 + README.md | 28 + demos/browser/basic/demo.js | 9 +- demos/browser/basic/index.html | 11 +- demos/browser/flights/demo.js | 5 +- demos/browser/flights/index.html | 11 +- demos/browser/flights/skydome.jpg | Bin 95910 -> 0 bytes demos/browser/hit-surface/demo.js | 5 +- demos/browser/hit-surface/index.html | 11 +- demos/browser/hit-surface/skydome.jpg | Bin 95910 -> 0 bytes demos/browser/lines-and-images/demo.js | 7 +- demos/browser/lines-and-images/index.html | 11 +- demos/browser/lines-and-images/skydome.jpg | Bin 95910 -> 0 bytes demos/browser/meshes-hit-test/demo.js | 7 +- demos/browser/meshes-hit-test/index.html | 11 +- demos/browser/meshes-hit-test/skydome.jpg | Bin 95910 -> 0 bytes demos/browser/meshes/demo.js | 7 +- demos/browser/meshes/index.html | 11 +- demos/browser/meshes/skydome.jpg | Bin 95910 -> 0 bytes demos/browser/view-switch/demo.js | 5 +- demos/browser/view-switch/index.html | 11 +- demos/browser/view-switch/skydome.jpg | Bin 95910 -> 0 bytes demos/core/basic/demo.js | 6 +- demos/core/basic/index.html | 9 +- demos/core/basic/skydome.jpg | Bin 95910 -> 0 bytes demos/core/hit-surface/demo.js | 3 +- demos/core/hit-surface/index.html | 9 +- demos/core/hit-surface/skydome.jpg | Bin 95910 -> 0 bytes demos/core/lines-and-images/demo.js | 5 +- demos/core/lines-and-images/index.html | 12 +- demos/core/lines-and-images/skydome.jpg | Bin 95910 -> 0 bytes demos/core/meshes-hit-test/demo.js | 4 +- demos/core/meshes-hit-test/index.html | 9 +- demos/core/meshes-hit-test/skydome.jpg | Bin 95910 -> 0 bytes demos/core/meshes/demo.js | 4 +- demos/core/meshes/index.html | 9 +- demos/core/meshes/skydome.jpg | Bin 95910 -> 0 bytes demos/{browser/basic => images}/skydome.jpg | Bin .../{core/meshes-hit-test => images}/wood.png | Bin package.json | 53 + src/browser/browser.js | 10 + src/browser/index.js | 3 + src/browser/interface.js | 103 +- src/browser/ui/control/holder.js | 4 + src/browser/ui/element/events.js | 2 + src/browser/ui/ui.js | 15 + src/browser/utility/dom.js | 1 + src/core/_minify.js | 24 - src/core/config.js | 2 +- src/core/core.js | 32 +- src/core/index.js | 3 + src/core/interface.js | 22 +- src/core/map/config.js | 5 + src/core/map/interface.js | 1 + src/core/map/map.js | 10 + src/core/map/measure.js | 1 + src/core/map/mesh.js | 2 + src/core/map/metatile.js | 2 + src/core/map/position.js | 2 + src/core/map/refframe.js | 2 + src/core/map/resource-node.js | 3 + src/core/map/resource-tree.js | 2 + src/core/map/srs.js | 3 + src/core/map/submesh.js | 3 - src/core/map/surface-tree.js | 2 + src/core/map/texture.js | 2 + src/core/renderer/camera.js | 1 + src/core/renderer/geometry.js | 1 + src/core/renderer/gpu/texture.js | 1 + src/core/renderer/init.js | 9 + src/core/renderer/renderer.js | 2 + src/core/utils/libs/geographics-advanced.js | 24 - src/core/utils/libs/geographics-basic.js | 56 - src/core/utils/libs/geographics-full.js | 2863 -------- src/core/utils/libs/geographics-nomini.js | 75 - src/core/utils/libs/proj4-src.js | 6321 ----------------- src/core/utils/libs/proj4.js | 3 - src/core/utils/utils.js | 316 +- test/index.js | 11 + webpack.config.js | 65 + 82 files changed, 739 insertions(+), 9582 deletions(-) create mode 100644 .babelrc create mode 100644 .eslintrc delete mode 100755 demos/browser/flights/skydome.jpg delete mode 100755 demos/browser/hit-surface/skydome.jpg delete mode 100755 demos/browser/lines-and-images/skydome.jpg delete mode 100755 demos/browser/meshes-hit-test/skydome.jpg delete mode 100755 demos/browser/meshes/skydome.jpg delete mode 100755 demos/browser/view-switch/skydome.jpg delete mode 100755 demos/core/basic/skydome.jpg delete mode 100755 demos/core/hit-surface/skydome.jpg delete mode 100755 demos/core/lines-and-images/skydome.jpg delete mode 100755 demos/core/meshes-hit-test/skydome.jpg delete mode 100755 demos/core/meshes/skydome.jpg rename demos/{browser/basic => images}/skydome.jpg (100%) rename demos/{core/meshes-hit-test => images}/wood.png (100%) create mode 100644 package.json create mode 100644 src/browser/index.js create mode 100644 src/core/index.js delete mode 100755 src/core/utils/libs/geographics-advanced.js delete mode 100755 src/core/utils/libs/geographics-basic.js delete mode 100755 src/core/utils/libs/geographics-full.js delete mode 100755 src/core/utils/libs/geographics-nomini.js delete mode 100755 src/core/utils/libs/proj4-src.js delete mode 100755 src/core/utils/libs/proj4.js create mode 100644 test/index.js create mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 00000000..deb740a2 --- /dev/null +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "presents": ["es2015"], + "plugins": ["babel-plugin-add-module-exports"] +} diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 00000000..bc189033 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,29 @@ +{ + "ecmaFeatures": { + "globalReturn": true, + "jsx": true, + "modules": true + }, + "env": { + "browser": true, + "es6": true, + "node": true + }, + "globals": { + "document": false, + "escape": false, + "navigator": false, + "unescape": false, + "window": false, + "describe": true, + "before": true, + "it": true, + "expect": true, + "sinon": true + }, + "parser": "babel-eslint", + "plugins": [], + "rules": { + // ... lots of lots of rules here + } +} diff --git a/.gitignore b/.gitignore index 8cf267fd..3694a7de 100755 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,8 @@ build/* +node_modules +build/* +build/*.js +build/*.css .project +*.un~ +*.sw* diff --git a/README.md b/README.md index 26247f74..e37baf79 100644 --- a/README.md +++ b/README.md @@ -2,3 +2,31 @@ ## Documentation * [Melown API](https://github.com/Melown/melown-js/wiki/Melown-API) + +## Install + +``` +npm install +``` + +(`yarn install` will be ready soon) + +## Build (constantly) + +``` +node_modules/.bin/webpack --watch +``` + +## Build compressed version + +``` +NODE_ENV=production node_modules/.bin/webpack +``` + +## Run dev server + +``` +node_modules/.bin/webpack-dev-server --inline +``` + +And go to http://localhost:8080/demos/core/basic/ diff --git a/demos/browser/basic/demo.js b/demos/browser/basic/demo.js index 3025fbb5..0549ee11 100755 --- a/demos/browser/basic/demo.js +++ b/demos/browser/basic/demo.js @@ -1,6 +1,5 @@ - -function startDemo() { - var browser = Melown.MapBrowser("map-div", { - map : "https://demo.test.mlwn.se/public-maps/grand-ev/mapConfig.json" +(function startDemo() { + var browser = Melown.MapBrowser('map-div', { + map: 'https://demo.test.mlwn.se/public-maps/grand-ev/mapConfig.json' }); -} +})(); diff --git a/demos/browser/basic/index.html b/demos/browser/basic/index.html index 30871773..ca27f7d2 100755 --- a/demos/browser/basic/index.html +++ b/demos/browser/basic/index.html @@ -2,13 +2,14 @@ Vadstena Map Viewer - - - + + + - +
+ - \ No newline at end of file + diff --git a/demos/browser/flights/demo.js b/demos/browser/flights/demo.js index ffaa9bf5..461a40bf 100755 --- a/demos/browser/flights/demo.js +++ b/demos/browser/flights/demo.js @@ -1,9 +1,8 @@ - var browser = null; var ui = null; var list = null; -function startDemo() { +(function startDemo() { browser = Melown.MapBrowser("map-div", { map : "https://demo.test.mlwn.se/public-maps/grand-ev/mapConfig.json", position : [ "obj", 1683559, 6604129, "float", 0, -13, -58, 0, 3764, 90 ] @@ -19,7 +18,7 @@ function startDemo() { list = panel.getElement("panel"); list.on("change", onFlyToNewDestination); -} +})(); function onFlyToNewDestination() { switch (list.getElement().elements["destination"].value) { diff --git a/demos/browser/flights/index.html b/demos/browser/flights/index.html index 9d655228..7f46d827 100755 --- a/demos/browser/flights/index.html +++ b/demos/browser/flights/index.html @@ -2,9 +2,9 @@ Vadstena Map Viewer - - - + + + - +
+ - \ No newline at end of file + diff --git a/demos/core/hit-surface/skydome.jpg b/demos/core/hit-surface/skydome.jpg deleted file mode 100755 index 89daadd81445ef6ed6a270716fa2f7984631129d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95910 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 diff --git a/demos/core/lines-and-images/demo.js b/demos/core/lines-and-images/demo.js index f0df2103..5ae4d348 100755 --- a/demos/core/lines-and-images/demo.js +++ b/demos/core/lines-and-images/demo.js @@ -1,4 +1,3 @@ - var core = null; var demoTexture = null; var isMapProjected = false; @@ -41,6 +40,8 @@ function startDemo() { window.addEventListener("DOMMouseScroll", onMouseWheel, true); window.addEventListener("mousewheel", onMouseWheel, true); document.onselectstart = function(){ return false; }; //removes text cusor during draging + + document.getElementById('switch').onchange = function() {switchMap();} } @@ -272,3 +273,5 @@ function reduceFloatingHeight(pos, factor) { return pos; }; + +startDemo(); diff --git a/demos/core/lines-and-images/index.html b/demos/core/lines-and-images/index.html index 84ef607a..62e11820 100755 --- a/demos/core/lines-and-images/index.html +++ b/demos/core/lines-and-images/index.html @@ -1,9 +1,8 @@ Vadstena Map Viewer - - - + + - +
- Base Map + Base Map
+ - \ No newline at end of file + diff --git a/demos/core/lines-and-images/skydome.jpg b/demos/core/lines-and-images/skydome.jpg deleted file mode 100755 index 89daadd81445ef6ed6a270716fa2f7984631129d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95910 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 diff --git a/demos/core/meshes-hit-test/demo.js b/demos/core/meshes-hit-test/demo.js index 552d1083..7abf640f 100755 --- a/demos/core/meshes-hit-test/demo.js +++ b/demos/core/meshes-hit-test/demo.js @@ -1,4 +1,3 @@ - var core = null; var woodTexture = null; var pointTexture = null; @@ -39,7 +38,7 @@ function startDemo() { function loadTextrures() { //load texture used for cubes - var woodImage = Melown.Http.imageFactory("./wood.png", + var woodImage = Melown.Http.imageFactory("/demos/images/wood.png", (function(){ woodTexture = core.getRenderer().createTexture({ "source": woodImage }); }).bind(this) @@ -393,3 +392,4 @@ function reduceFloatingHeight(pos, factor) { return pos; }; +startDemo(); diff --git a/demos/core/meshes-hit-test/index.html b/demos/core/meshes-hit-test/index.html index b86652f3..db8fbdc7 100755 --- a/demos/core/meshes-hit-test/index.html +++ b/demos/core/meshes-hit-test/index.html @@ -2,8 +2,8 @@ Vadstena Map Viewer - - + + - +
+ - \ No newline at end of file + diff --git a/demos/core/meshes-hit-test/skydome.jpg b/demos/core/meshes-hit-test/skydome.jpg deleted file mode 100755 index 89daadd81445ef6ed6a270716fa2f7984631129d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95910 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 diff --git a/demos/core/meshes/demo.js b/demos/core/meshes/demo.js index 3e170d49..0efc0675 100755 --- a/demos/core/meshes/demo.js +++ b/demos/core/meshes/demo.js @@ -1,4 +1,3 @@ - var core = null; var woodTexture = null; var cubeMesh = null; @@ -21,7 +20,7 @@ function startDemo() { core.on("map-loaded", onMapLoaded); //load texture used for cubes - var woodImage = Melown.Http.imageFactory("./wood.png", + var woodImage = Melown.Http.imageFactory("/demos/images/wood.png", (function(){ woodTexture = core.getRenderer().createTexture({ "source": woodImage }); }).bind(this) @@ -341,3 +340,4 @@ function reduceFloatingHeight(pos, factor) { return pos; }; +startDemo(); diff --git a/demos/core/meshes/index.html b/demos/core/meshes/index.html index b86652f3..db8fbdc7 100755 --- a/demos/core/meshes/index.html +++ b/demos/core/meshes/index.html @@ -2,8 +2,8 @@ Vadstena Map Viewer - - + + - +
+ - \ No newline at end of file + diff --git a/demos/core/meshes/skydome.jpg b/demos/core/meshes/skydome.jpg deleted file mode 100755 index 89daadd81445ef6ed6a270716fa2f7984631129d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 95910 zcmeFZcUV(dzcw5~0x1FkVn9VE$v|)`y_cvEz=1%BlORfy-lSLK3_1`JiYOw48jQja zA}UG~DHalnf`|x?(ws>U%P2a*QHR0N=Uelf=RD{9@t*g3|9-!BUwU21&R%P;^;^Gk z-}hSjkJ*1HVEUe%gjg8N+j~0<1^ch-A1g3zkL;+#BQO;h0^E*&)`l^RIV-Z#&8Vn$+RLhs_V$n5SmMSy(waIsM&-wY3>| z!YuPhN>&8NEG6^n|LnmdCNnA{AuTH*HHG+hj}ein*;zZuV5I*sh2%6=LR@@S=D$1t zUs^2VpU?a~zyECYzkmL}J;-4E?;lN0{&%;TS*)14Qx9kU^Jxad**hgOD}}la-S_OVb8~Y0&$b?^QQ65cDOvy7Hu}HXI{lAr|MsioH1KARn2dy+nCLwjsma8D zTEaQue;$kd|JdKZ+D8A+V{!N&+ggCZSp4lJ|IKUu^A>Q$zd!yv2EdnpM^Q`)FnR`v zk$=2}Y5vpmVbOyi7FGVS0OP?_{?9M?e_g8ozW&u5uA%~d1%Lnj!~f}re+HIp5J)7L;66ms)L8CvNlE%5M*n16zyxIjarktHt0(QuBQ55FVt2c zxmiV|>*(UYJ>8Mts0v3skp5#Hwn0?|3{h1Zwj1`vnDcfZ@5@ieHs3TIZEP1g=5e^} z+r6a)!>S`Sjo0(2$wxm@OKS&;$^s1sA3j{Imghgcp`u0T#jl>CDo?TSjL-Hx zVIs4Q8d^W?J~40!rD<}C;HpKqRi5BJy5|9GwK87isQ_XBoHOLTL>t;f&FZRGVd@Ec ziRxvqdtv`K&#!dP>vGrC_$3c0?~7iNhN`rFO3NTc`tC6tPsJQE1Lc^Wxb}@FTt&D;_`zAN)9G6quuYT(2 zA27}zT@5fQ=W3pzJ?yL7-YU0DejK?LZ{aU}I?!6QWT;VhEBrX;EQ!vM&!~Q7Qks4m zp=FqXGSs+5%zrxSc86+I_Eu%-&ZH}}v=_D-%W=;fsdJ}^w91qGS4T=~H>ZaYC>${7 z9GEhexZ8cLpM%g+`=wn~dP$XWN~0LvA)mbNtYi=64pPmlzrc{I0{h=^VFo8cBpVuY zzw45zmu~Zvl$f;*Yy9m*`l~9`=;T4-O^2FL&q>wW$CqAvSaXEQD8mhZQe9V{-|5(> zrT)eWt!Ybt$9 zk71la$D&dSF;oi&@ne z3+oy^aB-WfQlnr^51c$7sRO=Lc+?GUDx=*Awo7W6GlnG(^?xv1?NuXg{N zQlm@P{V&QVU#UE$&_fXEsPAX8lzW0mSEb%64KL01GQBu3= z@wJ0<*Hs5GB8=MIr)9V$wZCR$8hO~KkM5l_G@3#cmBpMe(2b#5r$p8?97V;qk~7*s4>;^i!BcsV$5eoa?&8u_|m?tQ=`094&onPCZAuLH+(`Qx9ck z=!EBmuub-ZLcwZ5B#vsZa0XUntBgH@)wr-$f>Zj|{h@9=bDSf`J;^oB4B95LPHx(m z`+WvXdG}bPOj7Ks?26kflvB4@IX7q#YH1?VicaPBHJkoC&e)keS7milqn#G)v+CND z2MRk!!>z$Y=@tC$(j1fp*Zy2K6TQV0wscdkCl#iIOSt)+YfpKO`L}G91>x|u4_)!< zCAM(V)4C{i#2j;ju(pLg6bsj5XsIQ7eh$^bFBrm2>{b&8seU2dy@S}LdoV4+FE~fh zhKSZ{MyrXQXCv3{p4x^=Wg7lbs!cU`oT+`NW|YxRc}5MNh7R2% zdr);LN2Oy~OCm>vLl`>b(Q%U#!gzj|;bI=u`j^`FR*;mmxP2JK&0LpMnOMN)*0oCXc?54(9QnuDskJ>ME(S~sp=UVvjn^ug9;_IqI zohXw6As1m@l^gTm1Y)%^RmJBim}seMp5#Q+i8R&d)nhP=!smJFrN*aGhMV6k;T~X@ zROIt2{cFxgt&5|n=-PrtCTuB_YOeR5x~bSvy}%9O_f65x5K~*`rX4+hXzw3hJ@O*` zz-Dz`=d7FNHwAUHB$Fa5Pi1lxr|9Ve`IoZI_dJ#J4`53B*}g(LCmSx>@BqH7go`w9 zi^ADMIqfjzt_=Y^EmTr+BZjlt{BjI}Y8jK}$wbo^uI1e{TSO>d%5ADv6Azv%D$MMEa5?eGIJOvOkO=@=7hv(fxTfuWLpJ6X7blXDI{PeX$V z>)D2BwBfW=lS^x(B}IE7`8}LD69&mwjyy+F9TH($s`8O|S7qVoJWi6|^y>Lu_aU|Y z2!ExZZGeMadNRn=EK_v~BV2uj;>6wOcuIIew00iH)26*WxSZ1HXY$ZF&HOe`2-AYq zX`yK@S5RlPHl@k6-Pf}EExclm{o=^pn;Jh5wbX54PtX6bAyux}tuZt7txu2t z7lR1CiyY2Gg~t8P>sxr#C=${NfYxWX?XEP?0>-YOeZ zmXXNmR4q!byXR-B(dus1A+?tlL}mQ$T6Nwzl*qbg4*ulv;ETJQ4qK|3Hs|T-r{|ag zs-CEfxL+c*$*x(nEtQ{t`gCUlf^& zUd*b-ZD?s6-_(RkM4 z@}qBFD)u{#bCN9~#m%j71Hl)~J(C>Xqel6gbk1qE^m181se|6_gZt4KPGFaKl5kWX ztGMULHOV&;?kycuqV}y`>;4WERii5#<}b+vkM0nDJxC+TZ}WSx7!G~Vl)A-u&?{b~ z{n#zw^OXX-yxRM7il~(pBPsnzi)Pe@f53eD6n9PfKEgOVFL%ML%5UlgCvI0~6)6Qq zZ)GJ4!d+MHTI#NEv^CWWSNbqTJju=uxCoJBwF_oQy%tt{nz^y}qoc0-$b#o6es$OO z2gF)SPQ;08=PG}N6#2Tit~X4zj)+?KEM?~QRdj2{%`F<2IQ(%=W``i;WkZd$(hEH( z=L8DKk-rCVd>9=tWsS-2sJ&mdzBiN6B)sIg!p6(0(yB=UdCkVrH-ar~*V8vIl}}Wo z(w8{9H=Ju4RAyBVx({t}l@th_N(jr!EIm^=UU{TP;pa%*ywwd-=xw<7bX?)zSA$CQVMiA=?CKqzIJ8(B`IjMw?Zl(qvYG;)~R}ha0XtvxZtUU-DHoj z5-6=*4lnAW#bKH`$teHTvkW+-xN)sWv45l|isM0bvg<$@I{&Qpf=g{YU%o8T$gaio zTNLdgt8;B*EQ@r9Iz8{(Y;?Tg|Hs536HQ6M;a;z3Wn^N3l4{y<3H|Y!Nq+YLR_Ey& zRZ}D70R^di_#S1#KRIi;PuWpS_^k|*&oDyFbwnB)vUJ~nX0L_lOWA{gt?OUO7z$LUc~h-lqfW!b>*)(sd(z9OKwDt zI#GG!YVScT6G4eDv2)}r6Q^W)a%D#!+;D5O0pk>^M;nz!-5jy2K=vqSN^8RcR%TEm zJwX(0p&@tvPB3s5Y5c4pRZ2@PYYi$pN83&27e#8*E2ciDyPP)f98)15=R}g=DJ4N?!heb|8^*sGG_UgcxoGXwcR#6-PCC zJg>8riKNUzjedWYs7jRwBV~ML^*}UEQjj+66=zaFXvACa+kT>veA}vORG7&2Pwxqv zMVbX(SS{?cDOaUyzQX8r8trL{3D2&aSIBfykE|6v#e4QgF&?ij!TQZcio8dXNT{3A}YJY~X?`)h5XT1u}pomji(RrU}xpayGeO#3_Y? z-VnW;KRhs}s&DmKq@I1Ro8ky57RiR#kug%X{95KvYq-%Am5Acdmm&#=3^#Dq`6uHE zv4$!eh6c~vu>*@MlZiAYR&*fw@FN~17j~l9GV?c62e)x{q=AncrcmirqfMm~$}&rD zgrlKO;t5w}JObprKqWzsEnB+V?y5X^!2qw+H7HkBa|e}D8I7;3ynnnfO~SKV(zY0r zzbN;Xas*HAw!3dy+|3gh(Lb!2?rHK@J{%De(!$VTJ9t_ei(K^rJB6lOF1i^!1osX`c)l0yhUO1LwiVZ zRH6Az;ogobdNjH6ReHJi6cgDoP^6M;m-VFB-CZ_(q-4!dJ#+V7KlK7_L~yI$H^9w8 z?`u|9VENPyLI*WIQysl){N`rq0!%Te6if!*Vf`gSO`IpuQ|9YD@=k34CSmz>;|y06}-WtHe%Bn6QqCx^@^#$_~SpiWS>92aIrEHs8!C zv^;hN;O-YExOj{FkfuRNd^pwSsg-pMbxSt)eq*lb5F!kUV;> z*LFL{(fi{*#tp;Hc{pyQX3hE9hMzB=*1;=13pu>SR~+xp zWKeO{z3*w0n6N?#7--)Wf_mZDd1mKlLya9CT3A4u)elXh+q6(Uc^15Zpd*L{I0xZu z2xChtLsgYjq&?Mik381s3FH@Gf390uV`|zSA`jDT?@mNa>K+ndqtZ4eFjJ473%!p{ zGLtcR5?O&G!t(tuAILB@prtI~VQ|*h0O26xJ)9swJWBC{k z!eV~SrHKbA?wck%lwdds$6n-dtZi{bkp?z}aP(AM{;wz73AxrBTZ>_Ub{yrSri3$Z zR4BI<@&%e+=Fksc=XI^LGAWLWM(aVGLzC?X1Qy(m-{2$4jxHU8sheA>T5w@%COm(M zx_&D?L-g4lN!9c18#clm)|p&&=I<+%`QCtEvR|s_lcB4xD?2cE1b2bs)}^gC zC_9uSQVXze8V{?KQ6}pEyz|+r+z+T)mF(W&O>Hylc4M|ICLQi^bKYD_RU4N%p zq+o2E__LQK+Un4x?@s!hk>bW(mW-7XIiW2ySET^SmUg?+8eGNp86dkaph)y1Mh?9g z&ey?%q*euGag&sZ0+i{{9Th*utjU80k$Q{$ptsUc1G@?UqNbx&DN^#it9Qp5$9{^x zsQl%Q-1O6S_E?z%dRMh*bJrz;F;;%*`@xP})1=`dTZ_VH2|PV%iDDxp9o^1qklflU zWg=(H)6wuV!(G??8krG2@^O*o&$mgD`;?y3i@Z^UvfBQj$954eY1mU~SuZrnuR3|Y z6L?!mS4#vzq;orW#2<2D9hB9eYsxHxW@L(+?9ft z6fs^F;_mzqA}kN@gWg4>4D}Mq%c;gH{>o$=PJ)9N4ZsQPWhj=&TjMQUgnFbz9pZRj zQ%hsZNUGBLP8ho~2mL;dl)F`OL@nS-L1_O2Rhhix7!x^%is(JyuUtrJkmVK??drMi z%@x7oIrP7bOtmzfhka|qV5Lm873E8zq$r2uD&aScOfu1~WJALH75&i#eW>kZ#VoE} zc@PYM;AY($rj|o7@=z`U`qxWhqN72Ut%!cauhD!XLTP4>yjx8FDj~oJ%krH z@yRNY_+L_Sd}#LM9jiQL3XR!$C9iK#q|^T`T(o7uiqxo}+=H7@(Z^>HS7L0E)LzW9 zgsw)Iq)K1f#$2NZgI*@Q(`(nsY?+&;gjXWof~=i8OobLuOSqX51&P8q&beac!xfS7%3p5M29@1j_<3mrJp%USdi{#41jr*> zXSpgzljo;Om>MVR5!XRR%k%~5uSaE{Z@6FLldcNh;BJawA33qepmre7#2z_vJOsarlN5e_M^NWC zxwbsQV%RA456h1ukyL;f-wxxjuTviJ=$xdaDPwuJML~Up>QHt&`XhcwA7bWSDwW}t zs3>FG1eLs-2JGH)v3*Qld%Lor|2n*(Esh5`tfN;EFWfYUvpFeoN!x*nd48QNn0zt= zQzm`uQOpK-GDz>y+_J%OPBtjk^0OrQ%aEyVF48vg78-H;T~POQsJZ2Ky`jb@gG7!` zzBSLug4f)D;4?L;>3Sk5;|hvB6cxE@GRr>wPAUavFstYa??_OXRtEM`Fzk4Q7P8CR zfMTQtPniNQa9Sngp5@!iNEnW_6_qI3ApF@>Puf20-FHk2o%$P$Kcs-z1Wh2FfZbD#q->y6;tx=mc{3|TLw(D-EG`iH~G?X6UomwWth{2VF$>! z(%H{_M%}F0gA~t}(knAei z)-%Y5dIDBZ{*v*ZQ~wUhqbdC7!<)Vg$xK@F^d7AQ!fx&Gdl&Eu_fQ#|$8ge1yLoM} zeg&?lpc0HTiBX$NnRO%4xB-*=khE6@@Y=4Gj)c2u<ShG@c+QMg{FEU@Zze3vnGvlCi# zhvMf)G;~K6b#t`x4#)e-tS*D0BWnI@aFm|$hSOp#R#uwB0f6vJq?rXJO`&luIOrOT zPtQ0gOeJ6y#pTerSv!fITr~hp_3oNbc68I7u;9ic9cn+cD@$I5BR>ofTrI|Du2=Q* z?5La0>H2vtTC^!C12Fy?6Il{+M}M?w=6QM`!hB4=-@v&D)?)g}G$>=y$Vu==SDs=7 z8hgAlcp&K}Ho9(!Cdpr9E(0NK_O9iiU?npe8HRGY;>3L@F}`V%@)RXd#sB1Bf-Iel)GcWpHqu<<_8wHLqH=-LKGm|&kq3gk zI_A51(=n!68O{Cp+Tp9^+@w$~wK}Rbz@i@!Gi(n@>uyV{iiUxM(23Suqq}+Kpn3gN zX@GDyr^Ak(;xf#iRVM#NEWhacmU|e;_#j&?&7jg>@joozw!E+F+-5JO#k0-^E;P{a z%9KV`na{D;cgV&raPtiDhijHa3I&nBPFsIgP%hiLf2fg26Uf)rhdH23^$F+lu!NTQO z!E#buyr-fs*njKOs>o?5&^MpMzK-oCauScR zK-n|z3Pck`nC0Yg^EAGF*&=L`o-3!MT{FO>;l=h9v*`UpiNEiNG|HE+MV+99Y{b64 z-$EOd9FEe_Q|IyP^|B?G-$*ecol1R`qnx%U@L0V~&@~7V#1>@F8_|T}+>wiZUovaY z=tiEk^O;~t^6k^E%glf16n(69XEpS9!a*P(YD;eU#7#2PHgEZp$CkZ20Fr5tZbZV% z=1b>T4egl+jdW%2QV^zm=+5lqROyiMPW=Lp0l^!_I;{JX)6_%8JzeQo8Nzh&7FN-u zEC>9*_PCpEaG$)|PGL)D3()?W#`Y&@dMnDYQ&F<5g!;BeIkn{j#*W#&P6CN}Qd13E z_QpxgGPG0g(LJCIKKiQ}C#HtRcIuc>H{MwggeWk{TYFU+1b+_tDpDNra)_R6+^%z_ z@bUA2VQ)YgZ|n1Vx9dGV>&wsgdpl}mu7$?hn!jd-E^s$ejVYG!_0`~h#DuvuJB5Yn zmTY_7?Zvm3B1;3#{Pn`hnKH8LP))6v2~ScS;f4GI7PIq>Wue$9I~p-bTmLC&f$;}o zmP!s~{Em|Fmpee9byH+B54;0i#ZKYRuY2L&_|7feEA3>DRgwz=3}vD0>z@M}I=#cT@;`zEp5$U$hh z+2!x3LS4^bci+7hi4sV@eyjTuTAH23b?+`PaUkNSc;CtEB1A=1vl_~JN9*^6&Xzc!T=$OZ~p*CxfsxJrTjD|`f)G$3w~j5 z2|Xi){0d0MoJxOs#=SG~+h?juZzwSA;tt5Sp6uD``}TJ1V9BvZb@n;sp5mR)4u_xh zW}UUJ#ND_^PmjJ%KE(bmDOy+LFR2VtmSlyg$LelpC(1TL)osNcc5?{};g!!4d`Yac znjcFsH#KW3Sz;$^#3xA6k&{74(9LM5IUXD733A}~juaiiir*)GIX$-??y6h}*AGe) zeS!H)eo29kK%JR7xnk(~H2Pfk%45q(jNnhsqTAz4DfMGUBI0Gga?&NWS%dAi`wAL)xI>aHzksGF9hL ziC8!{-P zgPzJb!Oa{Oyh}W&4b-|7SqwdyLle8`bB%*CLVHtD{Xd`?6OB5*_0J?-;j3+fM-C6HbtphMK0o{PKfBtEL zlqPt_A2qkc|EAj*Aeyq6X1kQ;I276jf8=D*VhH4!EQemN@RkYg{i<7@J1w>Cp^o2B zSG8UzH@)-u$O)e-vBP|iEO_GQxA`nJ@FH{n)pqpztI*v_qDL?E<0t3Avjzmg?Aw!% z5wwPDNu6M&#u_3$f^zhIH$rni5}9K0uC!W{S2JK+DQ$u*Sk`?5Utf-_`xELJ(LvhA zTIMq|51QV7m&8`gda;Dx!1z$L#swZGH(;(X;3o;Co6Hg(#4WRvU@wb4RHj;%(sO$W zDp>gXp8%KZ(i*P(V3`llVtn^%ikk-OEDG`1Q*8fI_YLH?B%{JNP4ex>NdPY%a1qq_d5_X&!h=gzk4mLbW5Ej^)@d?~YU{;ire{jeZ#D~XK! zVC$)Pcs1cYD#X|+&I!S4XwZFee4pgv{48QUNbqc|oE(CG@cB$QvkXg5I=tsKm*f}R z6Q~j?Se~>Zo4IVDU<4}<%1x%H&pP_*en{ZyN_%6q=^5yc`A0LXeE$+GM3%toZS-9w zKxc^h(;iZ;7(t95^Js#*YCqACyLKcE?Km`38Kez?NoGJjuq^lWv1_%S;$0zF7(f4L z?gH#Ay3ud{EdV|r^K64S*NBC!OddS3X7M*vCf1x*+OSXZ|lvDUfuXhs2* z44jDb2k7v|VT51)=iKH|T@$kC(a-wk_HuTxc`Z#YS$uO?6(x2VH!Uka4PUP(D_;e5 zuOrNL8oC;|5c9GFLV9dyeO_7kUSbr9e$U@2H7})etba%0pB-y-fEbv~En^7Cj}^xQ zLdd(3)3h!4M|bBVZ2rQx4D0C0Th=mN>+uqEeICRpX+c5*Ig|MiJ*MF5bqc+E^7R%@ z6q25tpp${Ze<i6YRv{7)Q-y#eE(UPp9BC{ii;G2r0xz8^}K=cd` zDmQ#I2YN5pMc&uz7wRuYzGd47xBH{SwzHvdlHdL=8PX~IJg$H0W=}1^^xog|#(y1b zS&$h+W2f@mkJ2+9C@^0=PTfF*{Csl`0BPwblWWA1VF~eg_q*?%q`LL&`3L9%rNn$Q z3E}Xt1sRkp0$Ak@bXRRKun8}JPUYeyJN|g(X3uI6f@~aOiV{1efr7NneyS>gu~}Y1 zPwpkZVvn5R&;;-EJj4#JFHkohkZ9{qpi+3lz~%fC2G;D;?{ncv`z)^PFwt8>r zUJKS)=6K#xIU4a3CMggBUtdoyrU{lOA}sN3FLj@#Ea0EnJ`494rRPYtHWL17{G9wy zr_Dwfuls8P;{-W$Joau5CLiA-#Gdnj#y|~`x zrMCJ7QAzIWZxqFz&{)}Bpw4{P{Bc>^QLwBXAY#Tjk~8Vw2azm~;hzn85DV7@gBO{V z!;^&101eDyZD|b#x65gQXU9H!QO4PoASe6q^MP-u=m?&v&Fi#5KZXGJzlI2=*=5#3kw!og|ln2r>qJJ=^49DdD2GI8qC+i~Ir(xo&W6o-55sE`f`Wza<0 zG~)xuOUgFrNAL&0qT+Sk^Y2 zPs>UAF1+lOixrBoR z9P@mPV0jomb33ti_zfm0S%uF2HMtVS655lnO2HHCvhF@;^?NTsYNyKf=(5^Oemtlv ze_Z1CYfl6Lpn~s+z+vUf_-8HwZdei0uA>Pj7jVsjGH#Pd55=io!Nnb>bYO-??El}b z09}2pf1L!p_5=;<=Wz!&nT>s2VF#e!gbYc=gKGTI-pe%jJ)1bGBZfdS_x;2@)ZP4G zS!r`7px)M>L{DrxgEyiJdU#G|_7h&$R$6Xn{!XA|u%oV)gSrQpx8H&+KFWBP6vN)* z5_O&?D52pcS1c#trw9BRPvn*`oa{+Z>PGQJ%3yH4pfg#a)8;_?T)C< zs}_Z9Lh!-Iz$>6;AwF%NxnVJy2@?N}PPkyjW!}vp_~RebNnb^HW$XdSCRv7b@$N9e z?h5#sPnontV=EfEuanKFZRM3O>5R)G1iWO%1#aOf`MOk}CU$bVsuN>7K2r(K*+A3- z@ocZtb9adBs{2pQFt0G`0VrvY&$}DMhaF6b8>Cz; zzjRLv9-{~j z>ftI$us2e~jW0|!&yA{(GT7BMJWokgr_NEd_tn`ZnP5FG-1BAka(Wa{s!Z&gd|T>* zGU5?VVv|x0OoEP!69SXb_o*9w{;S6npxyX{GxTC4Ciij0ENSy$#AI3wG#>N;6?GE( z`rgDE;-?I~$G5P@QN~7gM6ZQc&bzA-|4t zp_xD1sp^ZD97=zyy}jnqWO?}mXtr*4FNfCVWPcm5n#vRc*pO6oaXcE2CdP$IkrE;w z@*c>ir_Y4b1a*HfanJpms}Ip}Vuzu)9R>Om<|Fn)rCj9B)D=LA(;m4I-m>?9or2a* zm=DsucF<^!gRh=wFr^9LXy3~}KjL9Bddbt3R{9a!XMPj%`1G8fa>DlM*yCu7-cOV$ z1mtx9Und|x6cb*d8w9_{Bc7y0(6tkX!3uXKtwx4*He5zc&+M&lIU;sSd79^&#%iel z#HH*?V}1AjNjy!^tepfD?|v1Wq@wS~G*@vrzJ;0H20PBKNI`{LTz)hY8i#v*YaBX*BRWKKbMT1tapu|_TC(jnFok;mOxqeEj0SHUGLG!yguo%GZ^1- zhfVDODn!!6wgJ%uyhUqMO?gF)UkqfUu!?*Nw9d|#h(GD#4`Xj)!~Mly4`uKO4MKlZ zHq^D{9IlngI4H*?#w_a~9hCidX>WZb z&%A`8Q3q#Di~LZbgtJDp9z6t0lo^Gp7c9Ls;393fR+r(l#-mA*BaNRqk$*W9S_;HB z1jO!Vj#daqWBYF=NC9VxaRXwiz1Ona1~c>TGvJL!4^;|N}mBBQW5Li7;B_c+dk0d6xG&_ zLVmb2~K%#lGr~Nlnv}96V_zb*nplq--g;f{26Ha2r9!^Jp z+}B(-4rA4*b$j>GS(&j=gW#8*ElqMhL{CM9H8lkNk&KEKtGfq)w!KdheJOydQxtTy z>EgI8ddtnnPof;XSZB>;gJMcAKvZKLsJbu58S^Rx!P?vz={%69@!~YF69bNf`PTC4 z%*A#IFHN2B^J6^7rwsfk!CL)E zMI3kIU56145TI;}If&p4!T7H)wK3n@3=}gv+l+Gd!Uer{O^k6?rO?WEx#e^F6FpG5 z*c=*=%^nZLyBlwF-rND&j=m0xu!H>E958$B1@4Zsw~USaM)52)&H0=o#PR%G+C3IHj82jJ9Kq zNQs^;ur1{!aOH0cfCK=&U48ff4*3-a4J-Zh2fV?;@aF zAMbwl7{~&@sP9p+h5XFDyJ_K&Xdqd0S^>rMYz1u8ryOW4JM5pfd+lpE9B*nd{ng_i zym3r!+s+cQ1dwlur=+zGv9zo*g~4{aQ8}E;=x1=aU`8 zB2MC4*4!g_kl(jEOaV!&LF=wU^QSvsVD0vakEEfM{uZtEBzv1Gi^~VzBmr-wq^nuh zjxowj#*Q6l7NnxOcekCsyaCYul)}Q^5hd&{XXJa$?AMWni%bmWv z!K~Y4npLrh=il;RvC;1NK8g8tIC#0UCAyKGp229+Rq_3>5T8?n_AzUJs}0dZxPZbXfA^5`dX|*)5gKWzN5YZ)pAcwr~^*USP_wXb*1bU%u$K5<8xACa&19V3N z&}D8XMuQw`Q*6Z>r6=X@@_En7-NNw{n`HT*NUYO6B%Qz7cFa$eR#YnVvNwdcGGp!> zL2RFX(&Hk-ON`SP71v2H%%Yw39&7kwziNkH!gNe`RXm@ObzmAi^3J`I!TN%y1a+09AX4ohg6Lj?f`rW?fSstDBpxlbz2YK1# ziG{KHGS=xc)jfN374#!Ji;05fH-B+ipUun@cQu|BycC?(T;pMUhqVLFT>c@A%l6ST zdy6Xd9=&^q{Nl9tm1z=2(EN75-;OT%U=@K2iG#e}7SdiIAMQTy8{T*{Ju_*89J)j7 zuG=gh-Blr2&PPa05W$@@^LGK{g3##v(SdINPa;8I{SITPWc0~9n z*_F(A&x?M;Qg7+PY3!>P58!yQ*_l{f#-xOm?vIx_ymg%_#V$A%r;~kK3m!gK;Hmf-@SgaD9-~N1(HXorTp4B#WiF z*ISA73HghIx?o23O~a7gB?Y++ic6%LNLiI_DGE$?^PG%?1C#|gI`p+Q0`hjTrEP=) z4YE+7<7qkEA!joP;gli}KO}`>SY0lKKN^f@B++u~#-}UZ9CiyA^m=gh-XwT=H|9WQ z711``2Y{v?dBuvn&*H+^n?=*@tl%viTI9O`qAVZVN)NUw_iUvYL; zsE%_E2v%i?wiEJ$(xjY05DZ=2{`dEQ8qFg-AG&YKNkEp%7L^3Nc*j{jDCW(V`xZP4 zt=YMoJ?(S|_~x;6ELI>kTLR}?#Ic7FPJ-oG-k&yAV&nO@Tq%@R0uHrJmsiqOSiwej z;^I3Fv8zW8MtWQb+gG^&jx06z*em(0^-s4s0HzySsR&1Ua^76vhIh9(+ zL4H2-9=IT8;o}ezJ%?g{0N0Q2ET;X1pZ|0Ycm9WcwR4kNmSnwiJ%A3gNH%45pcn^!{`7(Goyk>6Ebn7EP>>x0!yfvokNVXM2@QfjmG?S zg#b2*7CrcMMtm2m&8)744OV3!xz{Ug%=;Rsxk~}HwCS46I>Zd^FG2GkhE5&4+seIP zS{_>EwLHooq_8UHcICr`Hb3LUW|m#rq+{@PF+PnZHqO9mUZk^m!$sB=!gv6*{kIMS zkn~M>+!iE-LM(h{GjLfm&)rGt_b@qyfc$%x@tz?Lx+=6lH)cV*v+PT4gV>31V|su+ zILp=V|Ll=!y1?SXy9Kb*DV`Pb_QO5*prI>DBk&(pI+A4w`>Rf{D z@Y&N1;CR*f1=_|0L(em>j6Uf!)F~k>Al^mckWUmbN`=k{FK_&uG0=gmu%;$pz!R`EkIB@zV|VT!yUO`yNYCK#8{_dhSLMPo6cwcMjM8P(ua zxOXWiz|V4j2I~@>wrFII`8N9mO(tj~*KBCOEwg|ap`K3AqY1>8g&C|0G=_EB{vB{= zeOWS&PxpQO;G?V8KCx*Bxb@2oE=_R7^aBtvOk0c~`re0u{V$A3Wc-i6xW)2=GG40? z`5z7j=YaVRAhv(?li7v8HLH{B!O4wU(`U6K0?Nym1}w%)#igp#5+ghSq!bnv?`@6RDcqz||7PDHvT*dqb97DJgL z6|7SH;m|@scfX){!VT1;c|aT9%i|b=q$?5z)C;rGn#O%-ek zwfq#ts;YM6#)owZ`Z9Eq!1nX=Psp<|khjP2uO239PPkd=yktcuj_{@4-_GR}(_XP$ zP93{INeiX3Wst55igZPLSv!L3c{j_XsMlSdDEO-Fx%A z(*SQO$PL3PO-6+lthad%fV}+6hDBYE+fr{+uWp&yta#`!u({`hqX0!@EDJ4A_~p7- zZCg46SNb3!DnHv2%w5|W-FM7UY}_HBZ0Ho1Dfx3Jcd(w$jmUuz^j&Z*vq>P{O4}=@ zxC&G7O>H?!{-bpv_!Egz6OG_Y|A!Pe$0^))6#M?o?p={?6^*aMnvuu*zStT^dCZyMR(74sQp+m5lBC(bu;h=?y2lYbuFB)w*RX24|8FnQ7*Gd{Iz41Og19EDZ2xp0J9(o?W|`EC87MA_s5>`ciz(P z-*=`y$YBT4&VETZ>bgJo$qME{~WkLw36+*nSV#QfkdJboVRDSFSH!-*jW%Spm3 zR`m(4tHij9d%u7sDEnrSGL{3RTR=kpZk{5-2RHnIDHiwxw` zU^pd%<)Z_{6Nl_?tx5rYIbb^CAvPJ$iESi&HZyw@&*%iFu=Zwlxg6$USTnFuuvu6Z z;b0G$oesVRB;)%)MDf4bYGkuPK1vVh1_gVEJ%T1U{-~WK5bwCu-Cvm2FIY?YS@-26 zcnm>j3A|fyAb+;Ud68cV#DBw2Yu=x}_~u0ZBc3@X=2iv5Vw{!UTU&k(2n`H=L%6oh zg=v?*aqSJ^{rEaiUHq6SD)73bB$1nS=<$%rduHH>hA?($gUWd#z|Z0-+=Q-(E|YLa*yiKDhw#e zwM=m!#PQUV8y2Zjnt|qUwH1*t+-(RcINC@m&Gj-{cxB-?zt}Nvty; zF7uyGpwj&BqfY9B^y z=~fEZ%$ikgck=>(BX8!?qBdayn&!IVK_0JM`)V(r?s25&u^PN;;x)1=`EId4&*coDV_d4iN_yjmG{Y}1>2WPs2SQUX_TgfztgkcFdQ-rQ)uH@;+#K`l|na||DBbth-LCvO$omQ@HX`!uL!()cbXz0q z10%5b-4_C)9A{}Bqy9G~(hg7stbh51nD2c_HpquIKIx;9>IKifo5RZVVw#t3hv0~kq20}6^H^-7_u9@AUQx!-o^QaRryaKFzJMBy{0%QW#OY3DZo2|rWQ$3W zA^3&=kG(H{hjNYoXPU_v(ioGa<%G=e#7qb!En`sTVJwdlgR*7Ga%`zir!o_=)fwio zD@*f`N>P(grx2nQsgO!iNh+Nar~UJN_xb)A-|r9Sy1K688s@q0=Y7An_xl!`{GkYyx&sJ)j;)Ac1H;5r=lse1qPsTqT#Nh_wbRiKs}a{r|8?tQQRd)hIqi;hr-p&s(a49B zH*$5uBXSBKKcB77$0b5Hfk0+P_igsh4d9T|3ARJ2gef13pB>cgYIE7jDdmR}NbuB@ zetH6ac662pB&C=e|5UFHb$?@-ECCpGV15V#wvuP=Q+h3WhZMVoxE|MNPpsl;iC+PVEp{SKr#CMTQF2rh;d9| zLw~>LrCVYb4psjL_LM$eENA3LE*T!vYl~a@zyw58thuONyK+A&eJSfTD3#z_THu*c zLlAV+T@u841x2Z8BO6YQU4R{p-ZBVp3+`XZV9Gzo0Tsk&iTQF6|<+*E;7TAI3CMVQ@C1&a_*8cTa94x=AYR$4f+HhAfT>ODWEQ@5rsxu;1@~ z$UzA}X7%$RRCw5PrKH8`*xZ(o_&gj|+{_%f2zwa*3xOr@ehIh<-fikmOcus9hwq-) zYKY+t3@*)|PeJ@Lnp&~gU_O5KQ2U>_oPLdk_}>GyUk(V>H7B^0I8u^|fXIp;fAVXG zhFhjC#|m6WGg0^SA61+*D8oK;8f2ZG+v2b1AQ!g<`LK)znV)KYzgA2}Feq zXKLGds2mt$LFDhzX_+V%!r-V)hW7gSGmj}7pza%Y0FjdNzZ1)vE9gU!E6aA4LN&DM z160^htOgn4mA|N-R}=hQBYdWO!WyD75Xwb@(x=l92xTKHm%uA`i38-2b0p9Ks=h_M z!{jf^u|mskp8(+Mr?jxcGtTTZ zWc|E6ct%p`X_tMWW+*1p&5hXZ#g?>>$|r#L{ISyHLIN&Go;r`QK-W9&2Y3Y;fe*hE#tz!uWtaA*P~=3J;~hd$jHX)Y%+otW17(ifaxp zXX{-C>{CtDoA@_awc&ThuWi82fOQ{m#);upV7_UR{(>*6YO~I#+PQ+wso^L>VR0rZq@ zK({8Cmz#JM1Tp1XEfcA@yhMJU$~?1C)*h>npHmN1n{)`BR7TYcQh!PA=3>El)lUi{ zLOPDg{I2*giIF>Fj*~hA1gqoWyM=E$Z(6~2-m z%;P5utrn0X(%2sW0@U%c6lYDsGi0x`U}rL@3i%-Ue&eU*1tS@(p(SX}ejod2t3xX|g z`@-|#9DzEr?)z>><923wgwwrQjLIzNYFoje*skw#aVlETCz#AkwD(|VV6jjS(E;jd zbS!;O=K4JVgo5<5A^HKkg-H|XU zSxIkd@6WFl2hG_^c9K6KOEBXm9}M?UAh`5MXdnFX1r!zX ziXqfB02+2rX~d)e?8a>0m62f2nDFaN6An~r_#zvkeo^ur1u7Bt$bz<<@LeL8VG9ss zxZY>=i|=-tGG64Rik3d$?w*QsJpGGCGUZ1Uf}F`q&yiK21$jp*W$qR^UFN~=MuyBs zp&q;ILV@x+o*?$o+}Z!9ZK|7-QNz2H9_1T5O|$}<3=;6H*MVA~ZoaH{RuHC@dmM)l zm#ACy4Urq~#smu0vJ^!0*(;zxRYkY&%#U>b?*nyv>WO&&`_zk(HUa$2AaykyNYvW! zZ^P9x?L6M)_uAUH{PW0t)iv4#yQ?=F-Tw(}4Ew>@+k)BySau&f_|C%z@;fQvs-PVm z`ka}=L07~FCcH9pi*h`+e~`?5gZf%Qg<^^A+tg+;nNDDu+T@|qK9Zl z0M(6@pL8fd-G_lwbn5L857SX6z^+fc^Ja5EJ$A`Ioxx6QKs%boE42^LxE%Yo7{q>= z4m}N77Q+ZxQ}-Da-Ug|rgl8D=FgLbWAM>LnyRL>hIyeYF@chRkK; z_*Sggf-GC%V4k69jH)|N#R|sx>$j4>Fl3|ONuUZ(HI9%XC^IpTt>3CG*2(IZEw%)) z-sQp>Rh^Q)C#{b4D^6iJv>7%d8{bpTPnWNCQw6_bdsRUxNhdhh_s`w%%^n}OAEwM$ z|2GakuZyuodR#W@BIT_(z5k{W_oeZh5#I{@EY}kHB=M?u3$H_~K;MrqKJ*(Tnc?<& z7PnTgEo+2CS(G(TN7=i~f6xc?-GG-*R+B}<>T|LR=*A85hgJTgCNkrv?DNFug!WzA379oy5+eIHx2PU8M2T`%n^PM z)bhuxCf1hjaXId!Hre_t4v;qbYO{JERNH+gZX4uGDyp2%{8MkxAQ;68zFcV6Lw!Du zXep!a=WWT_c#b~&&iCLYM+|B?2f(A(;!k)MsBp#R7>*mDetza@^C$f*|ME!L?)48f zRQ^+$l(Vq6lqv6xAorkK9oeweZ(*9>W zvaxr0KMuijClscNO=0hjE8Cboh)i17rdI2c>_KI5i$q%Xk%EUdK{QMj?UD8k@i~$v zR(}bo1Du#NlZ6rS4_n2k$Kwdl6)%xNDl}Os*}1(c|NNNu>GtSfeu+ny6@tz!{oKlK zMx1*0+DsR&&C+=wzB&r#R{rgix@~ag{I{vdLGMANW3KPZK!;#iE5Z3UJk=6!c+tcr z;pL%VG$Fe7@HkV-o&V{RA{#OOy!bMe66VEhif8 zQVo7!m(A)efaV>2M=A1?}dk5X}uojA={_AZMzXr8+5g0KAMdD?@epjk2wP; z`f^rE0CH_eD~3}GpxQU?TfrCda_k|k148u9XOp9+3;FLc+q=_Z)R(z8^&9LJ9{^nU ziiB#Y<(u2aJ*dZ}!oW1qrrkOf!tfY$aLU%khqalGVd6SrN!ebD1@y6Fl-3DnyN4rM8 z+2Tizu@=}-gU^?+qff(I;derofO`uan9u~6ol~j(GIG7He-MD!&I&UO&pZ(!tpywk zC+^I}3bU`PkPVCe@ig$x{v{>d$pB#mpcZa7H|`=5ZDRuL<)QZZ)ZUglJ}g94E$swr45a8Y)Gfbasp!^q#wo6$h(Ixi z#ZFWJ%3&XR2ac2M`IVKamncYtX5^-;n)Qq+EcDm9&F-@MWeJshYv*=y+dwS8>;%Vr z|Krq53|xX%AaDQ-%f743#7lN-!)A9;vF>9mFd18#z02g?t3QE~$?wGRrxbN=Vo1eC z+|-QqmOW4F`js;fkvb9Q5}Qo;(4kZWb@vmI?wv@GeZ0nEEQo+!VAORGNSM@-Kpg7B z)v$u=!N4<*1Vxz$frb=J!_qzkqms2gv`k$e!~K9z!=nPrsu!TK1U|veNdl0)No2VV zihW5d{Mo-ya$^4;au=vSJWDLx&K|Hu#QMGFyyFfy?VmO6O0V8$!<GCTM*hLiTHLexK}rJvO*MR+$Ft z*Mbua=%Y{Tp{+C2?>bZ z=}o?VaXk6f->D)jwu}A%Nq#SeG`HEK(@(`KwDb_0qtq?(0)Kd**qaFO+h>(KS_3FoDloYY`8j4iH1d*2qm(o_mV4f_ODR-d9t~# z!{Sij&)Q$OkiC`^3!t2<3?^7m_WDOyuK&IGOr@)}iRz=*SlrA1s)w+UMAOAu*noVt z-e=2-+TNHk-U*Yc)%uvv&6me3X_&*k^;IuaQEX#tYL=&r>AEcl^)cg?Ii|H9+^o1s zx|fP>-ITM$IF+02a=glE6tinC52hAU5T>y~aQ{(Lapro)cbupPccmf2xg0dyTS}$1 zf~iaJ=jAjH(p#{s!MpW_iO8}%#$XVXqdRB1rtiW@a&|S@Y7B4L-8|MQa!<*%WtJF_ zatB@ab(WjP;poH+wGd8@7U&!EE7i}!nkxz``2Cq9;pQl2M^lDz1p#W3orR;sk?9B} zOeWw*Gmp>iyQm)WW{=8@)16p@oJA@#&QM5;Ek?DH5SL8QB(nU}eP>(ntXKPToGCLd zMd6e$$gXEaA$o{QvCn8p0bzVm(q6mY?a=QGik_2Z8!4}AtJw^2mf!Zy=;)$Yo(sYn-+K>kZiphmd4IN{!k#gSU0jn2r6-IIaO|9F6_$4_+gw%!<_>hFWRJcK zAW`%Y)F&!+j;>23>c34hmWDk}O3V=Qa}*G&(K}c9a_ed`l~>PQccCxwX3j(ui}q zMlq@68SF9{agQ}%^ygj7qx!GeT=KE$4q|^ddG!dtlRy$)X*m*RoV&Lj%MCVqk31ra zJXNu}UrJXNC^~+zT9+oSv6eMAWt$URhHHn|sd1;)b3{;i#ecME{^a0Lszn}NbIt(d zkz$f|C{Y@y+qSEhXp#c`J`#9AkRt!N!@!^nm-ngG=H-q+W1~JC?iW`Bik3gLAZvp% zaAxDEJq-h&+Vqyo^_ht6o6A+vAdtIlw4Vj?zkfuWKWHj%MhL1J7}*1Vc8eok^(J4!($o%|P5L5;E}mOLi8FKhyO568$wJ9a*U2 zmoRDypB>ZW_N?kVe)QFtSv%e&SjnJh51n*RCD`d76D6Y?PKSiiyHM=-6<~4+p;X_z zf|!&L$|HWk7*C2=T1)P*NwP0^Du_HXM|L&3DG|iSL#u(wjsgXf`E<~KNzDz5!~ja+ z%sR(eG5-O$p?|WFRM&C&px=J6+P@vdvMWAVX5!|XuQMSEad+5kx#u4zKK!*+b>8oW zc|P5`tyqDbnn!N@F>6Hd9uCN!UtHfzVGxH6j-;GMy%)JU`?G#~yqEOa;D=AFu--Em zE2yh?-u}xxSd;qAWc$`dByBv?K)pRwA%E912rXy{Ou(hB)td3gP~k6Q!PkJ-c-cT7 z`_nGf?;k98v2nD-z@;>7g=OuJtwwUA<(SEmbMLiSy~Oncy=f+GcMkM+Q3%6WF%5Tn z>|?#_;q-k^zMNyp`x>#@(uNliy)g#c3*9>RWPUrH~X8dXz!D`@!?q2 zg>y5<+Y%mau$gI%pk$eA;XodzwNHT>(xTY89YBmFOG%zxv(Lfksz= zUFa>z0+V8&{mt2c9mlnjnnkWoXFAeMdfpXj<2&k`g6WU>IaQA(3rC4y(M>Y~5{MB- z+!Cfx(NU(`hT+9SsmuEs^d3XC&?TE}ciH$_9EUl)?_v<>)~VZubtcfrg!)Eh02G%5 z5@yemrd1{1ImnK`Sa3p-xv0yI-i@%?@XWULH2lmx-eFRHwcEuJB`|?(f?q78u(=X@ zlNr_7i;?SJI1Vb*#CveqC6f)m4V z@}r)^MqMuE_>QPBYZ_i!m1(|3?qf5W_7xEw88II2mp#3!Itv8UGV3?x^>-K39P3|c zv5>Xj?$L`@^ka4n)PN+B>wf4ALDt00zkhPO*YnVYCNL!jA`hW-lbd!Qr4D*uP0qeo z?ruUBMSBKy6J{`{q6ZyQ7<3TE4ewPy`L@a@9LT=l_`+K|!i9u|3qulU^qD4FDPaWt+=m(F^%HF%8RxVv;A2<9Ee zeQ3b$xd&hCa>1SX#ZRWwSAN1|JLxSPWK)Dp&#c`uzpiLtITo8`)aIQV_*kMdLF`-= zS007B?^|sQ7H;TGlRe~btK$&H^&(eX{_lsi{J?7h=l2~3yZRz6W~c|4@;9v;K)G~J zlSWkVzsDgcM+%_rLzlgJ_(av^CKZSm$22${HpCl-gB@6=S-poD`0*P}#(m)=S*5yW zsMbUiA}EZ5&?I7ps;09z|IfWC1@g)W|(PT;p zK>>6VXMFmdE%WHB_jJVmj(!@lvk{v4u!r8MH~u+*%TFl7Ppn$3m=wlkD%Vwi~b|iw%)1M zntFvrX*Kc3H=LU7_76!ICk71ra}#fz%4Fbjw`XA}9fp9MGc{9Py@ck(OiWO%{JQi( zV+^#Kw7eOq04(+hddF#Q=>aiR=5|O(5QgKu8of|HA*sC}(#6H)Bt_>s6WZB8XEv%g zkY24W*P+8|-G~4g$)}wu|F2*V8QHYx-7769<4dxB2HC9WaXinyVmN|_4z}uDevio# zRr5#W4}E?m@OB=7r(sxa*|GZ2`+M&y)8o@tO_;ICXcC>Wmr^ zRl&(B&N1xI?~K}{RBqOfADK<2wnSrh&a39sA=an0Kmi98Z!5c3qBF4D`V{;-z!pRX z>shj2vw+@v^p$yLVi~jK_Bfr;Y5QW)x|&%vH&KFTGFP|FWZ%OgQs>v7f_K8aJ+$7aT&8p8TCF7 z@6XfXcaR2BG(<8G z*bSb^lH32IL>WABecMK(6+P%iAK2vnhIGVtH`hSv>gijsqjcQs?IT^lwG*Cgg#iaX z5}n|j%l>p?$vs#BQ_ma-C%}vrc!_y;X`V`isV|>m^1JJ7YT6f(PooXF4aK6*=pSaD z;4IYNLa;qxRc~+9yD@Z|;La73aEpnc%4TPSZuw^}wCBqrD;!O3CHJQH5-JIU(Z; zgX>rgN4cP33Z%YQUy8gd91xUi82wbdUagftQolf)EBbLDZ0=Z)$%J9fzxV=V1M!Th zBtEa|VJX0uh8V~Pp{p*6)jkn3{C8)&Q!XNcqhC@@Yf!({N4g>odOq2`PTkqyhkXtO zS@|V<73dMBgY6682%+KG>L`M-sK$LcX>or}%H=xaDhsIKSpSW+pmBVOrk22m1E(y@ z8cMgA-mV~)!5EwVLg#HNhWMpLhN?E)&SlT)TGTA^z7ve*vt+=VR0VOl8C=TT-PCxI z`!d&mCl@Xy5StlZ`3{qt^8f?OVgM}X4f+Su2MJD@6G)zRXJ1!lk~f^RNFmq)_9?t%O1c#i34GsP;;bySVbrk3-#6rgC4akO-+dLG% zcoeJphgynq5lQ;uOBhi`}#9LDK z2Qo{LR`orI?As3~r8ty$N_BS0KW+RaV2ONQr_!);Nb>OUV%ScyTtD-!^=h-YJjNVE zo;PZ(<5sEZjDSK^*4+F)*xX(3A1>=#&_d7UzBG^w) zYE2P(_Lsmiijl+r^;64%0UUCEE3v38Qjix1CX&Ev(rgWrIR5~=+m?6w=^qh69rd*H z@My;2Pu>54v%`)eQMAhLZZaf&Cv=-HX9Q^HKGqvEyD<$JrjCZ3m(r5ZNyRZWefkeb z=w5L67#WuWS&_a9`T()aUv0-jU}NRV`iirr1*(~38`Reny5Q0Xm1unl)-~}Arrjoq zpkIWM>Dco2B;c6e*~`e+b{Mxjl%#GU&eWJe*cp5Ko8iaaNkx9op(ZlOHsOQ8i@`eE z3?g8x#t!7SP`X0C)m5$f>@j3r&d!x!vDmCNNFJ=3zN=lw`Tix9pXV#nOtr<`-WjA* z!HAFSH9*}q_qW=zOf8;tXyeVSB4;3=J7T*-RdeuS3JAR61-h`a3X0U$r&i4fCyWNc ztb+MtpGQH+eyWKTWOQiKToayxp4WC+Z5|CPbWMRUg6h01SFdHmW0cAto8lbrC&+mE z*rE0IYAx7{YY@*TvI6Od+IlA2M z_!-`-;<~I|@uv0rNL)fsSfC7WY+VH%G1a_Q@9^nFeB?e5wOsOaAe?PtmzSU(_ypmb z-&<0t{(8gB{^)kSn>r8lOQFj^HVEDT_9CQRCnjr!`tzOr&+ZjDBCKKyU58@F_x-xR z%*BFZV3@xYn$5|>E-V>=LYn8BD$(oN=slIrE9w!z%;`Gz-k=mIJi3$%6X=S~PbI=E zg}kTR;;*9=#O4mnM~%p_r^|0}ptUY%Q9a}mk)&>*DpKj7ywh^sS$)ycf!$=`D#VIJ zF9fY}F;q4Yik^{3^v24vVvpYavI`6`)EwU1V@;QO~YkC;7uct*K7b zeMf6&mSV@zjOT{TJXdeBHR#o!u?C9^JfQTQO#l(}d>f9NakB+f=gq|4H3sX|4@RK@ zS!+PQEI2D>wueq&E*7RFHG!OttS!@w%|tz;E|U_GZGw4!i_uMwEBG&V5#5FdScrC8 zP);5Djr6wY4OXzH#-QoWSGCDM{?le5oWgAoFk2G^Ueme64jL94OGkn~dgH_mYw-WU z%fZ5fA@%NY&&D8p2=(1`G=+r(-=fo8(R=EFB9F$1oXYiuGYF^P$(`rcF4{S=vUVK` z+bl7qXk}g@Gov1q+$GH;l6ac1f4N!PuZ|%QsF!=V~@zXTdpZ!sNr<*34!! zAX$xu`yN+I7P%kdq-)a9PtT$Gg{Y_}SQ!)~6gKRobt_3Pf@Pzfx1BM(vfGDQ@$N|n zC=IeOv(-%EIMVIBz2a)kx%gmcc-S?nGUHI)NT!MYTgxNZubz_%RxF4_{S!Sheqnxs zooon+74?6EwIObX@0lQB1!fIO@{Tjpph>8OW!%(ya}YizX5^{X=7xwKTNtE;1>ab$ zddL=ucg}_u8_&nbx{c}bCx%tGA)f=2mI>SobIUu|_HL}f`gU2o!43%g`0q(gGkJV8Ahmo4s7*T zV)zL;5Kb6vfrR~v){Jb0Qtm$a;uOsHSR&z^Jczy6^*o1_?ResP927YFG7chGmT7D* zt=#V%w{2^-I!;szDr7GicwMjw`HTO{NP$_TNw~68NiTxB4MI``b^SeUti28~82JJF zRcsMJzj4!Ge?VN^^1cucuK0)Zw{NL8NVtSz+!jw|>8}CpoFadm4AJDGI@K0}TR3cH zCUVKhUCk_&au6;0&f*@_54HgxuXvP713{@VTD1vtfxr)9)$Zi*l`wzBECYFPYuFA{D(NRA=9uQjVM?Si3Xo7}nUZEh}oIo}?1IC~xqSzgXW*ax1yJEDw{K1Va)HE|Y zvY*FKqU-H-T^H@lP3fb6XAiB0i0dYXTM%e`($OpDv_WWhmDwBLWFevs57mE~p^MF@ z-{USR+qwe7kJW?Mj2Asq>jbpo&dc?Vl-6w;2DF-)Kz1#tmXz{EG#L{AwPvUj13&Bs8(?w3Z>a3{D!psvbCwTtoEaze583e2M{YWQ+W1Oq9I?Js!IXD5LFn2uYO`08e1tkLL6LXI z5Fkz9ebw6YOCL1pE1Lcxbr5DJQowlc;|D{(HL-Vti_()wPPSf52Sl_oXm}I*kx4Aa z?yNYK3-A1ZkcPL!G9Tjg{q$gv7+&5C(#S^rLXsc~o3{v}qIctSwXpPUG%x;Q-0b=OLh!*&4g7TAUf)+^k1}wM&aQ@;Rf0Z`^Gq~&o zCxT9~+8$+ICQzZ>h*hDGhA!DdVY@>2c^YDWPDwsOLeTr1{tg33z|WdN-CcI($w{3l z`R7o|i2QLoy6zGB+97rO?OSOpc|9yld9(BH<^F`#D0?FoZE_MsvGgV4qg&;_R@8 zcVe&q{kSC8a7aCKLp4l6$TFXki*k(Y<~U>=^yGHK4x|xhdj-?sUlGRB>4|7a@h^x>+Eq!yGc!Bll!&%HgPL=`7M~>@o>@cb zUS-iu9Bpk&LIgGY#IYqze9bh?wK$P_jD{WBrYvZJ-im5JBEvzC;7s{IJ>KMd*#pS_ zboc-E`tb2f|4{#?Sw<_h;Ah+lfEn7~aF~|=*cYq`b)o?@C?N62i}l?rR-E#OY0Ojj%T<^R!cfbi$rV3bJW!BWQAYU915g=CK;HLy$R;rcZ
e?mHhS+9#`^ntFQo32miJG*h1J#4${1C4k$kK-RGC@nPnkcNq$Z6G z$#q#GmP}xUJ}C zBxrz!fdauThDj`NrJKAi{T!89AvnP^WL8bQQ&?@=fmp(HMY-rhH~SXqp2Ej3963v6 zPQB8KBe=@F6H6aNxlLyVp|=%~v^DFgq-RG8{uNkA9o)g%)Jzx=Gk&ye9xvTk(*q!U zl!V1E^y!)|sdTp)x929U!R5V>Z}V5T%kZ}9PL=TLb^*NRbM#$UK+ z7tOE#A@4f_yr(bPc}%ujB7#oClp}ptpU{uYMH17+wFd@%)-KZ*{Bn4RMh#MdG&PWIgLt}KSbS2 zC0MjmIn3YM9(@(1jvx~+J#6hPa} zuG=KMF_e;KbS%dcGAO{;1Ug%|K?BzWsCwnRhxw`Q?drT(>}C2b9_qVJ|J&?bk}Us% z{s=_qCVUgm3{&`DFIP!J=TDjxYtf57bG*KupF;Rw^Vvk$+v^5sz*i_W$Dx-L=7Y#q zW>|9>vR@)9k7H`g44r4m;>Pt_uNW?WU=*r)6%zR%L2c4;?(EXX8X{`5LGI2}lB=UUT z>Keq5g%{QE^9$$RuqI3`CrMbic0~w=%OKk-!IzxyA@ye$8pR!+#6ojAx5#Iu5bln? zaME#5UZRR7{s{{-Z}iJKpp1ot_aFkSVL zi8!yO9rW5oH^~aw5b1JZ0LB$0=&Yt;Q7MSaaXzocAP_IsC-uXC$W+3(t{uPyjC)1> zc!WL!FZB#UMQ>y&lUS4UE(EoOPU*~MXM03|r_p?e&qx9R!v4O1CLDD7fw-7;0-<`< z4a2?{JpN4EOx!x1ng(-z#X(I#vLOjYhc2RTN!nma<&46{8D_^fff)3hhE0781gz&8 zGLB*s?<8%JD_3{i)kK`P)rAtA=~obkuC8F7eG(r*zn@fNdO>^fE>VD98v}3NW{49o z-+~DHX_$tnD7#O_R#7xv!`~sve`IV~ahCrYy3&ClBz8M9$ITcrBP9_wX#}G)W|}-B zT|(&4^b*08lYnMIgLi;s+!A!Fss`*2iy-gZRR~Pgu#{H1*lm%z>Nvqjgi66>>NNt{ zQB*_17Z0gwq#0g5sEp#xyW*rR6N-AXRpbqz3Hp$hKG0bjE4eO4J50~Ih6<|(29OX__%CXUXV<-6mLP9I)Ev#7YIqo~_Q}3gdJUXNr8&!73zvo-1pl#`txm_zD`9kwNbRPd!8$ z&O~l%91I84eC)Ai8C~Sv{j^^-6?zXZigSW?_J>BLIuZr^Q~j>(o`}m;dz#nNb2j=J ziqay=`bcXF!%4j9z0R~~Q8gAidV*Y`;h5ft!9?KE9bVALP)tw{<=u zE=T&wKSZuu8G$ssZsY0?N<`3hxQ%&SQRe2hU!v;#K7~ zMaHUv85AvX^ZSsV>dN&;eMEw6ADA-AZUVlL-seHom@1=KdVnLu!v~lm;h)Kn7S@M) z9->`us}13%IWHrMZE+$~jVv#)x1sKc^eM4uN-N^NwB4{yecqUtl_M`bTR@jBKD4^h z%_H&KT8XOb`#~5w+uyixR_Y4v+MQ?AL)5%w%lr*lX6F}p=Y=s~8vrOcKC`z0`Uyr_ zk$(lXnL3+^8*$ep{i|%^=8=gxQngLm=@3W^NX|=jnZ<_B{pGBCKn-=@7I-Za^^cVr zPxc2l$&|o2vAD5^VoLi_Hmbssk0m5d(SbQEBt!e%gT^3@y{PvGvdFK@@DpTwI7~3Z z?x!5cbQ4;`oe}N*uA(;B^f0-NkK1IWacq5P7;ZUfup9NRsOpb;QLm3TE7i=n=w1|e zU#LWVmYO>D+$PMNeON~4RqGv0h594yvCP|#RdsoCVe4j?Z?(dRU?0^Flm`r6&rR^U zQWMS_L@eHGAdr07H`VeTf{A#Eem=lgksk@dvm39dzXIMgb6!~;zZ9b+FAxpEA1+%r zdsrEh3C^68ihlv0=K9UTz>fa=S`+6C35mvDW>2slp-d=V{HN>l8#VXY~NVeY{t~;m#eD zv@jp1N0M)63;bbx`|>;x~)>+9h4JQlaWin47r()Pp*rVLyC zHn;7E<0Ivq*PjuAUj~9|^xY1sl}IC)LtuDWHKkyFR_B$n(SX=Fr?58_4X8Jpzm(7y zy9pPO7BcHL4ytyqIBjBIrH7SXfDw_jgeP#7;t%X?y5Y_P%+gKD&FDbH2j$3kGKxKm zi?~J@)dQy%RI6CZN-HRw`5JBA#4;G=E^G=D&-;Jmy9&bi{ ztqu?Y;pYvt+*NKvMHkcOLgcS1bAZqEw>+SS`=GThlm5qVSw~y@d3y{ zL@U*>;lx)_!iFrt>~Bv)w(*#R(kS!E-{+`lc3$~qbMo+`MnaMjkZ%DZDPdPgdC5$NuTLnlCG8O$wov?)#XSme+l}P?M6hykElHU7$>s zf7WUhVOJwc&E_1&3U#;lYSg0KSf!ncbJuFa#9|~Nc+NQzetZe2!z_)t8wi5Sz0!($ zcl~^RDkyS?%zyc(`ET8-mZsT^E4yUNPEt%gr{0hU5oVY$LwUc`gL?IRWM`eiHrwsp z!`&J+lMqmc+LaPiN^O)3e#Go0fdN#UOq%ji424OlEHlL)%E@YP`4U~B@SsHI(^bLY&M!3Q!YGtY z0j+ED5woy&pG}s~60Wv>U(I0`ITUT*e6~|-k4|ujg7)uL6%7*RBXd`p*g}v^K9~Vc zo;FTV5P$aB_^4qJO#0IhX zXv4tIMV?&5u{j(kM%}tJ<0!1DM=EnF1<~t1r(j|A^FW=yR-xt|7>FhmXn^PGqC;ZV zN7;MJTmpG3PHij$aJe^fy?z|(oy&l;mOZEfw^pZ2;^S_cqm?EVFMH`Vrh6p#*N+gX zDY$ckNMW%ft}yUp8UX`_Gol^mmy|8cbn}c=Hph(zz`G-Ipmr%JZKKv7W6ei6ubErr(;oBmeYOxav;4$S*<^4yKP$gDQ1#r zm6@B1QqcI~RPAH62ktmX@w!eej^thUq~hr7%chQ2s3Q=NofdEh+WDlAE97bqYE)kS z$@eR|VTO|X@!kz^Po08n;WS)x z!Wvnk#WLC64YTgNJs8E!y*b6Cg&a;}OkC3FE|^lL>ReYExWY-asUSw_2R}DIr)y~? zy5{nqt%!?@ZY%mn2hgR9ua?%Zs$aUEAF*%lmIqj>PA4FOj5G6lYZ9a9>0{mO)`R|) zP2?KABKyeU!l?mURdmGDa*#W6^tAK)ediSpj&dII!~4XdR^*oPM!QyYhf;boB04(u zJ!MiM|MG6mbajs%JnXBtQec8BC^nR}lBLA@w$3%o3c2^JMiwyS5w6RuVs^dmcBvHI z`H$)F=$x*2YbuF#k?=L8)(}b;LqWw-^hMFt8#<9BJoaQ<3OkD|XRB7w8 z#L~VWlHeD2C?loEs6A4Hs{Y5Ie!Hmv-qyz&EKNJRG1HcrJv(<|p~Al)=QSKEiH%3Y z9~V^$6i?@B=lb{bf=76Xl||~0tzZrZi}&x&)e^CvyPqv0GfK~th#y3*(cV2LLFPkw zf~@iOQ!I$I)Q=wnTm`QK<~TIs8i;5Gt5}vDX-xgHnq{tCWDi#)q)?VMJ!n#{M9HOl zln;2zTx}_4B3@(z8jx5Iwij1AvZ(H6e}0jLa)WDS!x;*a@EDO`h1$HyB;-RhU)62h z-F3X7-s*>O^U`Xx9G;S}C`_MY*mUPi{UNWJ`EQ^9W~=1oliezcDYP)|`-&e^dDr#P zqgpu34;+xcbbQ&mZ3)~Q6QoM1*}0~xd&?Lu?^Zp3-!4wU-jIK<-3zxW&LowUOk~rm zhXci56A_m%)j*03MDSgVjQn7N|Iry8DJBz+GGE5j=}#0P&VRA%t)8I!lB5vfb+iHV zO`2qlgg%C(j?wcCZua|=8|^5r>{#C)r}nzV!qxml-$rONc`o&gMhUs`G1*{&+g+hL9!Yno*u z7t6?lqIj!yqb&ACLsGwK&hRa&^#+fhS2bTqDb^WRDAhxWjQvY%1-%DGfF_1Mk+bK4 zx9{dpdESfkG}5J_dnt(3Q)M^r;eL%wNN)WTHAgs5b4fsAHY*(9uivZUfE5Uv zAUWZt^=Vw^QB+9%W*ET79;FGdt4KbHHg>Qx@TQfzKy)t_Es9VKSr0CcL;v`9K)AW) z!d%7XS6GrB8?xO0#dt!Ev(-JN7^>H#MIUoQ+}^Zk`TOhRLu@Y!^7yYHxUsFGcofSU zUu;G5`!WWtDVf|3Wz=swy}JD7{V_t}FkLgEmFJbTOuL&@S}8MWK?F^BYHzQ+OJ(x@ z`H?yC$nQ^0bRKY60}dtqj>#!3PRl|X#6n5C#=I^r^1#X(BE`)vWeY!UfGKf@;rck} z*5a2n*mO7{aJ`&Ub!V$3^W{*-YZCKT$TqleseAhXVH+cENX1H%cq0Sy@Q_GN;RXr5 z>u#df^baH-f{LZlL&~$ zw@92h)01BDw);9LHKtr{1+l(vrTR4Q>ffXB$W5Qn#qJ%|Hx7IFGuse1*HLTH-isfU zkwGzR|G62Ib&thyAd&iCFWIRWiH%GzEzcCT6fO2HaY*EmYq+I=3HpcTj(NR}Wq(dl zyi7MZZtvC}p@f%Qr-))&rd7Sw)=CM{gQ)-?`DQiC}Rr8{~LibS22Vm^J-eMI< zW!^f;tkGGg;Mq>WlUaJYE%KJ$P)UV>OV~$pjbY@|<#j6?=Vci4%XI2tYPN1lR~apO z7Vb@Z`7DFNu~Mq;Uff7aXwBw*UxSahZTqMkdGl8GNyPoM>-Dwt73cOWhLcfG1%~7{ zJRi`Zz#SX1)$_cM$LwoGll9}YOYN(a-IGWCS*BWr=C4ZXRxK(Cs(wA@6)XOe8w4&#{rJx-pa^{~K3! zU&}+JidDZ5&e;G%*}%8<}K4>ED*y%@U2K9)^{%H*^tp({D;Bo!OFVvlr}?9Mvv z`tDG$YHtl?inR0*cY56@$2LsY3Te>}9fg^iAtSA5RQTG~)2N8T{f55`>x44SZ|y~V zkM_bKzrJoOnvab;Wm56buJFPkS3|D?eGWTnj{d>TM-mT>>e7Tw8~EkI5|uf@W#&z5 zRNb7%lwIDgKbA_1-a}(fMX%5Z_Od%vp}6^8-M-1|hMd>qespy!=~(BHhr!Bjn}(H` zJ=s!qwV_x_*wn$5D`eCjCr-}Yei~9|B4{>msYN; zImxE|{`Z;86fe8tFxB|)%<1Sur||xE^@aG|_k}5GGZ&bx2#P(AP!mS?XpSZ#<2^x{ z(wYm&{Ir!)-JktsXCQyUY5AxbsYpR?3GV_@8&|uI743p?8Z4<^KNg@ zs=}VA4yvJlE>hAi-4%X#*+=A+&y_XV?gE}VbM|6I?9xZ&`&(J-;a=e8mh@DlATS%Q zw|FqAw;CVHSowouZqZ$1cxnA8%T{F$#pXpu{BK|PR-YroojwA4G}_OemJoF)5C8m8 ztzn>gcDMPE71GVDiJHD2$JQ==e!*e`TrzuR0sN4Gg-+i6C@(W7M#)fH$Ze&cO)nBn z*n}RoqcyJhnWpx4OVIiE_iTOiuEOh|7rA zF0B~hA?IRK;*e_zA8v1OOS6rn%(1G8TyV)k$?M6;no9R-$Fmem5rJJ&3o2v_wDU)7ztoN|fR`a7 zY_51VuQ>B_t(!3Lq?gQBHRDP_si-*E1b=u}?YBUcnH!6W?X8iUbNB6&OnMcJjxxue zC?Ov%DbZrn2j;z@#io?qW!Y}f^h!^&YVfPz+Tt(u8Kn-X4jGCkbH|j0`;z8}h2IJf z1bt0HZaJIi5q8dX%^9TQ@1H-Q?YCsbA#MYyY8BDU@p~FnuZwlP%o@%p^J5&v`kge6 z7V6p!Ch3L0PO7;JRK^Z|#b4e^Yb91K3RHIE8Yc0O|HIy&|3kh0f8h9(YC;*Iv@p_Q za!Qo4WTp}AVVvWfRH{LWvScaSU}$JarJ}5j)QMJmAsYKmLn>pb#uCbqb!=mN9@jXp z_xJlRd~UbTFXuda&UHPO`~CiST-Wt9OHIrAgk^rO4U}4mf5$!Dm6fjfSE81bbArT> zdX4M1B~tE<81#)|`GzhQ{2^WSr|~Cw z3L{}H*NZysk}W;7`V_izMJ$Ig6%WF?Q{bfQzya44#k$Gf85rBkM*@Z-_q zy|l@oqwY*|_!O4js;DmmC96d>?haB3J0~nUUwMUjNx3gCV&@$ct$%5D^lf0&j~Mgh z_Sde`W+tbJ4gX5G?Q=untNph9@DuHqOWF*R{5{V$K~Ij}o*a0|A~KZHG?r3Q zUy@|nd?qU}rW3yOT(CgO^=e&~qO(!FnbBgMZRJu<*WC6*{qS#C4)3v+iz(Qt&|3Q{ zRNBmFDfR4iWto>|R(~1Bs#m+7gjiJ3!a;qsgfxl6Qy;fLUhk~epq&(RbCl+qi(%(nQ5;iG_3PnDIYrbNCj0gsz+Q8)h}>SefMd#@YGt>SB|-_jv8y77H$xuZ}SP<)L1k73wa>A`Sm( z#OgnnO=%#f)>^E-v?aUEF?65$ztN<{ogsS%9T#=Jq(r#BOZjCHy*)5rVcm}E=2x2i=%jC!>paqS0dg&%jWN;wxOB-e*p>={z8y_HmqTa=!~ zS2BvtAr#<>*l)jKf11V=srO%Uk#JAQ#H5saUDir|O4M-34J_s@Qt$X+b0^trv8qX` zoxFKUvq4CTIXg2?`P0I<>~whx(;8>L1I?3C&cq`1MC^qzx!-p*)3RL^;kPIgLzzF# z;KREMuEi84hv@!6pbdoD&%n=y4DvQ>>1pUV8A|t;X9v1Uc@6X}Fr$23u`nUSA<*K& zpBMAY_(jcA>dE`u3qy1oWQQ)qEH+rddb^-us25t+fNkdjlhn;l#(~}#i+h3IyA$Av z!1`bCn}F)3@v_NRc^1*@jIZG(ZS1*vA=)k!Z_ZgQjB0!9)1;(J1=s>z^~QS9j|wIoWam$cbagN>E4xFx2x>n(0*Plp>9HNFe9 zuw&XRj7c)B4=x>3zu)2+sAziB{ot?7Qf>|=TfCil>ZL(uX9l3+BhOqh{_|p0nOy9J zFH#!%q~arEQPrUmMGND1l@k7n{kndade+%R>QyojS^J_Py(brfDot+Cmob)<>)UHd zIW=HX*gPpOMc2m`Z$c9t+{woi9(Y9Um!c_{r)++m_jZdFFjG zfBmdJYYm+C6Sd9~f=F?ylOYD*S8aY{)N7r5eAT^@1?8Sk^>-PnSAC1G*OG9L*ACKC z__23XdPGC(-Kbn#{^jMJ9%qiaggiWLlw=ym+fCf;A8*9h&`}SOOH_Iiie(&f2v4Rg z&G%USPL-l|?@@xKo_hDd*OG*i>5)9{rJ)||cvb$WR0t`=b3=l=#l?`*i^ns@T`$*# z=$};GVgWFmN;qo!k9vVsuzGbzUin3?(24ulO}>L@)}jmj}N zNgYgl)IeTZ%s=XHZg$9o7>xb2&M{qXG(A*k^Gwxr&7%dBC3iG;vYgBQQ20?(^jE^M zZMlYj;8(d+kJ-CxlnbE&s%8`AVb11xT=n}Q|E34Joq-L5tdzTM@~8=> zJ-Lo&wpgE1P$CRB*D+?^OI-ly?9E{lz-MszFf)^^y8T`H_5~Zn0MLibI zZ;u$Ne`_u{u6uhT9#D_xe{oV#B=YW>9`tFgROo|47-gBE?a?G)pl5_KO%^;vXX zILu3ya&9nfSvYLM7$aH<}o{wB=!o0RvFsD*LA3k~-u)RZusB+k^h!>+@wWj~oB zZMDMN!Nua9$HK+q6(62?V&x;-%o^jG^9L3yaq>lUiG>4vo0$PiW4C%=Oqc65?~9c&r=>gKbK9ln zL!A4$3rkCbZ`nyMoUUK~rJW|B-`=NKyiLcPQ)O{)&89U*Aw;9un2Hp}fyax8dxnd) zYX@qkazoTAL#nytr4|v(+ZHGBOhet|68~z%Z(j8<$y3VnV4Kk^;`Xj(?us`kQRGyf zVku2lo!6r)Y4MzLyj??2p>>a>mz387&A_Kbd4raYvTlou7>kbT5+x~`&2ByEBSYRt zJK)^-I@ALvd9kr1)8fLhGK-Q^QuxKL(H>!@YmAs7&r2QFDNOXi8#TKd6xUkg`W<)Q zmAsiiky}`NjQ#b~k9a)C-G5CUb;f81r+AbnKPAa4xyVwM z>y1hW`E9B!(z}FTGm?Wj;q7|&RnU6s$)tB}5!Utw4;M~uzFxCtO3K}M6Jv{cN+>mJ z^`{|+Y(pmVtlr`Z*Tv&)vj1|2@(i#YQf?jj*4aeK44DlUzfNr|dpvnKusuc9#VGM` z*Rv?~tW%189SuWQZ>?{SO4)9wv2fC{?QdD4>br?SiRZi?uk}ehlOz*`;ekN&l=aCk zc`oPM0wsBtt5s5h--bW)HV8NnU}T=MeHb(JCiXyzQR1fV%~HWDj``Bgby+R=b*J zBKFesA=2_0FtU0M6E!9}<$(87e)-ccb!TC~LZ2Z|e|&U}=C+Vg-as8mJNH`+Arb3x z@n-_HekmBmnS2}ESx4O~(=dlAnKHdYfvdt&gIf_XF!Kj#W8T9ec=7WX+j3nyn9Ux$ z)pM&327QnGICbV?y#$8=w^X+cv_c#gyhxgn2UsvH<>^R%F3V535c_l_w`cxFZYvK$ zsQxKT-MzhJYRGfYm%cS35C+A9m$SBTr+e&nmz|XoA#n-07t)4#nir~n`aQtz@S8l$ zzT192Di|z$_h_0r?PXO2!Bh4R{?w4*gn(7QN7w(d$0ka)L0qRjFM!MRF_94%W!-Ie z)DP<|Zp#Bibb^?POX%R|VlGT~_dVF^jDuVl9}P0>;NsKRZEkpPaVtBzrmN%YesK1o z@?Wnt9`I7DFI7G7CQSPO82f(>V~5;Qb6S!3{`K041<@PLVU`ZoEQL>*!@XoLrIS0M zz_Q0~dvLaviZ6O9F~B*9co*WHa(Li)m00}s);^a(1MMK|_$^QuY5#gDwc5gkkQH6y z;wTG)nm$gg3%%{HgZxmA{cr_c!|3qA4~>441_8)(ZxsbhfE=CD0)2+720rvY9XWCS zIWrM^@u%P8>&^tYa-kgV%~S=k#wkuxHwR^awTnO3oS?}Yj&>0)fI&SwJbkLTEwV{J zM{AVFhiZDvq^&FE+{Rw=y#OU>M?Llf^$G|flS$>5h$G?#Zrgc+l7} zBf~jQ!gVdxPs5#y6FB+GT|9#k$dh|~b>Mv}%yhPPgGgWPBsQboK$j%xVP)K6fHR&< zHua_{eJE`ZZH+vEuWpHKD0r1u%*SgtL?2u)z^zrBRH-yMAn~<7k6>TaKnvL*mUoXK8=JlZyMI7@62!`!DRv8 z!$5WpQzY6p?9ZrV3`$S#diHQhgk@3p(bQ{;+ey5)%U9M@mhsN%xUL0|Kh8; zzF7AkFIixhBrVzzaKVz9?&+d9DW~h&oy1pWKBC_)QGYMNMd|-!Y6Q~y?%;!30n=^0 z^O>A*!r2YavO?IKLevbwsI4zVZif9tJs0QQ+;~rtuN>A_o4r_o!&?GdBt|9}307)m zX4KPkNRqo!18I_pqoj3mec7d4>Y6^fQsg!Ux94FzD>(0U68|AHNob)~K)P*j(??%f z{R(HtukJg0{4`I1Thn*!i7X9!OInEQO5QL-{J^P7e<5&iUD|D#s(cUP#XkC~Ti0f!fqoHb(+s%vZf*#FJSpEzNPozD~_ z%XK#w$dopaD{U0M1p#YG!YidQG^OVBF%?nMNoSl5k$&jWQ%M^K8rBXnd83LE$dqXg zk#FD7%=8{D_Q!Qy-}AnchP^;Bo_sqbST=`=g)BYh6WOMN&GZ&=jK0emMXm><8KkB3 z6p3G&8TCZRzUoC_Y3zLK!WnGDA5`AvYcztb@8ZdyWmFs58sDYV0Z*Loev19y{7H%t zXHDDcOZdv&!$SNuk_4Bsrf<)(3Ve-Vu?Rb?TQhU3nD1d$+Hi-qgxqzmL1ggF4qpuF zT$E+&g0tpB*mr1Kxll9%f;%*IuI~y;xGQ8`Pcdxt^UVb803P9$VBAKa5QddIUtCQi zeyG!Y`yJgU6*vw&hE)uTtw(YhvYV@ixawv@u!5<^v4uVt%j%nEx;Lk}dM0-@jQ}BpUkZX+uul^D3<4xj9-YwT0HVsn zV1Z*ecn+jqo&puW2b)!gLU%^v4<%_xAgkor_hkYK{wGAFrU|d7C244sQNSs4*h!+L zhqVhLBP|B5Zuv`|yqXL8;}}oADMlcP^!O0nCm2v~%q9Bb8A(qNh*aarTnYpN0uD!+ zi&W=1R64Wnm3#~FNZ*lAs&(a*9m-sZqtZGp7xD~W-8C%+n??v7+YHSa%-_>bhT9;v zHYh!4Eb9i_qs7a?gCKrNME8G)*(VWf{3KeSs*<*yAwo*_Np3n-tD&#><2niHNCtaO zoGurb%wg{K(Pae`l@>@9G6QhuFt=lfsQt?wfJE@Yr^UcSJ8y2#ETh;Brz8p83aHk@ ziD{7&u3CtG`l`hMM5!|Pyr&U(J8A?7HVmoTx?c7(uI<*G~a`|c3Lj8-*sMTj*J$>t{WGkdk(S3 z0j*;stnoqM73s;91%UuviYRxXF=W;Z)V$L@0dk3Kh?Hd)M~qaX)b&~9H)ETn%}J4! zW31prUt558is!5Npl1W}#F)dhcB4fKAb$!qv3pFazZ8H4!hY(Wbfu9G-5lFocnB2m zsj%n{O|ol-BR30c$$q4u&sdRmv2@z8b{6H=$W7(aMbIr6$d9*ha2@kZM_y{zE z2Wj;+fHen5+tjTJxlt)k+h!tO$}1(KG4ouRLrA;FHgONbfDqB5SGlApr0b9R^Sg>Y zm*)e5oI9!eI2yqf;sVQs81R+g{iPiM1Zp1N3i7_34J3yw;LRv~V}_2AZ@Q=(l|n~Q zZ0tMG4lf_-Z<@ob<99>qGZ0;cPy=kM(*rx_FeaG|Bt{tocoIn=3pid40hRf#nv8=3 zD5SHZkB)Z%xpa~i&tWPA*`(W!og_(ni2_nEh%(!6Wir0FlRG9o++;4m!C?7YHE<&a zR-29MO1V%_3Vv6j9zoHAP49f^1Q2FUlRg``7;l@;0pbjOe4dP2CBaBYyC)n@_H@e5@w-Xp#;^~Ne zLmVxEVmXVDqgdt<}aWFI@&&?NO8{pkr1;+ex5L43T% z1a1zKD71P;Bi7NQ(f*(%kR}Z%T`VI-ai(C@hgvPtRvO=D7f z_Z&4xG9yV7&xCwHTz9jB-!dWhh~_zrQsYfhWO-iSQ630tV?$P@PP({6$hT$EBOW1> zn@K@@&2Yk_!pXj7G3=3EI2%7`c}gE(JuG+kC0Cm5bm;pN43Ot3i$}b*5^bq}w3|#!zA@77ZdD=Q5Pr z;;RBO212W%@=o0x65y0jIr9+PDxKyzN#GQUl?SC$E?@<}I$i|M$Jor_o1penS4c~v zBMhLQ+QWYT@Jm;Kj6b$Hg&-zmLoc-omQ`5r%PSRkf}L^Fnv3fNIK|?=V^{*zDey?2 zv4J})Nm%-u7zVWEOkcTszjMJw6x6ao2WXiiH!b&-OJbBj^_YMhP=a62t%oIqKZbuM zgsOxkXLbGsRX!n{XxVUW)ml_S{?U&o9sK_GK3n>6So4V*uuME1*(f3?m2!L7o5wba z9#lc+@WThk7K7{??$^hF!Tn?BQw(6_u|5>{<7q9}6_}xiI{+>vzB`+4N^prp(7A0Mitqq=*z!jRSYBUPlvP2fgXmcyWwE=Ak!{$m ztBI@QW?DKac!(7~hiOZ30C*w}&SApOz~UGTZB$swCF(=H?H3@RsRUTUJ(D2R#`{Qz za9sMXyp{){K{HYFF+m!N7!Fvrk532#+CG$vJ=Gc`O;bR#%@9>|LvASI8@AnG0jhN2 z867>CXg!9S$y;>9sE0Mhe2gk;gXx4M`&&Oi7m|Ioh62Sh-|eUb&WZ^*G}&_pjx9btL$eyNHg-;u zB()*8LrGiXL8hzV2xaC4BcmJd02c?wY(x*alF)39^wC%NGs?3`k}G?70{Jr5&1|S^ zgyX6P&~z}6wi>4SKoOODK*IPN^v<+eX|TMH9%O%$0?dYxq{DVPFp+K8RfyM)HB@Vw zWCuxc4wGZnfM(qSd+$L0lCXW4f}!rPZwVWKt+zLuVq{h_0FWGdvK94dKYR##&u-ZM zqm)fXP%i<@g{z^H$oZ1XAKnlNpyzr zN?R@zzJPr*11zyX5z6cF#T}FbLk*;mq1m*j1XoX;Fg_tzbExpvZ$~)qOa7#(CPbaT#fi1DwR<8;>cKODJ+p=y&_LfPgaR=oto=D(Ab?4?*CU_SDt`?IfNG z-M||>ExVWtUOtbVzx*f4b7uoIhY#4N!ei$vozUSTT$Rq)dI~B4dgHO-hFkz8y3uN# zHImi&d$zXo^16#oHc%r;3;aW1z12jI9!9#^w?f;YAP7%1wxN>_qjAF=rjn2WQj0iv z#N(D40Up@E+SY2<4@t@SZpJC^gb+2KsQ1glUSZ!h-=#079|+o$t=`V8;SvdLH^_2le1zk+p!3obMlF zT#(gvRK>smYN8<`+;Ec%4~T1>-U$m+iLb8kN+7CTMc70tmI~NW4~x02;9Rz_M5O!v z6=;j_RCs=&qXbH9JE}4~>Xlk!=O3|3CMgHDc_=KS+UyV=dSVM$d6CpTp>G`Ns~!Pa zl#j6Qht;8Ki5^DISa-iB^T3N`SZP(icU%0t*n7O3Eu^E>*F{mt0Y649#VlTxpyI zxp_w%{RAZ-LpgY&0&1cZckq-ph)=z*tia9o4jcGq0}#|zKl`eqAXQiZe!|9<5aPe) zC}kTUbfoWP6IuiEG@tmGEnfhxfMD7sF>jA2FN#;7!dva79N5j>3gePODkstY7IuCV z8TpU-ov-%w63L*Y_kjGNCqkc&bnsH`zXm$gP#>%>Y5T+iZrbP1D6JZ^9?&xs|GOPF z%+NoulYCoq)WUXtTo?S`@}UE#U?RZd%|eiDKMlu=RSA)e5z}_CmGic2EJ*tqLt8>G zC#}(b0=uGcZ&2b#C~_%Z&5#*gkTIm9)(+Up;P$6}tb!Ynjrm>bdoP11>?fs#Yt)kX zn#`a6Yc@JV2iP@6U3LZ@7*G_e`?wDt#!B=O^)y3h)|P2FL9tYyX5@uZy|6C|pXug~H>;A` z2`>{F<5;&G!wFY*D&>=Mtw(M_D5)Kft}Au6GQN^dCq6TXAfCyFn@Q7*+-YV$<1^*c z8hWSAAa6V%s&Hya_ePu-_GQ%UzOR*-30L1dDokar%q2B_;uM2Jfk%VbU{hT2TP#fO zPJBi#EB&fHhq+HT_p)&=20QKnj|S1G=hKY*yABg*SQS;s$Q`o9T}2U)%lN;Xf(A#a zmV{q2UED8d0NLDYot@1f3qn=tbZ$pJ5;&if>ye!oV9&tz6pFP*lmMprC?mT3J%t9+ zXO8G}%CEiDa1&CyU&>3xajXYnJ;a^zOXhnR{~LY~hj0>7Y*-~5a974H$FY-%-UB%J zs@@SHoa`zM7+;HjK}eNLa>aQ;wz`I-rq4CtGx7k+CZKtI$sNa17}hp1IiWRWDru>x9j0Z1!>r810|U#c;GJgdn#{&@;9LCAB2)^ zO6>HL_}b%}M>eO2wRs-K|NQj>px7Y|rY*;pOyJ*j6Y_({J%%70oj&}aA~KTa;-z>O zfrbqBl)KVWUPgkC-tf2Ji|haoT~0RvP>5A%nhybfZi^uxlG8#UnldDS8-Ro4bGCAnSz) z@$g$YX^_VeQ3DGnd;doiuX#Q(fT|C&%>$<&9Z)`Lt)fRCmwN-BVoeT$?m=l_r6sOz zUJIbaParE6K$+W$vdIIeJny#TyCIWxJ%|)>^nl2^@pd2&;Dt^0e6|#g>u?8&M(txL zEoI&|7hzBMr7Y2V2WX4010@vRnGa$2{#_o2!7=hCxcKaUI;-_CM4rEr{~Qt1`9hQc z`vk~y+yfPR+xdH-YY<4npg{_fLLy_V*NtB)o`m9ZF+v5Mpps$`f4&$g7EXj!1~*5v zCR}6YFg1nH5UgprRKPWVR*mAYpY+ZC1r$ViY8ll_g#gXPAmVK2e1rxOS5lF)jA;ga z+VoXb>DS6?F$~Y(MX~GA6vdIO`D8o-uJdDPew-7tHUWFEIf;>9DvPH};2GfM*nY>P>5`nz6B}jW zb*sD6ABD%x8IqoSDJP#WquhSD4R=|MK59EeK0&>4p7;pg((ewJ5!yJX@jR7Rnw8O7 zg3%FQZUPRuquIZ%nzd1cees*fFWmv@g~}4G)o4N@It9I{s}!9Z4^dft^ivV3K*-7v zN8m^%yn>Ok$V_Fw^l-y}FXhHN(0oWve&D2x#1W+aQ{^!P@PJXpN zCehmC%VomU>fNri(;O=WNb-*_%$&OMj3KZr$Hjlw{sKYY4jS+vK>(AHD_@|?|Fb>s ze~R^XFUsQc7i>=C7X*)IlyMtJ96$B;&3yyC-Qzjr6URhfCEBX{QSPBMpDB23+tUsX zRR?-eKq2T!17ywgb?x6`-rfLj^R)d3nsR$-ThIRwwfXoTAs)}*zN{>iD_+fj*V`k$ zM0Z-PT`+)ut3F-g?sw&JnJhV;ya2_I#P*1Ga!L%f*v>rm;+IyI zwHX6?=XhesMv-Ny0g1L66r^HTG6i>eYro2C&5Hg#C-BYMU&_$bBQF_4IdRnUk3 zMnUyK1k!8l=P)|G;1FJhfIxz8#Z}XEJsfbd0^&(_FjNESO2kX&rB|8DOT93-wMwK~h1hn*GOyZ_37YB5s`# zkpHn9OrIR!AxHsKZ1s3c$~Qb(Xew0ZNeY$0I8EoKq{Xa-_82EQ z&@E1){52|0ij@i$f^HzCI?lH(X;crDkPy2x{NE%P8x0z{g9;{+Pjb)AJolH1_Tc$} z=}GSRjSl~M?=&Vh)pAAHpa%s*@4Ek?dWT|r&7|9qZ})_2j(ZHvcUW7bdpJb2gH(27 z;A1+ePRLqDC%hicKiqOHEMhiRTeQ;OotAF8m?J8f!>Ex)E457uXH)#%ua(%Ip-| zdc1d$+~M;Tv_x$1cun7%R2&2u)-QBvS{(yXei}O0;qRVHxg6V3K{*ln_Fn^p;|R(2 z-9W4?`&)n|gt;L-hnZK$nFO0X-)s%Hohs(EnCwgoKdP6?@>A}CEWh7-M zcCsXzw}z|jRwdQ3*g7QJT&l;}tsMY;nJq1$sYqq=hexK#fr*`LB|m%~sa>Nz8UL*S z+WxJNs`Q%_w+;DMUZHFmD%JgdE+2KQAD^4UT!7a@sHa(c`F$R9m^5;A#87d+@Oa$_ zd%@s&i0N`zf@DSv3_KfPS<1$pcpU9cz~-#DQP{HXAJ=P-)-)~sIbBHtfsXAU5yw0z6mjxLuK zlQ!i0Dj?pyZ^%eVJaPeIEgnkMGI6dicijc=z>9>RA{?2uWKifXU|MIPd%>GgkTnEYa z#EKNmgf?zL|H}G@owQguwWd=3Qf!;7?vNJR=6%fzOPq}*0uAp*GS(~x=`6>=*I@VH zdy6~Zo`xd>g4_Ukt;?=ZgD|fWS5Hz;r^Yt|DtjYx=Y$aES#6%7M&D)}M zxM;kJU$YiW30V?fw!T#>1|2EkGY&}a^RF9v&Z}G=Vb$e!rk&!k!;kRF%=6kz0!IdS zBK6`)2UK~hNw)dVSUs2JOF{CTXWFRNY@lR`o)bIo%z5r8R6qyw^>FT6a$MLT9)IYS z<)K@h$ihzFACuql!Gyd77jG?A#+jsVntAnpdJxyg!H&W6ur0ow^2+j}&nx5h9=4JT z=;{b`mt6o-&42{D1;xuqE1-Cg)yPHT)q{LZ;J-Mp|9*(%xiXZC{FjYE?zjJxZwK(S z5Dl@5p$)U;o45X(r$=#d@pkns_uOu)2#ck+D=Vk$@d1zfcVJ=~W1TuZVmSA;gXExn z_mJZ=YS;a`2V2-ZlqHp^$5-rn9SDsX8qV<*lCWDCvULRj4p<`f6$`#wbE)*G(5PLQRfqSv*-TH~%b|ie z7&K69)v-0UxTjj{pUJyr49-2URzPe~TlK%uKDzseEe5W~C$orDog-kx6v8q%o>no^ zL&2!7C#;9kX_~t$wGP!+JOpInvIcvIAYjq)oRVQb!04YzYA&%w71CzeC7!<=@*|t7bKLs% z5a7At_~cpO3P%4S)Kr5}2+^ZGu3~&Pxvd}V26K?`k&yozZrVVB{8zHKaTM!;m7z!v zz~l4F;ezZo*-`sNCC4YfSs9C8DPYt`<|rNgzUobMFKP#K8K2By&f zNz0DyMpKzaIVA$bpz9m9E;D|U*vterp5QXi_yFJv@B?`~E;D{VifY>;&J6q<17u)1 zkKH6oSF%SWcv-ZBTuTt7H*7K#LBr_{WRB)DnGa4wK7p~ARetz zKFFklWM|UVwDsgv@&0#Wzh1ENlvY$q}2!ngIM&30G)_-vK!Lvtd@_I@nc5pBGe)OP}kK%;Nx&Ytt00OF7gGUZbm{~pMW2an9;JKt)oWqx+owmzux|sttdruT}u7o+@?4INL&%`is zI$ypT|1;u%u-SfoOBq?d>ggPY3#rAFhF$J{@zlJ8n)9yc-H9d_qrf8`Bt7pg0h(~znjJ2&DIv4Pnll|l z!S&~ehluWzEI-f(QbJAb#A0IjOvJ51k}oJ?9Y95XkWPAWd$}hHO~-G%pxq~^8(|fu zx+;4&F{a}x0-@G9nYmTM0<_jipIXI@yQG9uO93vMw*?|Kiacu;#VtV2ZW6hSe}Jya z@;S_}(?eyu5d|Pz1J+vBX=6ZsmH(hvCMtDVK1GkPAgJ;l`UdBq)XGT78G1ywmFEMg z)diL{g}IaYvj=iyRA2aL1@H<i`gu!wJ55i4Xh`9D?cmTi$2CLNPWMXg1cD zSX5wPCA`U8N|dt%DPDR+eea+l+XR)LSvgA*V!S5oJWf8;zBWxP!h5|25_aMo95=h| zSduX3kS9SlV|8cV-JK zN4l|5v&B{;gs&fXR8?>@UKvV=TnA6~KqDs#-*-IkuIPn;KL1T#Mo(Tihv^rZ;y7nI zrhRN?=(h?roR?`vDv3*~xx8W}F}EGO!Us~mmqAYu*Oh#l?r<*htJjTQYB#^GjIbt) zDl11kbxyAp7h0m|K=$quz^tpYaPVqv{5R=tct=n=^B zbJS)uf#Q+BmwiUmRgM&DxGWl(P0ZcmqhOr{RiqBY`el~=mZ%X6z|TS9}nbqVP0q)yf7*sTV!Av_Q0_U%ix1RZruIo>S& zd!z|fd|d?TC-l#A0U$?BGKm)BPRs?IEoaN$DoH@{XiW8FP{cTByfbyGAHP5>?3;d1 z^adqrZ{sS+8FYioF+F^rfO9h|PL5{34(Z_fMDRDwVP@mnVm$G_bla_a>+s3S%mh)1 z*&Lk=qd;$dx!zMVMpOdd zZqSmd+7dOY!VMQ4HY?&2dj%VW-*4M?V>C$LVUr z>vlf}WJ*7P@llO}RGHGcLT)H$cA9w;g)mw^g|$f(kTVp8aTD1FiV(l%)NU9~w~=k@eT`2x{2ib#ZL0q<)24@C*JkSru*}pWQIf0Mrz+3bx6Vb7l}|pYIsRb0WG$ z+*d-LJ3-ZWkkb5(yL;z;pzeB@6h~E!^RK{g$8TECLUF;qj zXeI@2)n4ApNFUV{Y=B3g0ZCmb2H|kPKCb<2gc$Vq12X0F;u4E2?E8#nj?4l;%XuMy zxK-ramxM%qe5&8+m3ZVa5RW{P0tX8;0n=U(=u&4_PX{(AZ#J$SMOt=T_;sVF4VMKP zq*sTRX8psNN#rJqX2D4x-Dc}v-y(y(7Mz;|fgE)XV|rX|U@@QA51@1t%s!WQo)d`? z>dt+97nA@A&0%1aaRu8N#14Zr^6ZqE4?&o{&piE7V(D=40>}Y6L8?sKDK-T(b}0$D zR~&6#EjwQeG|EeWqH7Y(%l?{Pn&CGFP$fL(Kp~Qg#m?(riIo>xxU;QBbzWWoYH7VL zIb+2frq@}}Z3B0OO(?5po^}XVV9$KGiIcE+4l}l&KGh$r4P^xH^=U-GX#y0~5yt`` zH62|ktlFd;*25HN_NJMOxd(~$S)C|NA2mkUeb~qSuNK}r;Z$0uCP1Gg=ZE4pgDRw{ z#o;|O@u;{Cacg=}A}{VU%gi|0Kp~6X-yA6RcnHUOZ>=1kOm7FDES#f6)>hO2Ru-O* z0OncFP;OHd9zDvjJTYYvIkSi1wu`+0`s_XVd8rLUUXYP;?7V6tZQ61Ta61r4U%XKr zK;ift+{a}H*b5X>SeZuV{6=Cshri!Z1fj3#=}F|$6CpQv7^Skcw{(cYrwbgjy=Z&S z?j^VNi7MwX=W{A*2jw&TDg~4o9p$Nlv!!+PbL6Sr@|6P68*{35wk`Ef+FtN^s~4VV zo#@6B@#jU=DzkB6EsS~r-A?5DCW*^-z6z!}HgyJYT%_BGG4`Te#5SiwF8>*y7LJsD9R%5A^J~~Z z9VIb`;eQS_*hOqjY$5Ya1X$GMz%tDeO1E}4LR4>@)i-JfVU7R7YuCXb)+?x&%t9F5 z{LGu9K6|I}`-P;gPa|SeTxSPQyxn~Ed3QlP2mnN4KDC1p5p3ABY>1w?OR6@3nK z(CwL7EcY4eT$wOZa0ySOOC}1ae6QI!_5!XCTYiQx8)I9B*RGE(r)SbzQei2o6p&|j z`1zvcVxH-qS|V#5{%=v0+cP2fiUwb?N#C`GQ{rP`Xj%PHeM6$N zPi7*p`l&RlgV?G9SC%UaBr1GRII*vGfZG2SRYFG4dteQ*V}exEL8%q=1TSU;HWs#P zeIIs9HW{pxKs9(s1zxX==+G9`&fW&xEsG3rx+UU*T6Tg_;ghA826ei-6)llaycaYh z4Efrk>e+iLGrMbs_}o#I7MYbA1w{KeYf%Lh{>L`lv-iySZc&w^Xm&rp_y;*75h)m^ zS9@`+E_20K$dFk4pzd*4+x^9OeR|{lkof>|dpJz=UJX`$(legCQ1cwfHLHgw&6)Ib zq6<};HzAoy;kbN-&)b*cS`Lr#u0yZd<BPI$|R z4;X+9&4)|tA9A2~oK2HYAGQC1q%1iA(S!lQb-g9s&Ej^z^6_-ISFZUbhB0TTnW=H>dcY+DZ zQb+pL;?GcZDEw$)mp*<0mvv68Hl@-EXg-Mof4{z+h#x%|+{0=zo7jc@QXOI~% z@nhE|3TM7+RtbiSRKG?}6cXkz&vi!b*kj#b zQjfh8e1W3gS$^Vsa#hpW^i?(nS;EBkQvru^c?9izIH61h92|Y`A<4+!LZ9st*6+|R zj4{sV&rVc*?XkIOtBH*Kpl>rGc+w*$Ql^xyDYuYmBbvfnZnn#1c!e{Cnl&Sv>=zZc zLss_H@2+ckL8jEGlO0-Kn!f}7B**5e=_$8}DBt~FPsKaK&)1;rSt-^gkV?d;)i(}! z-ik7&o$Qd|r~D3pUH6{@zvPubT3}KGE<`S~9;^wN=%!AooL1N)Mk%Y?w|h-7;zaYq=q+aM zju9`r*@@cGsLSbUGQSY?rv?I*kxU9VeyO~JAPJzxR!>)LHsHWL4YyX=L9(x>-}rgs zrKc0$@1DcBRg`{>F>yH^GKcvF9Om3!0O7r#BF`Sli2`Xwz$|S8TlbzdB@=cK{fDjP=u-D#e~gK83v{;MDm@p&9tum8zuW(2AN;Mo?A!_(va)r` zc7<3e9iMR zv6AQ$VhMn?^_2U0Wd9N2hd(8Qk-3R(rYI|Nbh*rc59IvER04kV!#*tw2qNIn>Srd_ zgPbuW!aBi_IfSl)L{7+FXxrz7E)O1_Z1r3S`2XgN6i)<~d>ukUTzdoEsU7Lu1lYv` zjXugCTro+y${nDk?!rOcePUr!Mt9e< z%eo^;iPP0HzoUo|7w^Si^MBX|aRwZ^JD$Glohu^eNw1$t)4gD50bqmm4v7nx1UwHt zU*g7q9$~ik(8`;+k`Mw}^t%ckx{=V%4pR*V5EvoP}KRGYog`9wI< z48rL6Et>(f=xz`Hq?`Wp(Q_{T8j7j@nlbY|vhYiD(AS3mUZHjyyHqmi>wQ#0yDCGC z^EIyv>?Qj~7lrZ7dhV?756cMpOuF{|?e#KJ*!zx8q_FlpU6^jc>dn%Z zrQXxbXgT?1FuQ2j`fG@;NW_LBD_sKA^T4~Y=+O97Aegv9kyXF_QlL0M4p>r z9E-E{5x7z_@g=)wBo_*?89GiSkR<7Y6d}VcaZSk7Zc^AIS;1fJQIezZ`TJSxhk*?O z`|z2?`hzs>yNjnbz{c>QwZ$-r`J&>(gAkmpWBVUzS;QMd`vsUdR(WqC24^S1EfD12 zS%)vfcekq~@mFXYVhXER?-{Cm?UhLpefRytI-<=X4hp7l5h-jy;u=lf(U8Q1F9^VQ zIjXH&;UAoxB$s85vuU-uI4a@6z5O~=l7C=XTi`aFFzii!@g}N`2IH)fJ0U%{`Z0#u z&DL}@wg5QgtS&BAoN~7(+{23Yooy>&W@)n< zF(wd0ei4^ZoMU(0z4mCiIAgkd4RtS1sSShQJ>ymI67W2u;LZfW`Ix_e&1;iwf(rlSK@0cT5&ag3-1ozG|ykG zV`f)OB&GLh=qu_>NOM}hHkYE(8{PgD?u6x9?3kT_Tz3Fj!9c$MVj}SaWl0y z$?$Zh?kNe*|Mxt)LSeG9fJooQY;@3cFc zuVc83;iWSZUy`xl)g$i(uXR_L=g;$7cL8*{rFN6xufko3yyn^sue-{u*e^bAM->Azh)`F|xyi8U(=YDawi zzYPxepZQ_U*EU@Z0ou6xU)NWQigBF{mAX*NZRrJo7557`nnDj(Gx5WYp{E2nd==FD zwk{irewQ-J{PuIXEGv%2_uyUEb5$DirjW-R{2ol1cb5Xs(8`eHBYww4AVNzXuZ%Qf z-j|?rT@FhiwpU7Nceuw$-wZO@W8x%tZCsm~%RAy*$9iVdYM7-zQRF$q3 z2bUoThFjc~oKZ6TGk;k7RN0E%!}F;Cd##LRP{lA`fB1;v$}v-|1aAROesNc1$g|IvdLf`Q2S4pkMhJV^$75n@*Sdj0> zpF$e=l471gviZ&*Zt7M5T;8+i=4qPee@!i8uYyv%dMZPJ#iViPCC+^{+rvo(Oxs<% z=}Wq_hz8>?YAcK~g2M1Ba1WB8FDa}Zp1Cq=UWdp@%KSJ2%P}v!(WqPD>o=%U`)1Gy zVH@c{3foSt!Enwv50R%1DSufR*&JN2@D1Fud$e8wpwv`?R$Nir%jvE)&u_BijY@M1 z-BGK)0g-p6@#6=n1N)*l<1)6oHo7Bv7BJAix_y@Xc&%ru-% z@V%SPJbb;ssb1YK5vZ{-066zgE>x#`kaB3pk2r0@)&R3RPdT)GN7zXOBhlNAz+@$B zWaNew*GE#i+>T|QpJfZ4wxx;pFwF z(yQkA?=v)gNpAu;C(wtMONQp1=ySu`3%=*Rk;{Nvz5$Lv@+SoQJs&7(w=&Vsph#ZU zdOF?)xbEDxB_NWo*WUgF#9wkI#P{I?VWxQxNQGwnV-NX~!iUwZIC-x3QT+Y8gX}Dq za?I&6n!n&P>CCA0dE_xSuEvT*#UMrFyg^Er;>t7QF3Y8cqPiUcX@>IML?@-VLG zUm1nLBTSHk6`d_~K`?D9|Kh9LhMAEr`@i!krge8yY$$pvDna$MY<`5f)h-EA-2AUd zBtc=M+9KB^5>W403w0!#|EFYl^*Ofk0!4*#V!ZOgZ$lkb&LL9=(xpd@GI?Dq!>0kL z<~n|*NOSXA1c5V!L+XKMnwf~(3Pb)gA{6~e=I*)+6zQ3z)I&?ph8JGRWb=LH0}}zu zaTp-b4Sh`at1!c)c zaB54L1Sv8Y)cmkqk{@;;4R^h`l45ZIt7;tCJo|>tWo?k~5 zPhHYsnj8VFd%sWi1I~tGr~yJ++u$)KvsSOOq5RJM5GS3fN45dpkFW*F<8aSo2~zk|C_!Ox z+OKKVJhwBCR{Z=VQx8-@n)cILvf>uWfykm3a?QL@WG*{U<^0OXuO~keT$;`E8w-Lg zU+FY%rg~KBa|;g&?iAGo9t`KGO;I#LV}QL#tj7Y>=aaEtQ0XK6`w%wtO+ z-UU~ANdYSDnRmF$Cm(|W^M-p{gIM{8R$SQ_zpMp3K__7Mm$E5}K5(l%761+i3KPQuj-Vep37Qb!e^U<}KD08D*8_mA->(f) z1^wByfLAIFhRY~A_@7qXu6X74y>%`G#K1SnmODv|W5rgad49(?*(W}ee2*s>d*Smd z51*E>K^l?7=jy3V-{l7j@70=%1jZkm(K2=8UXG%ef$GA}XWSR$9N*9{lC#W>;XbfE zs3y(595?lZgIWcSl$f`p?)J0sdccV&tIWt4rQgQ~`;LuFAUEPFndYkyVD$AsnJ33T zCFOVKSXPoGzDlOaKa8v0wH$sJQRnpm%#T&`JIy8Q z&7c7tT){UK2U0{$_6iEDv z`Sj$`Nxrv24qLmzH{g40Lvjzon(w6WTdwQ;^(2Mi4d;)3uB$*`(y%3Pw~_j$(|A7V za|8lldh&fjM`kX!a7+q#*pNZ@7d8;3#f1Z)7V&Iad8fU@ypQKPv_(pWxxZ6^?R0MH z1g8SexS_Y3S1A1VM9fuHXEH_q%e7P`iq6ex*J)VsbL7gHJ_0Dx=)%oKkY7h6vB=^< zzQJ4WpSe#JlK~+FckUz~$3z3(^ljHMjT%+Yt`1VP>G@+s>q;_E!Ytb}uCj4+m3yJ^ zg&e?j^qGEje#yw9?5W1zx=C+=9UMp@xOjjvwUv=uiFEtfW`6K>IqM1s(i`)}n{1{P zK;x0v`UKZPg%SF>|AGSk0wCXGevknzFe=0r)B!zwa}9>YRW_KX{lv8SuXLiz<1$H) zjhw->z~zDcrEP&7)v%?+YNksj6g}PB!k>M<8)^|pOhOy z2l3E>6hDocKlIz@HMh_l|9FRmo)I36SB9pn3_p>5LVnH7yT6d$7@yiTwSP;0tlA7X zkMz3)z$TaY ztKBOAb%t-pfgVTuQ~xvdUl}u10!TAK+Rrk%mt#9l1LgPb#Hs+_+!hyZ;RO`1*1y=D z`^B*BJA`)leL~afJ8-EG(!TH@m}z)S(SM4vPue)se)cN2gP-TpvJD1Az0F439jF^tPX(7}mP~BY+cs?{FbHyJ_{e zFNu82()V_f3e#{|3p^4Pk_o_4;xKG_^Yv6wiC^3jFih!=c+1;(Am79Cow5f1r@gzk zv-$Sxt)^fwQ#tYHNx=L8m%i@cirf8~r7-;8kd)eV!>W5DM{8yWj5zz(oRTfG(}91Z zFu zbOw~w`co$Fe?f{?C`JnV=Kn{bhX5K?jys3$(BXqqYdbO4e@90cr2YG=K&Nr=R?}#T z^qcPZFd#CoA23`pSV%H6R+J5nZ^S9q}b1t41W^-4j6!G27f$7 zQJtO#*7{TOrn;Z7dAk~1#TC^&0hsoeM!oDF1&#h z2b^~0eU(ddQa)?^Wh|)pGEw*CMIQj6sG@Q-(0Y8_jzJ9Gb1i}Si^tAsk!^PV_6M;# zI5YsXCKDVe$}M>ZbOaPXi>)LB?wAHOtnev)eme}bbGs<7lHA8Mw=8}N5)w?R&o~IV zB@D@z;Ck>-EBHM9TmDbkPMMGC;Fqrg&HFxhl$$!ax&@m4qhm+E$b# z)FC?CONQq`!5w2kMSO3|C15x+T3y7z%4nDRj<3knT>zd+(yb&9cjh+&&^ny^hw9Q2 z#25d04p2A9{DAoPdmln}43*)HY2p(mnF{{)M%++a?ap>68`*Wbx1OI{N%B7h>yt9Pmo z!zGUbEVWAR*x{Wj__SAF@kxoZpRET5D9mh01wLGSFArP@26o)Zw7NmntkwTvr=1VO zQJmZH4T|CpZMSZQ?AS6KQW*}kyIhd!^}isaeM~bV_R*CEFcg^W0vJ44i0aY|I%o9= zkREYTca&Km6dm^gFmyNjrCW<|V__=@PbEDI)A%*h3%@m_2W581u~0HtZEEiAmWhx? zA=pJwUofrf-u%pM#V{dxXH|LKs_tVw#Bl_ z!q7JggixswxqB-FyNC-sMdGLH;R`akvg$=z;a%Vf53w$=tzw`-pe3MXaI*&MRs1mG z?zaZZV$cj0TTPd+6?|z;x1|ixCmW5t9eA_r&#bmYfJH@@+o!3~vQt3t7bv4tWy906 z%0_;2V_e#vl{%pX2-?B>U%eS-r2lV-#f<5bIJEx;DPrTkP7u}*01F8 ziVnoA#(ybOge`+&%RgWXz&*iNd9HaJ#zyCAt4_CN%b;1TE=Uy*MciFUv47RTl)d0k z-ZJ=SGgWzjxG?Nzdj;wKm3qONv9Vg%y|W=hVwVz{tg~Ou#%i!*1(19$Yj1b% z-b27t^`f6w@;skwth|~z1-p%YX4e36i@V^OT=^SGf&n*wRH`8ub^N< z$3|cd5dSd`MR)rI3$+Ix0PwO zi_3NpaC6l%7almLX8^3DajJWT8PGBm>GcYoOw@Ec4BtWO!C!i*qc*Mvuc=-=neJ2m z(M){JM%HxwuE%Z*OVTP(HCq&0!1KH5tcQ?_DcNV zpSe>v24^)Jbb&E6yTQHpwV^;vwJ^5&$$U?5>j+%rl<;!(3-MNnns1}xi?d7gdWvnr@aCIr zDgTCX$Og&rusVB?pC@fKB=RL=uYyCkRi3u~yk8cBQQ9Hp5nuDdrQk`56FN7++wF)~ zbaH|ewWh7ee;i+8fi(Gu{UB}T>S?)afzfkTV!@*-PyHhCi;nh?nca2N5VO=(ei&=e?xUOrpdTQ9D(fU z@xus?t)mB3BM8#52a|VDWYZR-lz}KtH7>Cekj#@2n}l!7C5SLu{9xbL zAT3RJY;E~Id@#*wpa=;M=!X((EojYirP?p1F6ivOpfwNM5ODHnKsYc5Diik5<>;l_ z6VOW$DADP??3WU1tLGsaXR@gb@(+kd$@n6&RnUi#P+mj!5V@dnggxWMmU-(Gsr3IE zX;F@ZB}naSJ%Is_BDryNJwoY6hqKOo8;FK?0=4!6jn*VM0&nqQ3vXPFglrT~^au=P z!+1K98!*IMeJaXggOmVcdJ6WfYeYbNj($h|K^fR+_rbb6O0gQAYLgq`i-H(oLz-}| zDy-3f=g@HJJ4!~BC_6^GX<_*$JRI>@Dc)<> z%oa>(Icpq_sW`pP!;#|eeDG7}CR|V~&QrN;C6tG1=On#|a+4oZvEwN%lEx&u1uvnO zOVzd?U`@zb{Nz5i7(7`lV}JU+T0)V9YZ~P`WQ+i8w_DNTuWe77ApU{3yuXe1zbyyZ z1<2G|-nd!Ad7<+Bkv+PI!X7Ve+c);()tYO)JOp`&R93Iy;Xi{}S=5N=6_s}Km6NhH zsbUUEF6rDYy7{MUQ|Za8>6}!&bG&?pdYPR0Qc`NaW&`J%ib7`ZWyVm5x`v`QR!w1P z1Trc`;e0%XMZS48a#lBVySghQL(D1a%-5(-k_$LW@h$O6oX@YNw-C9;pwB7ru>Vrf zkt#6@BJ^qv3zSce#)}kq{s)&tYR$R1sp7vKRwmp{@xEcg5EU5CM$S0ct$}9a%;K*=AM?YCYw}&E&biHQZh*wqf)W$ zPiAsqA=)y`s}>u*6??LRkA$$*BcvkR^j%FYtC;N=s#?2NK^mKJE?X^~F z1?8V30>=2Sf!8;wI&NnS9J}f^YJ`-q2KZi`&b~WVIqB6;f(jnS)@4Rj;h5oL$ml)H^59d#~G+@aeTpvpVj>xi&1LoQ|`Q zc{^^+IZIAa|F_2@H&!5uXm0Vblx2u5O6{d*Ynqj0y@v(S#*!_NL)1>Ip>!qb{3B)s zy*JB-{D@PEcF{VDE>-2Kj8VVyDIOA$!uQ_aymY~`=u(OGa5;?WuBw_YJ>=H5f85dg z)9Zwkg>)8gDRW`0)zy{9*+nHR2z7wnhV|6++cV?CXVES9EVWR(?rbO$!tZ()Ut2DQ zH?t594G9gIlbFaTxV<+Ub4Br@3fout<3Z`N(kq%P=P=NPDG|Hg6F261&}A7NV_hEg zk`ILM{yx%SbP(O-6ru{7ni45Q+!#OPoj^ZKE+uOOSIJ+LdD$bK-P#ZhPtTnomfB`} zeC>z&{Ha|(Di|)~6w_~3h<4hwt`VZ9-$Mwq#u2NM>&#Qb=H;B?gqMX9nj&@KVU7|L z;cK6zdPFpRyi+Us85t^i#E|>gI=Y?^8qM;-C}(x7vArY-8g&TL@J?92w6keOO$8TY zJ!vm{96oY$ec)K?O|g2zaT@16T-ia5$IUD`c)`c$w4&?TJBEg4C8HlU;>d;Yjz(Sh5(g@w{3S%vV}mRC$0U7Y zVX?_b%Ht6(4*p)Z{7D#~rSRondtgdUDfmzebbA*M0ed28PZppu_JV++1yit4qSm~> zZbIYU=-yvGUBOcmFn+3Nqd7Y*3D=dfa82%OvOu@yNggnLk)eKP8p}@9|CSvsd4n;v zj<$*<94utxPkf1lQFZn{lq`R&8WxslUi?x}PRfh0z6@!TL{zNKOJPpn?9iw7Ud$GB zgwNjgOR>?xF#C_nWBR8PgZz*a^)LmySL0abr$)v9VkABdjD(Ptn6|VPnNHlrl6Sm=N!q>AC0fU=8U!5DV@IJy&{el8GYDFUF+m_dAIv zqI=EX^>~lGxtKw%Pnss-dK@%Jd$U~{P@cBmFqhGP1p9P11cdK!7KQMJlu_Ct5;VS*HuFt*u~r2oZIboO@~P8&t^1Z zJ0BkG!7r=%3bk20u>AUOq~rmY!U&nq`(%*fEqAWr5<}%7Ssj+;YOFa=j5|uRhxSKh zsl%5wbFE_L_-!KyT=o0EAr%Nen2hjP&T1PDDGW|3?@w0p%$MW%`9G|ML&|g8 zIiM4E@&OT#Z8LPs2t>3tSM#KZHc;uoX+Ec=^!cMf1{5+n5>Jn^pVig+6^+ z%9u92`%R`mwvI<+hAf*I2LF`pF&B#6|9D~Mg+C!dCqS}LFp0e=w{Aa|;+EiKRv1e~ z<_G!3x`r>J7P6+G|&jgaiE3JlDHHiqM z;TsE?t^2yh>*!qf4iUKz^P^vOjhmIt>?%%u{*djru~MyO==$Y~l=#uC8xfEh2Mq;s z10nRuv7=s)0~QV!mhwT z=0kgY;+tGWn+oMQgEu@7_+o?+u6dQ&GAZW&c$( z#zlD>q#hIb1jO`vU6t{+6|n9xWdXvZf)P_C&Bza`)gzLVb8PQDJpB}p5|mlXvSfd0 zD7?V?T-hxeVi$Z8>0ta4IP)X0bxZMi8nbm-q4HLh}uD#@ZA-jl8)&(ADR->z-3VJ zU_NJ?in$p;YjVGaZP~XBX;%QfmW-{G65(tqnJtze#^2R*eg@LXmz9qyS6k=oV5tR* z8Yuu>g-dr}IWqhM+2u9n**LTME8aX@%ow$%mC;%pSu}q9UPDHu9?|bXX^TORu#-o* zj^o*|UnMkH?s>^c*LE3Oypq<;=CFl#%74$xng8@Sdhppew?auJwT zFitF(7pSV8z*MOlQpRx5Q%xBc)Zf#Um2za(E|aj@>_5H}9uxDbn!o+9H6s~Ps4dS8 zEnY~Xg){P==o4uRebv>x@&^Me{j!Fb)Vcs^Y`f9yA%Oz*beO;Gk2%g!+J}bo=@8Ik z%c!4iiKf>-^O$DF^uR+sAYfogL~ec@#P&F9NaFFl3J0|mv{OkA6xF~w&$e(kii~3~gFEXDx>5yghSu;qeOW=H&n^*Z*8Wy4W zUrmgc_UCna%ekB;sBc3K&yPq%YY4=S9)r)6HL6dG9I;*qA{J8HjAQZV;{>v6-$D|1 zuZf(gYJagu&a9s7-}g8t4A~~3(!`$ExW3L7Jx153yyt%=--pK1C&wFsM z5~KdAwfzZvTPrd*{Vd_Wp9x~bPdG=LckL;?L$54%NN7?1QoankJ$r*UWk&}uoT z1SwAz&NbiYa7KzAg}%sWS)1Pn_fp~re_`Mo%6W@ns(yDoz6WR6^`4`4T!Q9>#Bkg` zaMBMaRkOOFo=O=EUE2~Tdh0H4{qB_ic=1{o>=0Ih%N)Oo1YJZJh&c;Zs;)h3$^n$UE%G84L>bKG)xL^U_Ek& z60i?@A%*mRf`n+#55Fswk99o{oxmhx%KK3s`c&GQ-~;vAx5i@8nlp+<_$6*u=yuk< zg^7fyJ#YOt>j|F|)D{+eU?F+zHh-j5tm|ORLTRpSOuiR> zvh{SZQ+&H3&NE1vJcIM+miT9Tv^Yv=)ly#EvhcpazWPISE;VBh?FBfp`4YWGrb|Ra zPc{tMAo;?(^~rW>=zgpOw&&D_T(u#s0?oW8=-Uc%dk=$=>jJUdEZ|*c3#6z9_M7VCVr;1HM9!LsxhVRFV6`bN@wNY1OY?w#(YTf>bqZuYs2~Yntj0A4VE3Lq9d&N{9j-{8q{2 zlp@^*0Y`UokIOBm*Z__qoOD1eB~D2;v;{qz%?Mn8F34scvobg_ewN0Hq|!IFI{q2f z@5gArf^77Wf4{IGV*gmMYdONwRZq?dth!M{T0{YBU=$6&kFS+7A4K_b^@PkOH8?nrd$ zgxH*fW-eoSA1=|*TK*0p6bk>hRQs^jt57X8+z+?Ff!556htC+V>v-iB!IgmW=t{$pP4J#|I z9o&@?Yh(W3t}-~pgAIb3C9Uy$hiYQv992qYu>iJQ6ZRwWoP_c`q&8d%>i%RH^y=>< z3OjDhPe9FD(-xN>wqNr_L%hd7lt!A>Qn)q}T@*hEq<9&$&< z0`WEj2TVZ>Taa5s42A47M&vQ6cSUA~!c%ex5$C54!JWdC@$~-LCXxS7wFpAE%m1Lv zV{wN!5r|$mNL5k`gtaD#3a6+L*#8ki|xy6){TOU@sw;z;k*Re(YhzQk* zCV_r>q*U$5I)~<(!SbFI>zz@p+(;VHgAzk3WJcKMQ({>^rR5!ZoVg9x4bZ_%UBgKq zs)B95kkln#No*bJOPA||sXEv9 z?PFh7k5fqXsPsJ?(Lc@FD~gjqFO~ZyrL11Nhv(f(qKdSyiB}$S4S@M=goHyJ;rDk5 zrOl*52y_b(9hn@-i%wy)k7*9fAuKNnlMq5{FBziMq6;PAP|=S8$FnszG56Smr&2eV zq-i#O5%DM@tp|}KGxRj2wLKN}*P-nZRwEomi(ft}>y8ZN&Y1&%2l>~+2Bg>0=IhhmbtCKsw}Eo>F+#7Ys6#yRZx zbap9XA_NMbf2AazrB(P-_Y^-dNM2m&tC*x)3^&r1#teXzDi(#E+<-rTZE)mH={_Tb zO(%$Sbm8mIqRYR*Hz+zb&|?CI{U!xU_q@Nt@Ec(ueI|>azz3g;rG{?P>6x`KyJ!su zU3jZ_$kTT0a{jyWC+%J5@MKF`)jqW6X6hq+s7JRvo=l>~;`^}reFaavtO9RV-kD;< z(Xsf|;;yd4)gw?f`15;g&a{)oj9ZFS;_mehk?JH9h&qoWEGD86DQ;0aDp0O*K1BGA zhrn?aDW{`hn41-wzRFxxsL&ZkeFZ!b+K1x%Y--e}ZXGX`3_tN(kd=Yx5Y?2nQu-3I1 zSdfTshZ?#z#Js4Ffft6g+HFb0exmRuw+*p@RF(!=6u~e~mn0Z}5IWxA$mq&pBMS>* zk$3P#1|?m#%hg}v=<|mR@Zp0xIM=&6u@&n|avL4>a9YPxbYXWPvS&(9*QR7mJZcw!oYzzM=@){r^uLoon!j&C2i%bb%zOe#=;)h##bux zlhC+G+GTwXvPIAHXGd0#09Z(s^c|7WVjlM*FL{4fLsDTYRVOY%3dJ%nL1-#$2)=|f zy|<{^ThHD}27SIuc)HitD#)G5xG|sAMs{^FPAm>BXV$vyjbsz zk&9PDbLC%{-ir6z)*CS^e@`t`=d{gnOlTu4FXipbluKDkMFV>!_1Hvoix8YpWR;;I zA0e=xQ$^tQ^WY;RDaNOjM)!>QJ&JX`*pC0UyP%x)2~%1n3E1S!!iA9q-nk2hju z&MtL6TsH5ZYs@MB6js9|I-{xo@f|Yl#80S9|03}N%2gvMr(IR3TqC;GWC8O)j`jm1 zjZaWnswHfQK@;QI@Qte>f>y`mR^Zclj7uNz0nk*Rx5u_pt%)V={=>&5dWn1b3$p1i zsxJaB?KNFnlwdC+-nsXjb)B5I=XsG zNIsS#8yVaZ!`bBvAYHoJMkP0MM3f$A_M#K@gs>V8DS2nn zPiD&1)td{w<}Mzkr(t7UW4ueDMZe-98~@hoz(O?n`(q&9sVr0Kl7>6a0H061$Vy+* z{N8In*<|E+qgIgiwQ(KZ$){=*MUtrwkDATS_2b9gPO#x&i-PF83XoESg@P?73o#NU zf)MJ?Qg17m0Pd&9vp~$SQ7)zJd;Nki`z+9zzpuf=s3@q10UJ&jHxXg!vt7Z6f}kTh zIL2L8ikQk)&r-R=XU=0a3a~f}--BQ_S1pHlBc&%jH@@jGeuF7rfu#oq!D^0lXD+P9 z31hu)w89=|%nDTS9NnZHTt|G!^CKdRRI`!w{l! zo5fSc8$HRl#Pz>-BLn3^WJYMT45e=D!y?jqDR z?wI_|b*W4Cy9Lg2HAo#J%F$Z?@mj zZP>l^qz=;NF1)^*Rmh{Nnt`JIY29P0(c+{l4gTrpGarxpv}~aI`XAm*I5k%#H7nA$ ztKS6H0)d&do3^CI!cFI1OFj?gwFh(vqT?K77gXt2`S;?W+1E1HJl ziawN=CR5R*=x%~OPn#z9%^D;UJ)eTe0+|a!=)@OQBCIf@D1oZZdpZ)YtcLcnc$Pw8 z=f<7>j~*;xD=txSIQ&N1qstZ2mPn)KcS7lk@%Ed01dnv92Kxx}9+F>XUo=Ks&OVL{ z_x=(9(Xgh@t2K8$zLn$b5g~pMJr!r&VItq#_3sgJSe>i!n&gbm{gAI>{q$PMV} z??X*wUuM*?ec6N{N6<%e?Iv>HxY#3Z_MM$s6<$9lq8Ke)uW5EB57L zi=spljdZa!5MHdSwq_(k>044hwR)PJ@puw?>f4tDX;|N*G+5RC@*hz22$D@3qb94e zd|X~6#BSNcSf5o(+t2k{>n83SNeF2Zow7*3^XaYM(-pNrY#vHP!(QTI*G0@fYRHiz zBHZmDIe5I3i1re{05;a(Y(^fzVH=+Du(j{#xyH2SjLp*){c}@tr@t;@BmrtBZ|y=c{R#PxTX1j*-tj{h(DmH&~>`DoIZ3R6mF>wi!wV2Ao zfeqg%qK?{J$I8;mg3wiAdjZ6me|4VR_l%EM;5hjB$d*7 z+aZZ2ZTRl&%hI~zGH;%BL5WX=9SLK)2RxVMoGcc!*PTEon(Y)&O8X9%d8ztcJVZ4J z^%bnVS!;p@_oEzNIyzR!41rJ-3{msBDV`2Z^h0R)h-gNE`6gm1qSLcW(CG@?gOeX7 ziO*|7)rQYa%Dg)w=&oT1D=pW=_*H4d3ao>LFOMNJzM3Xhk!iYFVdXz`pPd-q5EG$a zRfJA@7fV7$9@z^-S)i<9+$WaH!ardk z8enE&21#`Oz~S~3flM^%UCJ<_NhFJlmBrM8|}4K9%{O5-XAIQcz=%X00MGQqL>)f-!F0DF04;D%Vc+H@-&7 zQwndwFKOb?em#2&qb-jmbd3QP9}-+tdqdFiTHF2Vayf%h4=2`J%_clPmY}Hc=5q5P z>5@T>*t69+E=rvD<rv!o6f|H0S;pRA-@=_*uQ8sE zD^Jc~ltiKyt4I8EcJ;wDjaA$rHGv;PI^M3Ok$JNAigJ%c3d5x?AtmwddP0jc*|$n` zV_sy!qq|J9VqNL)Ou+%?sx_fuP{NAjuMg@DB_b!AeYH+me{Q6AtyG4{M^&*tw6j08 zJ{=w6@di@D@nH~O?HdQg%eB)LXzS?2&M7~v_O!FM$_GewVbF>WlAo;f_2fEs#*EcG zzlJ-F9OWzs!--Ar{qpt4va~vF4B(mHI{5Ue>Ovw^#tRYNCut`=FhLlci+3VEEY0?Q z`z=pC^=W@}9=)|P+Dbg&%hOo&yKh%}40zfr%|@vn8#UaLT~FoKIGcXjFF)U%mb0MM zsYx%w7+PYg8yT#@3&+F7Qiu?f z@>+KK-F#tjL3CptqU_W)!qhH!XxEc+T8yu9{Vsmi)G7>ltkkCZ9b9o?G$dQ{Y!W*L z-wxDf97qipl2w|l^sOWSRw-JK%3@4HDPXoT+z8s2 zrMeHV3AH@7C5&=?knE@Q9pWrn04T`GDhshcUC#znCq;fCiDf*Z(r7$KoK?<<>-0Sk z9h`7hegw97NR6)IClU@UfeU*Ct8(^7vuHR^a8yHS(Yt|KSW-Ew-GVk&wOhTp%O+93 z;GiISf290G7;)Sf!N4?#D1lW+i3VW2v(OP8uSd;lZx$y-sv`wwHT!1_%x7%UYKlhq<6@w~VJrM)rmD=I1V9c9Hl z^;!9um-4r|+)lnn!jG^!?E=mpkk0A%PWSM^GMn7pb~L%(*Q3xbKgA-ROuey2*+ zWTfjZBA=%O$@dVZr8CNFP^}_L>!v|DVr{hNxonP)pzhyXT6IkuwEj$Uhhw7XH3%u#D&yE#fOeNx`&%@r7tgQ z#AIZG6>xf;{k#Em(B(}bnl>x90@68|imkBiM=fhkEx=Ls<}Sw0hQX2@qUAHMdf7-) zck>;bn^vo}*JnTX+9t5lV-zPa@U&D4m02hHnKxfeKu+SPHX#+~$WIrsX<^JX#a8W; zbk$18Esw7fU1!VMbF)v!;7LYV>YqoKY((gTmLcljUnJ~W5OhtJX7xBOTKl}#JD=+H z#63eW?3M0Pkhj*obtQ7zWe9q&6E2*baw~<{mXk+QpP$|Zf4zzJk5_~S4!MeDXs_;% zl4j${xJk4p4}Rh z<)Gs5fv5X;R0R*ib!=n0a=#}shJO+#FjUM#KKGgw7e%2Q4bTyN7QA}L1=^=!dts2j zR-Pqbjf0&$*9}}dL=ll8RWU{m2O5h02vk>{&0qx;tib$TAHu;Tf*<0LZ6mj{=(oiG%-WFJmroLHJU(R?}8n}(i&DHFZw7kZNvj;YZ|`8QW%0c^=UOtiJ20W zLUhDgWHHj%aF!oJ@C`=U9O7C)Lyn_m{wm^qre{>Xz*mupSr#`k#BClXs4_Ux>MYj3 z)ITVw#iT1Zpo`XJbsKqK&v+l4Oe=PBr_L4QL)mW#>$+-PU~&2GMo`5|6i=B&iM z9a_IDm2d}S^?Fp*yI0^RI=f3rxAfG@3S-eFvaV$8(<~vUOV9xiA_Occry=^9yCxE{ zMzAJX$X3P`U2AW5K5V&KBx@A@5+06&!_--OAu?R5s`Oc}ydO})1rZ&Kv&79*G$kVP zK?SBsYf%kmh&55V%PVj3v#p+*ej@OLUeuL$yV&Qg(_4M$R*3t40{AI;Dv zo$O};s`9XV|C~xlV0uWK@5Ob}lmEEYN!zXa(jj_3b=zVIg*-- z`<3^)v59Amk1hc0u-nSb&JN>4ot}QhMK(I0aL}#czs3$sw3Z7d{yMFC{N)0D@S^?G z@a|WsJG+g*mX^Sc#Ex@E_~O!CnkvH-UF1}g|6JvNc4HAGFu%*=a}Oh$=EbQK6tnY&7Z5WHmS9Ta253SkPuIWt$ZZI5zv7><-sj^xPqbZ2a7p9Fg(UBX3XQ%fm z&pJepYs{D>2nDsP#7=8axg8;yFMF95@&w|gNri1c#Lw(EOJH6_c-IO>E31$0?8w2` zgRT!9qA-O23dUgjy4fXoIJ(bnmW1uliSI2N^?%#8e|lAUMaQuVy(Y@eg@{$(+)VXt zNS1ThcSTrG?^%ZHFBZ3yPuY(OlH+egtH7`>D8y=^LK!Tlp$uR?lR))8z|&DQhygN zq)uBL@<%+}Ok%*|M(`M68b&UkW-ZaD^1%A=0hq_K*Zp(!-If3tO<(5~3^gv)87Zzi zVE_O4xsrp3uwid&I*cpv^aN*sE?x>edwaTXAW&Ts6F0#r$$+IMfbZZ#(PYS@8>$7MFv$M@sjTmnFqagwOu6_;l^kENdk2h;Z_}{i zL;?6hx^0zBu(6((^@(4DBEzcncB;kk`~!rE#w_VA1cyVKMceLr7`R?K zo6|)1KYL0S6?7o~-(^>y3EV;>mKny1m0$*&=#q3`0tZwb0RfdCJWrARv40O&Vl+z!U9#XoE= z!P+=w-(u>eFLJ~+=0f7<=KAyeS^ou^hwd*)w&>129yJF!lMZ-kwfq8c;< zst~j7i*PM2SUtD}X%?!8|T<0RCE&h|=+3V#l&^f4k1#=H69djsK zrn_D&HCW}aXeE60%N-&WWGt5?r9w-db!z#WIXC%NJ+LitLoP+W?$9V9CZ8VCSXobuegxUFVFeg$lHN^ zDp26%bJe5WB3Ji2alZ@k)BJJ$kcfyF!h-!oAiui95=Xp30#!iSGkUEWybTifjQKZT z>V@?EB^{HLs;3JaWCC-lsgampd8E!c(q+rc+G!lu1a}pQyz1WX z>2vUb(bJP1G4LRKi<744_1%~oo1^|+sMpCiFWjl2iTZYbB%bK9W4zWq7824D3vvbs zhUKQ<`?j&1lHIzE2PvkB({N#-pvcv8!;`Dgq#fYw2<#6Bw6=N%Sv|6W)yXatAEPS3 zXQ^NL)azM!_G`=U^xSMPoQZXm9E~H|*HSvbUt7_`?!<~(=VC1+uro~Z%T(|@5R#8!_t2&hqRrz+hl z8=Z)fGMti|G%7@l1`MXe8uyF>jWaY=%_Y9zbENA5&i_Q#2WCc~HbQee=-eE8TBzIC znF;um6p>}wWR#vkuW%!NYlY=p+opwFEO=@n=El6`U*9v?ocAgFPol+&`{0A02DCeJ zY8X92Y~4%4Tf>>O)J9Z`nYPotq&h1*A`Z*2EnBuWR+c=2dR2g`~%f>dWV}- zc145!|6HJH(GH!MIO{E#qr_^+@k1&n7foFO8&XO~Zj>{e36R8xkZu56YA!jiCt>;N* zJ6}b)EME(5{+j2odMI__H4rYF-m@b2NlFn=5v{>x3;f_G;h!e4$T-wFq);)E}2 zp(#*ER(%l~)aj1ZjH!nDMm_joh##<3Z} zqot%(1H_y+64=!k9#hh8%_mIpFmvX|9Xx&bRTHo^QT3&V8!VZVEss|qKUXO20l?E zH3ZL@pwJk6Y9QIwSGJP;TH1Z95m2+Ul3OO7gbM~>;m1zy?h$-+PrtxQjs<*dXAnt= zDH5I`4&$vpZ@T4GibmctV2u%cO_9|6lP;n1T4ABD|A4~^BEzKl|MkYiTUpv8Q6pbs zBr@LBX$P3$M`s*fm@mimPo&NOHMtR}p#YNL^6w;&bug8VZz+-!J2nD>fr)$!Cu@vv zG3Y2vJ0m}cdNyN#wDgH0f!wd@lG<6Wb1sJuE4J>39ShHfoos)RCnSr|+C@?_y3HOv z#C)0yi-x3@iq3JUTS?wX_%dgf#XDR?Cunw^#x$lD%GsQH#GZ8j7i-apSidWb$-9N3 z30LrK16;X({0SD^G$e&yp1>?xzExP$r8<0I4XVvY!I$3Ha0Ge2&c~g>@_kb%_^;w3 zzLpru1Vvo{Gb-ob)kEx3rNci=-XjoS-#&c=jGl>O@J=V7D?hUn0>sevvlSxMvRN&W z=y<^a7X6%|;5-^0g`0;CX}(mk!}#!(jC3qFjr^Zk1;3`rQA!O(RZgaFMF;XESO4U7 z+Ohp^jSa&NDreClau<8pAX}cm3`qwnrx^V3!)FU@dRHL2V zYetQZq12pthTct0);W)k3X%AGS5`?s1sHw1CT#Qlt3tn`ZJ?$Q!jfeQ)#hY%Ze3kY{f*Q#tao53hTeXkY zLg^L*B*>Xx)j&JR2$X$5uuHljIZc30lEvb;N`;j*xuMg&xLaz6_ag+&|5ybeYk>{D zvaCJVra8(%ta}5LCi;PImt#ENc8AL)A?wjs7y0Duxhmj37TTjYfWOF}rv%}dzre5* ze&=e5AEhxIPA)pqMEvAK#QY*xkg6XBMxdTi!huqSa>Lm1Z02uW6$&Z7lZFOZJ~uQ} zhA=PxwzXxW+`*MO6S|+_x}fi1z!e|8Tu$tY+OoCP5Y`!*u!C-34-~5Ajn={HuY<;s zu1^D7?lVaZZ?(zs4kB*znVI=S!rNxWV!4-8?PyKTRzHN`^GO%e$FcrX zYK8AwYr5r7l7SfeVnA~R*BX)}cNC4Lw}wZjB5oLQDJlxpSdVlq>xby|3oCGok9Fp5 z+9Q5vJagO7K{`5Vl0NKZ7h=@|0geOP@cqkD%hWBX{O>(Cg9N^|B)IMA4UMG7U*ZXW zS^2>1oyy;R0yQ6vK$iD}e8-xTW=-Tk*8t|2>wsTI%-<0TzjE+V7`m?QMfVrjx8o5L z^lRk)oOMOE2*QGYEo76YGrP(dPXuY=Xe}EI{@Id;TsqPJGPmqsk=sblP4M=grr?#` zu{s5c{ZrM)h+Y*fZa-l14@<93GmL+VCU1dCpWym`RU3&_GrAtBqNO>5Xa2p>+5qP@ z&~f&^z;NL|clBkk0ggiJ?zZ^RO^&FsT`-2P)ez#B{jj&)cfRTQ?qV}WQUdt0(Db?J zUw|u{fqKi0x>=Y2#YeEec2_1gbu9P5y+`=HnrrUg1hCaXh6U<>H|96K706e$y|Obnnjjw8MkTz7vO zt01)mFD64hdz8f@S-V*06F26FgkO6nE(s(&-(`?#d~rWJDjke(Y2*vu7D4Jv$N6^{ zo#-G#*>dr^6#}_gCff3$^DCUZ^hRh-#Ao>{K<~%L1I*9~ysKuozCXZ+As7)g9PR1p zS8CpERh70~aUbi|vKREwT+u2c=?0Sr!t8@aO2oxf37|F>c3;0e?yOj;2HCd!XmZhLgE zwb#cIi^ai`7WemSuG`O>9ty5XLg4jN;sb;oKj3L1dS%T&A946={aECe=AKaY8xq+v z#Ro+zZa|3s!6s!ec^`F*6Y%Gp)>+O~N#eG~5W57S!kSilFqx6OdAX`ukE8`n(j#aO zWKEyd8i8zRPhR+wm^ja~JR>ao@*3zK1_V8YS~@-Yxln=OHN0vE$)sN*okZGO{lESa z#1j{R2URy3>tg1lVow$xH+B`Mh8A;>WQ{`iXXo=4W=dN{{m&r9jYPg*k8b$r**XP9 z&k?@OjaIMP7pkIQj)5E{&Y#_gN;l|c#cAdG_lR0{)bZP8bkt}JZipCDJcvIy23G{s zCkO7PHa<7FjBW}z?g4LgIe!!VtsZ~XuNzV=*W!y{c+H6hk*FRx5XP{3ZRKnC0c5_D zL`mmaGJ-&zm#Z&&6p;lBgC6Oei3s=?t$u7KD2qM;vX0yEfB?FnD@OwCycYwXeQ|gu-=3dg-ReJpj(63TUU4f%^oLCb05@*y z^J&JN@IJR_fa7UPSi^^pmuLsaSy4kNRmRWhmkUSCTl1t?^ z!BW*{kv)P5`|a?G&O$p#!(ap`l)#3NR#;+WH_Nv>kKH0bO&S1QHIHBl;%>n7dMMC7 zeG~GRVcz`kllq<>>BV{^)R9T8UZqGYMZG6$VixGg1fPGe=r`xqNor1BCZT4g`W5y> z>nJJB!+CVd%~^Mn_8M%HYOwZ}d%#1jqb&ii7g};#*dCx#^u(*^FrG*DX2-So z1{`h@Wv*xB$?4muCy+s00@mhA^uvO5<$(owZA1Z*-0qE%&MG7VSzL;SNg{|Jj4|RB zbi%kAau_#6#;4Nc^U}A8xqMRR$44aeP%eV=2C6@ee$g8C^Y2`P@~`y(P!rFA@~>I^ zRz?e8ZVLps3*q$u_30Tkp0;y`T`P|J`Q$b@>IvXqVhQ4puh`bBN_=Qjt!f9=qa)WD z>ueQO_nDet>A&%X(++~?{p&Lbf636pICm}PFp`S%h8^ocE1CF<1v7%Hi#>5WnD6>w z&BUv!j)3Vc3HWHc&2eZFHh64}y0%$+Lk=VGSg_2MmNk>Jo7T-Z5!t`*$tO++2JCGG zEWX_K!ZC+VgPhEJx%}D%OC$UsEf~xB)rLZ(Gz1`iBHu5N#Q1bxC}iFG^n&-R*9cpp z?HDJPZU2LeExrVGHatsS`Yn`|B&EdS_Y^wAMG3^{NmzpB{tCW*2NSK-`?gm;9rsMLMzbJF=qY9?Z+&(!uXJX)xwiv=XAmL}Zd0 zA^_1K;CPtbnvEs!gyow*RQ`*>c`=e?1mwOvt}wg+v^Pq>S5d9dH`ro|N?>lgpVw!| zJn&xO_6y#E2Eq5`D|Vp$ob&AT)nMqXVqQ!PX2sz~In5584E&Y2QJSDCS;%iw@i04B ziLFa=7F+TS*~RjsW&B`Ap>uN{l4bA<=0s$SA0hx=4P|Ilq7l+srT65sOu@~#%Otmq zsH87yl#ZVcOWM2G0d7^8t;E~LoOVISB;HK#%hzPFH45NX-W9$ z3wxCg8}aLI-Sea4u7}l!YN@c}_mQN~VNOS&US;)$%sg$wRi9|w1nn?k%ev=+;>_6& z1@6qGoGH4${5MlO8}xT0yB-)h4jvlXvvQ_%c+y)ZOuw>rn?1w%2J2Y;%7X|#uhNWp zQ9DTAnM)@c$FO^TabN;_W(;~wdCa51fhl+-AHTP-??Kp)A z&{I#jZ_}kFV6f(YB`RQl+C>uR&tZnuxdL@}W~2;OS=r;@iMFM6=H~Gl6V~{j(;{icpkQpD7tFy@dx48j$ znC!WQs()jxg3nZ`_k1XbPCW&g#b@fE4t+GJ^+0_`ng5Sit+PfYljuYVIy+i!cKIZ) z6DihOI|vs{n_ROZ*WS%xs0iU#^U#&=SV7yK?_M<+674t+w-Bc7{FX0#1tMpl8qqT}V^X*|0chTFOfD!0Ph4lXNk&ZsFSo<1Y0v2aPRtDZ~$VLk@n+mOYX(SnM~ zffW)(B1=Nx{;cfq$=ofPU@+%Qw1LtJ>K2ip>8?mDhb6#|Qud?mazh1^#*&uCwRQL8 z60=MYhHr*chE|(G%m+0xU-va2g)fGv1-VG5yI_0jq({-4PvrV+7NSlM;qDnR>^0-rO4`PHOEpp3w1sYnvb|zX?%%)MN%EQ!x&(!%}i_o?Pg? zvWe|q?Oev>r3j^syAKHF)>l#^fHDZ9i=>7~D0M0mOhD)uI@gb;-GrmfQAAXXq|}oW znNdlN!x8KBE1Lx@!qAb{vH?1SKI&zsRQv`xk>ET^eP-VHcrj?So4SD%-%ne?aOw^{ zRR#pfi9!s^QBsM{f(g9sA3Uvj0?7%TklnkW+4O`J8# zQ$TOAALd^T_{3z-Nl``L2?6;Q#~~ZUi3U4D^#qTPW_t#ZMRn%7t{xG$>JPVOvi72t z`4{QjFP{*^NGIUTViS=(p(R=ca%7}BpC%Y+a@*fy8T1;}3knmpnUj#>d(J{iiz-52 zQe6|#=}o@9ptoYjaF-p_qx_SWO#49c5Dap6iMp6Wqpx7Fr10MEYYV@L(M}kz+}hj0 z(J1%hNA(0BTQKfwcER~>U1t z_VIDFx;_|%TEA5bBSbi>I1q+$|R_+i)xF=zc{IP078fim%Bs$%>*RJ>nA>UKhiv>v&Z6*(p+?`RF7|$_1~^oh zM{x=~G+-%3()Q}AfYR~MlM!FI3=)=t>U75^7>?+KVu`dQFV(?jw~fqCB3<6Iq%E{m zPx0rV2@9&1`GQv#XYuTqlX~4)qTspz-B0~D()2IdfWxqamz~JDN9RPS z&wgW;bbf=IHK$iD;|rI^z);OtJ0<5t6$YB5!3T2iO<=~Pe~}{^Ds=-A=zDbPvm*)( z-XZ<=NJWkFsTLAc@?bS)P%se_0@PI8;Wtj_#)EADu`PSL-*Zx4qt%vE=HEN1mnA4e zu#!>vcp1o-E_Jb@2140*uvkyN1FXaK=3=!vGEK&BS;*7G8R;@&G?I@a z=GH`*s7k%1)T8i5y1hw{`QjTnmR+so&98oz)lVgb#@L(GPSD?9g`3 zdJRVK2HeR@G}W*ToxuU{cH3Iu)!7n%G3we{Ke>^=Nt@g>^ zuB5aJjB+^#J&=v>`T>&8%&XpU2!ZS#A0n#^gKl34lT%ay7l`YN z19Q3E%vUWZ88$>AJpFv|VTR|LTBhvnW>gUhC{6PSzp&>tFksmul^K02tQ;kaCM>i~ z=4vJba_Tw@=~9^$Ci`;4Bl-Tn&;Wy7Y~apH{t7#w9sJK=rvoIlm$ubaUr~PvJ`L>H zO9t_``cYzsa3Na$rCQ$K#%)v)4|t!m#t{#LCYE%{Bod)W{CE()VvhrlYuS)w1~yexAM0O&L)`Q)eyv&W&VbEWv3FS@0s{ zT#Y;u^VrT$&0y81s^;&`t1)xpKC`!O`%jwPJN_cK*zK3-b*yW^#{Rk!*jhoF;GYKn zXgHde@zbYwHkRGlz(i%TW`CK_ig#s zWoBa8BvMPY%kZ)1Z|LL_9`5L*y=run&u)%>Z@=ncjPIoqTFecL-sk-S-F%ffOSrXI zhOcfgQ&|;%ttj8|kFW5slN56Cz0Er8kQWvSPU6gRN~LF1GzMSC)tbqX7(bA?&!=jw z=oBu{@{AR$N)s=;2)+E?<}D_anf6=r&I8lIF`X_Ew2jHrWpu*3RV7E!{Y2v-Iy3(I zRp)4$Zm6f+LGZBXqJ!G|`qQRQ@gM3<`dJ6wx15oqo`gWq72K`uKo%)dz9G1-2{%V` z*K(cId{eYr)4;AHLeg@BMo-ZEeD+y85PTRX4*RGTR`ryl5&I86my36Bb&1SEq5J*& z^%ZIY(Lm_{Gb|U*r=V)KEoyZq3DQV56w+F0LCr19EH#*7>0YS|1w4WMC}SnQJ=-dv zC5b-I@VyqX7N-rD1){CM{0N3iX(gOjkhZ0?}Ydk02Z41qA`Zn&e8(;nm6mIDwFH5H9#S zZahP21LsJUt$yx-(GZmjC_T53Kk5~h5AV9L1%?AXZB>>mhVN;*|6r>lbk7oP@ExQy z0iTiv7b}^Xs4m65KY&}t_pAZV5>Sgo4O)R=R#}(`}zsN1_jNJ@=5K-9%I1pgjU>vh@IQigr?2U zX4Hk%{d%a{=Rj+D5x|Vtq)K47MDmTq-}!dQ5OGUL>iBrRi^1XsVmT>AYmW-rQ~0_| z33BFLhXgh_#re-$-IJUA$0z6`(}{QJEbdu2=2iO6;9*_yW>|uU^V?q(h&XlU9PEH6 zgKOXFNa?gi{36iN7yhsUye3uteWAdH5yNHD{a*aFPGr>vI66L&&NvaLfF(H*KNGJ` z@bQ<<1E|y=a5F*o!8dLgfBQE=cw@UC%FJeiVY&i0{%%Fhl@qE3dLIM)yxjTZrZvl3 z%_f@VnBHG*Z#OYY_z$-q3%T=oXL`R)(9OkSH3tX2qZ--VgWG^fZclni$A(b{Nkb&? z+Ps@dhQ{APp-}X=p;y6XH@V__DjI{&@&&UCr${wTxTQ^uuwDr2k$%v8**%l`v<+j4 z^S$Ck25LfN=}!;*fJv!5SVEgf_1hzCq@PLHZ59(5(1FCWCl)SVq;KHlA5PeLPD9M{ zzGV#~a$|BP$)YbtUZ1@y7mXZ?vb)ZkS?s`QJGo>nRl=Jqqo5;36baJCj_kz}b8j5; zoixO-JWe^HVUERC7H#5w&2M&3bkNQ6+81k<0*m)PI&K+s9Nq`(e->NdvRs6&UydfP zm$pjgWN=~obZ4%nX)#)0V2|9e_aZpS=7j2GAq@u3Ivz@CdJ+_p^f2T857Q%ml?T-l z`E{=(cPOTh^?$A!&R-q7r@PsT+IA}_x->26ix6HM%!6rVPEB>U{h$&^?!9-R9N~wv zRz4_nW3Bh9C!+tdB6Dw^0mJXC!7`uAd>F3K4LHC~`nhQn2KlsH*B^VmduEvZZa~f) znItD8rCq`UzuEI0yFJ3D--n9C`xI*DFw-5C{F}(e`qx+dKP1-EsBnOlQkc&?i~%F*Yo3SC&N5{8TTxl)E8#Y)l#-v z@TIiYV;j|=R;Maks|We-D+mh2EyDo!3tj;DUvB zmwFOr?vxhJnuRcY-zzd$$u*ZTEP_d-TL7hUh7_QS!bZJE5XIMcc_|s+iTb|403^h9 zY8zk{WJ~D{Z+qGG@_h=TM28We$Ln>o+ZEX5<$30Dj;de1=U&Ns%x|Zb`b8KaF1MT= z(=0Kn^Ng(V%7qojPX8rY=Vxd;W1ubQvn+m(BSydE=d*luA`)jZ$NUfX)yEvVzJ9dD z=8#Y?BUDiV+$d+{j=l@g{!>HMsqg8Z=`bp~e7*?W zL?$yL=#ezJpA?~+wWBeXYZ8GV9M_muZ#AvksV>d7@*37A_k5L=?i=!ztWt0%`0&^0 zA5Lm^F;L{zUNDiSggf0Ol@CH@X7XLD0JG|Sqd@D+0ZkMFcoNIKtlXLrwI6!_?3@HT z=t9}c{(y{1*=v&xe^QIIRH!qC&=I~~JF5tCE(sQ+JN9*RF?Ph9CO)3a zI@~>Z3!HZYc3gZ{AiCGICX}@UGNgdonLIW6z~@6#Hs1z3+iLF z5rnTW1?QYedhy9RFXz!Qb@9D#?Bg>&4@l$}YK=$W2{UE^U24l2miLQ20PkH*G;Qke zRpkvM&IA;Huahl}kwN@yUZ34jesPNU(pUe}fS_;7p5^^I@ul!r+i_lT zzZ)I4k*XRhKfcWuio=rq@p!hcIhKqwIpzii1i!f-m!g-&GdDIt;3gufBtvsZ^Of69 za@={#e?8i|+x|EOE!w3ypsq|i@h1mvj2OeKayD2Lxp-AtELQ0D;)f9H#t+4aOEVxI zjJM|KsZRvm2`dLQ;`H-Pdp^*fq>?(B+{ck4aLak>l5ABt!z;fdDvH6ZU!Ufuuuk`Q zgDwRpqG57XrQ%m3!ugLsv#tn45nO$e^5rkH&K2{+80@k1v8ME`v3SdX^l#3@*+(V- z_4+tb13$kn!Yj9mw|Elp;U-7AHtjr8(c&3DaU515d#P_r_i$o9_*vTrFhX=UeluOw zrc95!Dl%fAo8xEOoU~l*F6-zBP`oC# zGU5}0kn&<(AZicst%;v%@*3kFM?o|I_by+hM~8X6(}A%Sd6x%EZ$2e_8P=Q;%?VcX zEL)k%9t)wQDl3Zd1FgB3ZvYB*9$QoPop_`xH-KF8ruiL=_!<9|i)fVG9Poz-ztYij zcWA-7@*DA)O2J|apo(D!r}+wu)^Bpz+wEd^jsApUan?>@J5yTF5%slXBnuYY@6qp) zFS|HCoskT zJivc#(e8w?eoaTm&|>WFsh3yYJcidiDy)f9cc3&jp729j6h2bii@BCQ`^8;z|4DJs zKlxGMYg$&{s?(_CcIeO6y>2|{e%M-yS||>;1IMyuLW81^&PsWcD*}LeIC_)Z9-~2LN$E^8<*1#>_(a>&Z+d6UOPbd6{eN3DU7~ zICk)o35gS|iEOk|vcs(8H0cV4Qfd5mJ~ zC@9&g8wTlxd^11{(FuvMj_^iIAhRG#P_;P=mPiz)Gg;QZg{8G}2}(gR-$qUj4a%$qjs??xfd_m)BzrRb5v;f~ITASEd@EoX z=8U-JYKJF=Dq4I={MLc z<)fW+0cK&ioXw6@xCTUwq?=W3aKaM4+=e1hEo2yhchWHQNFeec@EyyL;&n@VGx6LrbL4Kn-a6Q{ME}?*P~Ax{y4(cdOVg~hSEWbs&cg6l zm0I6#VN>Jdp?{o?6x>OJSDJs{Rza>6P}+7XlrTEM5Fj=h!S_jZGtn=SitnNZnN>E=kS%Q@ z>6h4fSCQh>LxB+LHxCfo-8Ko-*s{y-ySktX!VE%nDvz*lm*uQuJUadcnr`qff_W}^ zQ;(>o?-Mq#Hh2_nDl0AhR&}_7hgXX&%`AhkB1tlpn{=`k?~S~hpYum=e2&;tRgZ7! z(Z-3&r;1IWUfbnXHNq&;bOW96*M)b126?`<@RMSbEwk{-cz|<+pA}Y7^rO{om|Z^= z-49)E6yFVkect)w3Shd!UmowF`IFC1JKWR_YO#q1_GY6h{GWmQ${aS&Yp}TqN!V7c zBpzcZ(HKZY1A#^E0dm?g4gO@n2c-J8Jj6jXR};1JWl-r zm5nwuBm5C0|36?Z{?YF|qZ20o2Y|2pWI5kr*=Z*sh+9>9&&a<_hIP zw}bTMHh!OUK&(A|)!<6*|8uvH7M&)#>ROrND60vtVEgtbiTqAxf2)AWee|<7%~-!! z$6o<#K2`dB638 z5rbPUtgjqo!Bk1yiFoEbr)#1E&hjJ~j6(sMcpq4)Kmes5`jnJ;2WC zxf4J68=8b(R)>Atd!pSKzsbvIS?-3ce+By+&v|=YH0XlN;I%G+^U>z4Uvm3>M+C9+ zrj8Py>B{lzk<9_*OLg6P!6{ZAux&$KI@tC59IzF|?0Vm&c2N5HweeilS#qKDQW0UBa`mvP?GC>x zb3?NEpYS6WnG5U7LR%Z}E;Gln9Mr2s)Xjn;HtbX5)Aqwd1ohWG6i8ehfEa9oyM=(><$gY^i%WkU(I}) zbn^A3(z`%A*C|@Fyt`;*`w3(x)Aq7E)+@;UI_M=lCS92`S9A~i8xF3pctc>@o1zyL zu``KY(=a??`21!!$Bpj8|92~%i_VhV+fLU`fwWIM!@Wjcz6Rx5PN z(3C+KEO}OarU8;ga&JKDZMDjHmdWx!l~z!)5(#%ZJ^cq(v_PUu1jKIA76>DAJvps( z)_zv9P|8=={6D~1#Bv331pTd1Mvj7|xefr*p6H%~uA$Z-gXuYsf+@F_K}AGp(q%F? zU7eDau_N>^ssW@yp)PLP7IVr5w4H8C$RNo?@p$Qaq4jP8s}K%<55-vyPXaYY9u)?? zzH;||k+c}^;>psSx5!SBbQH|!p=eo32(V=cVxEzp@F!ndCVh`(;vjMCZEAo9HVOzJ zNA2dDHPSr+7Ay+a-vO0T=ONQB4gub&kaQLSb10)ST$?Cn#!{_M1?&JZ#QY9D=>Uw* z#t?Jr6)?YNB1W(Y3^_jSKCCUc&aHDO(0rf-#m6AfuFE+r9p`llq?zv%X5ed=BxcKU zeoiFaY(YQ28i6kYCJM8T$L@jZFEYU5%n>(Oc!v-%zVICBd-*&1oAg6V3cs>%M8J%4 z7JR9L{9O0kGbsIIIx(+4-)!bf zZh|X^vdG8mxARmTrM*iJ?9iQg1Jr1~CZoq39N4(ldI(4N|B;JfXY*!^fmXRlg6acW zm*!FC-P+)GI=*=Zz7V{62;auvEq{`eD3`X-cUNJsQKOdDS07Y|k;FswC^Wi7{G;?k zJXV+$11W{!`IPE@=J}QD9K^c`5*k-_*roRpj?bdZbs1nc z^VbgW4HQE_H#WIK_~b+8%MHPT)^EEnGDHgwwOSg4TULrZDhmDNF zj1w;dmh}67Fzxaoa$eoM@r>zL3kwLT@@nA6ZU~(IXyUjY-{MSQC&RZM3oSJXc@pU9 zYdHI;6Lv9|TcNMBxF#EZNoXL@Dw7j8Ge+((Xi2K0rq2(0tT2+cU*Eig39W+cwQ?W5 zg=WrGF6cdU1&>tD=nI;QVFo31&6d%(dJQoJxhl0Z~lcx05B>k8+dyL znrOPvF^OQ;0`StV6Ge06%72_+y}_Exo4=<92t{x`|ZWLj!U$M zjcT8~jN6r4_ON3HY}5`sOPf*Shw*s)HQ~O2@K2f-X1$Jx<)SKWX*Bs-+`mt>V9|b$ z%lI!Vsux@GD&V6dXa&9qi}Uo@x!n!~^PaoClk4sQ+tcg+7^1|O`lR=h#@%4?IK#+K zYu-ewOG{prL0U=3xV6qFcB5vL7h+1Z+!P?H?XHFheTB6~tyJGmt%_ZDA|PJv9Us2$ zrR62{nZAK2+O*O#bF4fU;M|Ld(axX3fRV};4NvaWU~)Fyo4bynL9%XGy{$AC-hKJu z2uX|T7l;mN8ub9IFB%T0#gBDgxH=st--0fZsArr=m%mldJtR5sa9#QjbjY>iwQ{9$ z!{2GUp>$k}t(VU7oSDjC>ow`Z1bOw7Pkvt;)CE*~y0l=dep|lFdZRC||6G0&<0lz| zC_yE;u^`ooDj&5D?=Jyt{$mb*&(?zZR%^n09J+?IfsO_`Xc4c1Q+-201!2O5FR*wt zp$k;EYG63$2W-I!&8=CEF`Ivz)$jQxj1qUO4KfOJj(Dbl325yYO}^RNb*1g%CT%DQ0x7ou5Fm*G=m4DnMBa;yL9ihu zw@pK9w+Q|fZd|s$vJ&Xz6I)4W5HaZqg0D>*749kgHvIJ_jPDlF2G`Y3IZ=!xCZebE zQxh>^7Oubqut267TqeiUE8tbZND;jDTaz4Kp)pTMuop}nWA|gB#Re6P18af~Y^6xT zuG_#ID+Q+&dT?ndFxX^)(fQ2QtpRaZ8o-&9m@R}r?f6<4z8ZFbLg7m*6A=$?hL`^Y z@GYR75c6l?f4(bLh|^P*QTvE!kz;D7CT$5CCP|k zAD2~S@gRFT%5~0!-2J3;z+Wucb;n#K*zX}0yLo*kMyp;k*>7$iHDdkq6zSz+C&zHP zdyoyNS9{M?6VGN;#;qwdCUm=KsM_>z-KOQ2gEq+;8W{HNQCpG8mTteFUy?Lelwzt$ zi`ARfV)HIHKWM=~Cv$@Bvn_4`fxfn?Q!ALp%fB&G(_=D2%bT;D5q%8z$GnsC^{CvY zKjU{Q_P<=K`LEk@Us;>3UBD(%?d|_0X0i%(mcRH`FwuY+IW32sc;D$vUg(<8^fScA zpYD(#+i{2bCxiO85^i;B?>r;d)(eWi|FM%n7{0UFy?2{k1^n$%+wKyzR%2<;TK5h4 zX1CD6CJaY{cFF7D1%LSV@8O6w=M(%624Ab_NY>b5c5C}b7U~SG!nsga1_;K-cQbRn z&HQ+Qoe7(~axV^9$xzVloc^i5RuX!xOs}^(I0$OKbXT(+FQeYPXsioAo8jxby)ApY zV*2oWunI4(nW2qWc28UhB>8=FS4Cpuqk4DXqp>@%3FjDp{X~iC;g%*v<4Uq6Pm{OzRBwkT!sR_7}9o=J3*JuxhTV`0y0K zR7(Hb`BIyqZ2n6X$BuRmd`b*QOlr)v$)u`_`+04ve&|m}K^RMPZ?2<3L*>8+wFK^T zV8*EL=i_sx)fwL#6~Fv`(PB>4;O%DfXa=v<1ctp&1sC}G&M^EA01I`!Mu9t5#`F?}%6&-{o6%dYcJwEh}Q zB)GOG`Q}8Y!zUK|b;@+-Ua<2rr%PVKnoOD|J^kBx=ibel<^ZtPHkG>R5W(Dzteo!D$fNU+C*_fd5gVNJ&tt&4u_EndWgCt%Ut%F{}nf-^ho zmg_L7dxo^Y#LNHOn(QaOWhKR?Y16@t=I!G4Sc{0YB`LKI=$y%426GxXqp0X{OC3~; zO|f4Wk2-=tVPpe}DXpLJhtTTMsVDdzA4)PMOH;}}z!#@ejl1#{aD{()&})vgF+t>gJU zkF=h#L)!MnL>0TgYe*4)YnPUvNMONynm30(U?>jm#CAhlYP^~GnKOw-+lCjP8=Rn2 zesqd?zDe+WFEs!nxh!pq$vt|fbi=0nEH74~3GHpC^@ZH7_8D3Rexw&&eN4x|BLmaI zRDv%nYI0idO6u!Pcva166!9wm0`&(pvjS6b`w_w5^wXUYs|Nb6`=t0Fx0lUj3ECg- zf3_5g{sf_7?r4zU=L!DIDTm8VnjW3r2B2aoO*=tNgpomDhn!4qp@;6X#Cg%n?w*zY z%2D_3i|Z?UBCTxp`d?+?2qP1L#VtNGk0a=B>ZvtTMiw&}SN-f9bw*P9UD2KP69Pf0ozwtrULs!TiQoq#271NL4+A@RSZXuWT*cXjk+MW{>qaYzr;_Iou|hw*CMu z8)ySEm3wc%j>fIOtF2AeVJf$8sWVH}+Ez6x^!n^jh{= z92ErqVjmv=Xb(zh@p~`JRjaqB3#BSwSF6G(v!?gre#iVF&WVd{S*rTuv5gx+qP}-h z`k++?uj;+gzM*UCTXYhKkNbJNk=wXy6Bq?HF+N(b(-OVpNn% zVVwO~_hSZ8Qr$VZDxF9DDheqm{L|l6*}u~*YWeX72e#^45JV5Xe?%m`5R6@0A)*BW z=)klaZ@ZgN*P#(o4?qu^Ym;wU8)ZqYcfHj+(<-$iF@&WiqAb_M*0YsoC9AT~1 zBUwUf7+Mif7zgcbfd!FvTfEo8adEH$6>9SSbT0_vFx(WrdAG*`KZ+6o{4WqC6T#!a z=0<=;_kim7sHs(I5bE7e4iMzO_dPikf#2l^$e@B-p^pJ`f0&DwEA$_?srVEL3bOv| zuK<|IGf3qv2=h~0e=n1oS=|*9RyHog``Fq zfSQDGRv131i}5$u+s+66w|$bQ&(|~j{{=Dt&HsP^8+ZT$hTyJiuLQtni*ya@iU6<< fTLSjn9RXWipceox;00_!CIv82n1ulWK-K@*pTT7^ diff --git a/demos/browser/basic/skydome.jpg b/demos/images/skydome.jpg similarity index 100% rename from demos/browser/basic/skydome.jpg rename to demos/images/skydome.jpg diff --git a/demos/core/meshes-hit-test/wood.png b/demos/images/wood.png similarity index 100% rename from demos/core/meshes-hit-test/wood.png rename to demos/images/wood.png diff --git a/package.json b/package.json new file mode 100644 index 00000000..dfeeb3a1 --- /dev/null +++ b/package.json @@ -0,0 +1,53 @@ +{ + "name": "melown-js", + "version": "1.0.0", + "description": "JavaScript WebGL 3D maps rendering engine", + "main": "src/core/core.js", + "scripts": { + "test": "mocha --reporter spec", + "install": "npm-git install", + "dev": "WEBPACK_ENV=dev webpack --progress --colors --watch", + "build": "WEBPACK_ENV=build webpack" + }, + "repository": { + "type": "git", + "url": "git+https://github.com/melown/melown-js.git" + }, + "keywords": [ + "Web", + "JavaScript", + "3D", + "map", + "WebGL" + ], + "author": "David Levinsky", + "license": "BSD-3-Clause", + "bugs": { + "url": "https://github.com/melown/melown-js/issues" + }, + "homepage": "https://github.com/melown/melown-js#readme", + "devDependencies": { + "babel-core": "^6.24.0", + "babel-loader": "^6.4.1", + "babel-preset-es2015": "^6.24.0", + "chai": "^3.5.0", + "copy-webpack-plugin": "^4.0.1", + "css-loader": "^0.27.3", + "extract-text-webpack-plugin": "^2.1.0", + "html-webpack-plugin": "^2.28.0", + "install": "^0.8.7", + "mocha": "^3.2.0", + "serve": "^5.0.4", + "style-loader": "^0.16.1", + "webpack": "^2.3.1", + "webpack-dev-server": "^2.4.2", + "yarn": "^0.21.3" + }, + "dependencies": { + "geographiclib": "^1.47.0", + "npm-git-install": "^0.3.0" + }, + "gitDependencies": { + "proj4": "https://github.com/melown/proj4js.git#master" + } +} diff --git a/src/browser/browser.js b/src/browser/browser.js index 9f9deabf..ae3654bf 100755 --- a/src/browser/browser.js +++ b/src/browser/browser.js @@ -1,3 +1,13 @@ +require('browser/ui/ui'); +require('core/interface'); +require('browser/autopilot/autopilot'); +require('browser/rois/rois'); +require('browser/control-mode/control-mode'); +require('browser/control-mode/map-observer'); +require('browser/control-mode/disabled'); +require('browser/control-mode/pano'); +require('browser/presenter/presenter'); + /** * @constructor */ diff --git a/src/browser/index.js b/src/browser/index.js new file mode 100644 index 00000000..1e2b959c --- /dev/null +++ b/src/browser/index.js @@ -0,0 +1,3 @@ +Melown = {}; +require('browser/interface'); +module.exports = Melown; diff --git a/src/browser/interface.js b/src/browser/interface.js index f73f69bf..f676c559 100755 --- a/src/browser/interface.js +++ b/src/browser/interface.js @@ -1,4 +1,15 @@ +require('browser/presenter/css/main.css'); +require('browser/presenter/css/panel.css'); +require('browser/presenter/css/subtitles.css'); +require('browser/browser.css'); +require('browser/browser'); +require('browser/config'); + +/** + * MapBrowser craetes browser with Map inside + * @constructor + */ Melown.MapBrowser = function(element_, config_) { var interface_ = new Melown.BrowserInterface(element_, config_); return interface_.core_ ? interface_ : null; @@ -497,95 +508,3 @@ Melown.BrowserInterface.prototype.getParam = function(key_) { Melown.getBrowserVersion = function() { return "Browser: 1.17, Core: " + Melown.getCoreVersion(); }; - -//prevent minification -Melown["MapBrowser"] = Melown.MapBrowser; -Melown["mapBrowser"] = Melown.MapBrowser; -Melown.BrowserInterface.prototype["getRenderer"] = Melown.BrowserInterface.prototype.getRenderer; -Melown.BrowserInterface.prototype["getPresenter"] = Melown.BrowserInterface.prototype.getPresenter; -Melown.BrowserInterface.prototype["getProj4"] = Melown.BrowserInterface.prototype.getProj4; -Melown.BrowserInterface.prototype["getUI"] = Melown.BrowserInterface.prototype.getUI; -Melown.BrowserInterface.prototype["destroy"] = Melown.BrowserInterface.prototype.destroy; -Melown.BrowserInterface.prototype["setControlMode"] = Melown.BrowserInterface.prototype.setControlMode; -Melown.BrowserInterface.prototype["getControlMode"] = Melown.BrowserInterface.prototype.getControlMode; -Melown.BrowserInterface.prototype["loadMap"] = Melown.BrowserInterface.prototype.loadMap; -Melown.BrowserInterface.prototype["destroyMap"] = Melown.BrowserInterface.prototype.destroyMap; -Melown.BrowserInterface.prototype["setPosition"] = Melown.BrowserInterface.prototype.setPosition; -Melown.BrowserInterface.prototype["getPosition"] = Melown.BrowserInterface.prototype.getPosition; -Melown.BrowserInterface.prototype["getCurrentCredits"] = Melown.BrowserInterface.prototype.getCurrentCredits; -Melown.BrowserInterface.prototype["setView"] = Melown.BrowserInterface.prototype.setView; -Melown.BrowserInterface.prototype["getView"] = Melown.BrowserInterface.prototype.getView; -Melown.BrowserInterface.prototype["getCredits"] = Melown.BrowserInterface.prototype.getCredits; -Melown.BrowserInterface.prototype["getCreditsInfo"] = Melown.BrowserInterface.prototype.getCreditsInfo; -Melown.BrowserInterface.prototype["getViews"] = Melown.BrowserInterface.prototype.getViews; -Melown.BrowserInterface.prototype["getViewInfo"] = Melown.BrowserInterface.prototype.getViewInfo; -Melown.BrowserInterface.prototype["getBoundLayers"] = Melown.BrowserInterface.prototype.getBoundLayers; -Melown.BrowserInterface.prototype["getBoundLayerInfo"] = Melown.BrowserInterface.prototype.getBoundLayerInfo; -Melown.BrowserInterface.prototype["getFreeLayers"] = Melown.BrowserInterface.prototype.getFreeLayers; -Melown.BrowserInterface.prototype["getFreeLayerInfo"] = Melown.BrowserInterface.prototype.getFreeLayerInfo; -Melown.BrowserInterface.prototype["getSurfaces"] = Melown.BrowserInterface.prototype.getSurfaces; -Melown.BrowserInterface.prototype["getSurfaceInfo"] = Melown.BrowserInterface.prototype.getSurfaceInfo; -Melown.BrowserInterface.prototype["getSrses"] = Melown.BrowserInterface.prototype.getSrses; -Melown.BrowserInterface.prototype["getSrsInfo"] = Melown.BrowserInterface.prototype.getSrsInfo; -Melown.BrowserInterface.prototype["getReferenceFrame"] = Melown.BrowserInterface.prototype.getReferenceFrame; -Melown.BrowserInterface.prototype["convertPositionViewMode"] = Melown.BrowserInterface.prototype.convertPositionViewMode; -Melown.BrowserInterface.prototype["convertPositionHeightMode"] = Melown.BrowserInterface.prototype.convertPositionHeightMode; -Melown.BrowserInterface.prototype["convertCoords"] = Melown.BrowserInterface.prototype.convertCoords; -Melown.BrowserInterface.prototype["convertCoordsFromNavToPhys"] = Melown.BrowserInterface.prototype.convertCoordsFromNavToPhys; -Melown.BrowserInterface.prototype["convertCoordsFromNavToCanvas"] = Melown.BrowserInterface.prototype.convertCoordsFromNavToCanvas; -Melown.BrowserInterface.prototype["convertCoordsFromPhysToCanvas"] = Melown.BrowserInterface.prototype.convertCoordsFromPhysToCanvas; -Melown.BrowserInterface.prototype["convertCoordsFromNavToCameraSpace"] = Melown.BrowserInterface.prototype.convertCoordsFromNavToCameraSpace; -Melown.BrowserInterface.prototype["convertCoordsFromPhysToCameraSpace"] = Melown.BrowserInterface.prototype.convertCoordsFromPhysToCameraSpace; -Melown.BrowserInterface.prototype["clonePosition"] = Melown.BrowserInterface.prototype.clonePosition; -Melown.BrowserInterface.prototype["arePositionsSame"] = Melown.BrowserInterface.prototype.arePositionsSame; -Melown.BrowserInterface.prototype["setPositionCoords"] = Melown.BrowserInterface.prototype.setPositionCoords; -Melown.BrowserInterface.prototype["getPositionCoords"] = Melown.BrowserInterface.prototype.getPositionCoords; -Melown.BrowserInterface.prototype["setPositionHeight"] = Melown.BrowserInterface.prototype.setPositionHeight; -Melown.BrowserInterface.prototype["getPositionHeight"] = Melown.BrowserInterface.prototype.getPositionHeight; -Melown.BrowserInterface.prototype["setPositionOrientation"] = Melown.BrowserInterface.prototype.setPositionOrientation; -Melown.BrowserInterface.prototype["getPositionOrientation"] = Melown.BrowserInterface.prototype.getPositionOrientation; -Melown.BrowserInterface.prototype["setPositionViewExtent"] = Melown.BrowserInterface.prototype.setPositionViewExtent; -Melown.BrowserInterface.prototype["getPositionViewExtent"] = Melown.BrowserInterface.prototype.getPositionViewExtent; -Melown.BrowserInterface.prototype["setPositionFov"] = Melown.BrowserInterface.prototype.setPositionFov; -Melown.BrowserInterface.prototype["getPositionFov"] = Melown.BrowserInterface.prototype.getPositionFov; -Melown.BrowserInterface.prototype["getPositionViewMode"] = Melown.BrowserInterface.prototype.getPositionViewMode; -Melown.BrowserInterface.prototype["getPositionHeigthMode"] = Melown.BrowserInterface.prototype.getPositionHeigthMode; -Melown.BrowserInterface.prototype["getPositionCanvasCoords"] = Melown.BrowserInterface.prototype.getPositionCanvasCoords; -Melown.BrowserInterface.prototype["getPositionCameraCoords"] = Melown.BrowserInterface.prototype.getPositionCameraCoords; -Melown.BrowserInterface.prototype["movePositionCoordsTo"] = Melown.BrowserInterface.prototype.movePositionCoordsTo; -Melown.BrowserInterface.prototype["getSurfaceHeight"] = Melown.BrowserInterface.prototype.getSurfaceHeight; -Melown.BrowserInterface.prototype["getDistance"] = Melown.BrowserInterface.prototype.getDistance; -Melown.BrowserInterface.prototype["getAzimuthCorrection"] = Melown.BrowserInterface.prototype.getAzimuthCorrection; -Melown.BrowserInterface.prototype["getCameraInfo"] = Melown.BrowserInterface.prototype.getCameraInfo; -Melown.BrowserInterface.prototype["getMapStats"] = Melown.BrowserInterface.prototype.getMapStats; -Melown.BrowserInterface.prototype["isPointInsideCameraFrustum"] = Melown.BrowserInterface.prototype.isPointInsideCameraFrustum; -Melown.BrowserInterface.prototype["isBBoxInsideCameraFrustum"] = Melown.BrowserInterface.prototype.isBBoxInsideCameraFrustum; -Melown.BrowserInterface.prototype["generateTrajectory"] = Melown.BrowserInterface.prototype.generateTrajectory; -Melown.BrowserInterface.prototype["redraw"] = Melown.BrowserInterface.prototype.redraw; -Melown.BrowserInterface.prototype["addRenderSlot"] = Melown.BrowserInterface.prototype.addRenderSlot; -Melown.BrowserInterface.prototype["moveRenderSlotBefore"] = Melown.BrowserInterface.prototype.moveRenderSlotBefore; -Melown.BrowserInterface.prototype["moveRenderSlotAfter"] = Melown.BrowserInterface.prototype.moveRenderSlotAfter; -Melown.BrowserInterface.prototype["removeRenderSlot"] = Melown.BrowserInterface.prototype.removeRenderSlot; -Melown.BrowserInterface.prototype["setRenderSlotEnabled"] = Melown.BrowserInterface.prototype.setRenderSlotEnabled; -Melown.BrowserInterface.prototype["getRenderSlotEnabled"] = Melown.BrowserInterface.prototype.getRenderSlotEnabled; -Melown.BrowserInterface.prototype["setLoaderSuspended"] = Melown.BrowserInterface.prototype.setLoaderSuspended; -Melown.BrowserInterface.prototype["getLoaderSuspended"] = Melown.BrowserInterface.prototype.getLoaderSuspended; -Melown.BrowserInterface.prototype["getGpuCache"] = Melown.BrowserInterface.prototype.getGpuCache; -Melown.BrowserInterface.prototype["getHitCoords"] = Melown.BrowserInterface.prototype.getHitCoords; -Melown.BrowserInterface.prototype["flyTo"] = Melown.BrowserInterface.prototype.flyTo; -Melown.BrowserInterface.prototype["flyTrajectory"] = Melown.BrowserInterface.prototype.flyTrajectory; -Melown.BrowserInterface.prototype["setAutorotate"] = Melown.BrowserInterface.prototype.setAutorotate; -Melown.BrowserInterface.prototype["getAutorotate"] = Melown.BrowserInterface.prototype.getAutorotate; -Melown.BrowserInterface.prototype["setAutopan"] = Melown.BrowserInterface.prototype.setAutopan; -Melown.BrowserInterface.prototype["getAutopan"] = Melown.BrowserInterface.prototype.getAutopan; -Melown.BrowserInterface.prototype["cancelFlight"] = Melown.BrowserInterface.prototype.cancelFlight; -Melown.BrowserInterface.prototype["on"] = Melown.BrowserInterface.prototype.on; -Melown.BrowserInterface.prototype["getMapElement"] = Melown.BrowserInterface.prototype.getMapElement; -Melown.BrowserInterface.prototype["getControl"] = Melown.BrowserInterface.prototype.getControl; -Melown.BrowserInterface.prototype["addControl"] = Melown.BrowserInterface.prototype.addControl; -Melown.BrowserInterface.prototype["removeControl"] = Melown.BrowserInterface.prototype.removeControl; -Melown.BrowserInterface.prototype["setParams"] = Melown.BrowserInterface.prototype.setParams; -Melown.BrowserInterface.prototype["setParam"] = Melown.BrowserInterface.prototype.setParam; -Melown.BrowserInterface.prototype["getParam"] = Melown.BrowserInterface.prototype.getParam; -Melown["getBrowserVersion"] = Melown.getBrowserVersion; - diff --git a/src/browser/ui/control/holder.js b/src/browser/ui/control/holder.js index 2f14a255..f8c064ea 100755 --- a/src/browser/ui/control/holder.js +++ b/src/browser/ui/control/holder.js @@ -1,3 +1,7 @@ +require('browser/ui/element/element'); +require('browser/ui/element/events'); +require('browser/ui/element/draggable'); + /** * @constructor */ diff --git a/src/browser/ui/element/events.js b/src/browser/ui/element/events.js index d83a2ccd..cada4954 100755 --- a/src/browser/ui/element/events.js +++ b/src/browser/ui/element/events.js @@ -1,3 +1,5 @@ +require('browser/utility/utility'); +require('browser/ui/element/event'); Melown.UIElement.prototype.on = function(type_, function_, externalElement_) { this.addEvent(type_, function_, externalElement_); diff --git a/src/browser/ui/ui.js b/src/browser/ui/ui.js index a5b86073..a1ca0920 100755 --- a/src/browser/ui/ui.js +++ b/src/browser/ui/ui.js @@ -1,3 +1,18 @@ +require('browser/utility/dom'); +require('browser/ui/control/map'); +require('browser/ui/control/holder'); +require('browser/ui/control/compass'); +require('browser/ui/control/credits'); +require('browser/ui/control/fullscreen'); +require('browser/ui/control/zoom'); +require('browser/ui/control/space'); +require('browser/ui/control/search'); +require('browser/ui/control/link'); +require('browser/ui/control/layers'); +require('browser/ui/control/fallback'); +require('browser/ui/control/popup'); +require('browser/ui/control/loading'); + /** * @constructor */ diff --git a/src/browser/utility/dom.js b/src/browser/utility/dom.js index 7024f529..b16a99d5 100755 --- a/src/browser/utility/dom.js +++ b/src/browser/utility/dom.js @@ -1,3 +1,4 @@ +require('browser/utility/utility'); //Melown.Utils.dragging_ = false; diff --git a/src/core/_minify.js b/src/core/_minify.js index 1133fcd9..8ed06e02 100755 --- a/src/core/_minify.js +++ b/src/core/_minify.js @@ -1,25 +1 @@ -/** @define {boolean} */ -var Melown_MERGE = true; - -/** @define {boolean} */ -var SEZNAMCZ = false; - var Melown = {}; - -//prevent minification -window["M"] = Melown; -window["Melown"] = Melown; -window["ga"] = (window["ga"] != null) ? window["ga"] : {}; //google analytics -window["MelownMap_"] = (window["MelownMap_"] != null) ? window["MelownMap_"] : null; -window["Q"] = (window["Q"] != null) ? window["Q"] : {}; //google analytics -window["$"] = (window["$"] != null) ? window["$"] : {}; //jquery, ... - - -//demo -//cat init.js matrix.js math.js utility.js config.js bbox.js cache.js camera.js geometry.js gpuDevice.js gpuMesh.js gpuProgram.js gpuShaders.js gpuTexture.js gpuTile.js mesh.js metatile.js renderer.js tile.js tileid.js browser.js demo.js > minifiedViewer.js - -//only lib -//cat init.js matrix.js math.js utility.js config.js bbox.js cache.js camera.js geometry.js gpuDevice.js gpuMesh.js gpuProgram.js gpuShaders.js gpuTexture.js gpuTile.js mesh.js metatile.js renderer.js tile.js tileid.js browser.js > minifiedViewer.js - -//minify -//http://closure-compiler.appspot.com/home \ No newline at end of file diff --git a/src/core/config.js b/src/core/config.js index 19925e9b..96bc0f3c 100755 --- a/src/core/config.js +++ b/src/core/config.js @@ -1,4 +1,4 @@ - +require('./core'); Melown.Core.prototype.initConfig = function() { this.config_ = { diff --git a/src/core/core.js b/src/core/core.js index be732b4f..1c2bd670 100755 --- a/src/core/core.js +++ b/src/core/core.js @@ -1,3 +1,27 @@ +import Proj4 from 'proj4'; +require('./inspector/inspector'); +require('./inspector/stats'); +require('./inspector/graphs'); +require('./inspector/layers'); +require('./inspector/replay'); +require('./inspector/stylesheets'); +require('./inspector/input'); +require('./renderer/renderer'); +require('./renderer/draw'); +require('./renderer/interface'); +require('./renderer/init'); +require('./utils/url'); +require('./utils/platform'); +require('./map/map'); +require('./map/url'); +require('./map/config'); +require('./map/measure'); +require('./map/surface-sequence'); +require('./map/render-slots'); +require('./map/interface'); +require('./map/camera'); +require('./map/draw'); +require('./utils/utils'); /** * @constructor @@ -22,7 +46,7 @@ Melown.Core = function(element_, config_, interface_) { this.mapInterface_ = null; this.renderer_ = new Melown.Renderer(this, this.element_, null, this.onResize.bind(this), this.config_); this.rendererInterface_ = new Melown.RendererInterface(this.renderer_); - this.proj4_ = window["_mproj4_"]; + this.proj4_ = Proj4; //platform detection Melown.Platform.init(); @@ -313,9 +337,3 @@ Melown.checkSupport = function() { return true; }; - - - - - - diff --git a/src/core/index.js b/src/core/index.js new file mode 100644 index 00000000..3011a850 --- /dev/null +++ b/src/core/index.js @@ -0,0 +1,3 @@ +Melown = {}; +require('core/interface'); +module.exports = Melown; diff --git a/src/core/interface.js b/src/core/interface.js index b2c85116..a9bdc05d 100755 --- a/src/core/interface.js +++ b/src/core/interface.js @@ -1,3 +1,6 @@ +require('core/core'); +require('core/config'); +require('core/update'); Melown.MapCore = function(element_, config_) { element_ = (typeof element_ !== "string") ? element_ : document.getElementById(element_); @@ -56,22 +59,3 @@ Melown.CoreInterface.prototype.callListener = function(name_, event_) { if (!this.core_) { return null; } this.core_.callListener(name_, event_); }; - -//prevent minification -Melown["MapCore"] = Melown.MapCore; -Melown["mapCore"] = Melown.MapCore; -Melown.CoreInterface.prototype["destroy"] = Melown.CoreInterface.prototype.destroy; -Melown.CoreInterface.prototype["loadMap"] = Melown.CoreInterface.prototype.loadMap; -Melown.CoreInterface.prototype["destroyMap"] = Melown.CoreInterface.prototype.destroyMap; -Melown.CoreInterface.prototype["getMap"] = Melown.CoreInterface.prototype.getMap; -Melown.CoreInterface.prototype["getRenderer"] = Melown.CoreInterface.prototype.getRenderer; -Melown.CoreInterface.prototype["on"] = Melown.CoreInterface.prototype.on; -Melown.CoreInterface.prototype["callListener"] = Melown.CoreInterface.prototype.callListener; -Melown["getCoreVersion"] = Melown.getCoreVersion; -Melown["checkSupport"] = Melown.checkSupport; - - - - - - diff --git a/src/core/map/config.js b/src/core/map/config.js index 214cf94e..08cdf2d0 100755 --- a/src/core/map/config.js +++ b/src/core/map/config.js @@ -1,3 +1,8 @@ +require('./srs'); +require('./refframe'); +require('./credit'); +require('./surface'); +require('./bound-layer'); Melown.Map.prototype.parseConfig = function() { //if (this.mapConfig_["version"] < 4) { diff --git a/src/core/map/interface.js b/src/core/map/interface.js index e29dc484..18115c1c 100755 --- a/src/core/map/interface.js +++ b/src/core/map/interface.js @@ -1,3 +1,4 @@ +require('core/map/trajectory'); /** * @constructor */ diff --git a/src/core/map/map.js b/src/core/map/map.js index 0fd16017..dfda99c1 100755 --- a/src/core/map/map.js +++ b/src/core/map/map.js @@ -1,3 +1,13 @@ +require('./position'); +require('./view'); +require('./cache'); +require('./loader'); +require('./stats'); +require('./resource-tree'); +require('./surface-tree'); + +/** **/ + /** @const */ var Melown_STILE_METADATA = 0; /** @const */ var Melown_STILE_MESH = 1; /** @const */ var Melown_STILE_TEXTURE = 2; diff --git a/src/core/map/measure.js b/src/core/map/measure.js index aa89e040..37785104 100755 --- a/src/core/map/measure.js +++ b/src/core/map/measure.js @@ -1,3 +1,4 @@ +var GeographicLib = require("geographiclib"); Melown.Map.prototype.getSurfaceHeight = function(coords_, lod_, storeStats_, node_, nodeCoords_, coordsArray_) { if (!node_) { diff --git a/src/core/map/mesh.js b/src/core/map/mesh.js index bec62af4..11a9d9a8 100755 --- a/src/core/map/mesh.js +++ b/src/core/map/mesh.js @@ -1,3 +1,5 @@ +require('./submesh'); + /** * @constructor */ diff --git a/src/core/map/metatile.js b/src/core/map/metatile.js index 18a73038..f9c26288 100755 --- a/src/core/map/metatile.js +++ b/src/core/map/metatile.js @@ -1,3 +1,5 @@ +require('./metanode'); + /** * @constructor */ diff --git a/src/core/map/position.js b/src/core/map/position.js index e582d0bf..7b14d24c 100755 --- a/src/core/map/position.js +++ b/src/core/map/position.js @@ -1,3 +1,5 @@ +var GeographicLib = require("geographiclib"); +require('core/utils/math'); /** * @constructor diff --git a/src/core/map/refframe.js b/src/core/map/refframe.js index 1101c3e1..eeba2144 100755 --- a/src/core/map/refframe.js +++ b/src/core/map/refframe.js @@ -1,3 +1,5 @@ +require('./division-node'); + /** * @constructor */ diff --git a/src/core/map/resource-node.js b/src/core/map/resource-node.js index 83994af4..4dadec31 100755 --- a/src/core/map/resource-node.js +++ b/src/core/map/resource-node.js @@ -1,3 +1,6 @@ +require('./metatile'); +require('./mesh'); + /** * @constructor */ diff --git a/src/core/map/resource-tree.js b/src/core/map/resource-tree.js index b153b323..1c1a48a5 100755 --- a/src/core/map/resource-tree.js +++ b/src/core/map/resource-tree.js @@ -1,3 +1,5 @@ +require('./resource-node'); + /** * @constructor */ diff --git a/src/core/map/srs.js b/src/core/map/srs.js index fb8ed321..ade1fe82 100755 --- a/src/core/map/srs.js +++ b/src/core/map/srs.js @@ -1,3 +1,6 @@ +require('./texture'); +var GeographicLib = require("geographiclib"); + /** * @constructor */ diff --git a/src/core/map/submesh.js b/src/core/map/submesh.js index f8ba6009..dc2ac0c9 100755 --- a/src/core/map/submesh.js +++ b/src/core/map/submesh.js @@ -1,8 +1,5 @@ - //! An index-less mesh. Each triangle has three items in the array 'vertices'. -if (Melown_MERGE != true){ if (!Melown) { var Melown = {}; } } //IE need it in very file - /** @const */ MelownSubmeshFlags_InternalTexcoords = 1; /** @const */ MelownSubmeshFlags_ExternalTexcoords = 2; /** @const */ MelownSubmeshFlags_PerVertexUndulation = 4; diff --git a/src/core/map/surface-tree.js b/src/core/map/surface-tree.js index cd2edc8f..a6efe540 100755 --- a/src/core/map/surface-tree.js +++ b/src/core/map/surface-tree.js @@ -1,3 +1,5 @@ +require('./surface-tile'); + /** * @constructor */ diff --git a/src/core/map/texture.js b/src/core/map/texture.js index be40533f..31d2726c 100755 --- a/src/core/map/texture.js +++ b/src/core/map/texture.js @@ -1,3 +1,5 @@ +require('./subtexture'); + /** * @constructor */ diff --git a/src/core/renderer/camera.js b/src/core/renderer/camera.js index 43da968e..8ef383ca 100755 --- a/src/core/renderer/camera.js +++ b/src/core/renderer/camera.js @@ -1,3 +1,4 @@ +require('core/utils/matrix') /** * @constructor diff --git a/src/core/renderer/geometry.js b/src/core/renderer/geometry.js index b11655a4..b34da674 100755 --- a/src/core/renderer/geometry.js +++ b/src/core/renderer/geometry.js @@ -1,3 +1,4 @@ +require('./bbox'); Melown.RendererGeometry = {}; diff --git a/src/core/renderer/gpu/texture.js b/src/core/renderer/gpu/texture.js index 319e5a5b..010cbbc5 100755 --- a/src/core/renderer/gpu/texture.js +++ b/src/core/renderer/gpu/texture.js @@ -1,3 +1,4 @@ +require('core/utils/http'); /** * @constructor diff --git a/src/core/renderer/init.js b/src/core/renderer/init.js index 94667ad0..91f035d2 100755 --- a/src/core/renderer/init.js +++ b/src/core/renderer/init.js @@ -1,3 +1,12 @@ +require('./gpu/program'); +require('./gpu/shaders'); +require('./gpu/mesh'); +require('./gpu/texture'); +require('./gpu/bbox'); +require('./gpu/font'); +require('./gpu/pixel-line3'); +require('./geometry'); + Melown.GpuBarycentricBuffer_ = null; Melown.Renderer.prototype.initShaders = function() { diff --git a/src/core/renderer/renderer.js b/src/core/renderer/renderer.js index 4b3a21c2..428da5f6 100755 --- a/src/core/renderer/renderer.js +++ b/src/core/renderer/renderer.js @@ -1,3 +1,5 @@ +require('./gpu/device'); +require('./camera'); //! maximum allowed projected texel size (affects LOD selection, i.e., display //! quality, and also control constraints) diff --git a/src/core/utils/libs/geographics-advanced.js b/src/core/utils/libs/geographics-advanced.js deleted file mode 100755 index 56433f73..00000000 --- a/src/core/utils/libs/geographics-advanced.js +++ /dev/null @@ -1,24 +0,0 @@ -var p={Y:{},Math:{},o:{}},E=p.Y;E.K={f:6378137,c:1/298.257223563};E.version={hb:1,ib:45,jb:0};E.kb="1.45"; -(function(a){a.Na=53;a.gb=Math.pow(.5,a.Na-1);a.ga=Math.PI/180;a.h=function(a){return a*a};a.hypot=function(a,b){var c,e;a=Math.abs(a);b=Math.abs(b);c=Math.max(a,b);e=Math.min(a,b)/(c?c:1);return c*Math.sqrt(1+e*e)};a.cbrt=function(a){var b=Math.pow(Math.abs(a),1/3);return 0>a?-b:b};a.log1p=function(a){var b=1+a,c=b-1;return 0===c?a:a*Math.log(b)/c};a.atanh=function(k){var b=Math.abs(k),b=a.log1p(2*b/(1-b))/2;return 0>k?-b:b};a.Ra=function(a,b){var c=a+b,e=c-b,m=c-e;return{H:c,t:-(e-a+(m-b))}};a.g= -function(a,b,c,e){for(var m=0>a?0:b[c++];0<=--a;)m=m*e+b[c++];return m};a.U=function(a){var b=Math.abs(a),b=.0625>b?.0625-(.0625-b):b;return 0>a?0-b:b};a.D=function(a){a%=360;return-180>a?a+360:180>a?a:a-360};a.xa=function(a){return 90c?-180:e)-c};a.ia=function(a){var b,c;b=a%360;c=Math.floor(b/90+.5);b=(b-90*c)*this.ga;a=Math.sin(b);b=Math.cos(b);switch(c&3){case 0:c=a;a=b;break;case 1:c=b; -a=0-a;break;case 2:c=0-a;a=0-b;break;default:c=0-b}return{H:c,fa:a}};a.fb=function(a,b){var c=0,e;Math.abs(a)>Math.abs(b)&&(c=b,b=a,a=c,c=2);0>b&&(b=-b,++c);e=Math.atan2(a,b)/this.ga;switch(c){case 1:e=(0d?b:d+n,g=0>g?b:g+n,d=Math.min(d,g),l=c(f.substr(l,d-l)),y+=l.m,l=l.s,h==a.NONE)h=l;else if(l!=a.NONE&&h!=l)throw Error("Incompatible hemisphere specifies in "+f.substr(0,d));if(0===e)throw Error("Empty or incomplete DMS string "+f);return{m:y,s:h}};c=function(f){var b={},c="",t,d,g,l,h,n, -q,v,u,A,C,x,D,r,z,B;do{t=1;d=0;g=f.length;l=a.NONE;h=-1;g>d&&0<=(h=k("SNWE",f.charAt(d)))&&(l=h&2?a.i:a.a,t=h&1?1:-1,++d);if(g>d&&0<=(h=k("SNWE",f.charAt(g-1)))&&0<=h){if(l!==a.NONE){c=f.charAt(d-1).toUpperCase()===f.charAt(g-1).toUpperCase()?"Repeated hemisphere indicators "+f.charAt(d-1)+" in "+f.substr(d-1,g-d+1):"Contradictory hemisphere indicators "+f.charAt(d-1)+" and "+f.charAt(g-1)+" in "+f.substr(d-1,g-d+1);break}l=h&2?a.i:a.a;t=h&1?1:-1;--g}g>d&&0<=(h=k("-+",f.charAt(d)))&&0<=h&&(t*=h?1: --1,++d);if(g===d)c="Empty or incomplete DMS string "+f;else{n=[0,0,0];q=[0,0,0];C=A=u=v=0;x=d;D=!1;for(z=r=0;xk("D'\":",f.charAt(x-1))){if(3<=v){c="Extra text following seconds in DMS string "+f.substr(d,g-d);break}if(0===C){c="Missing numbers in trailing component of "+ -f.substr(d,g-d);break}0a.length)return 0;a=a.toUpperCase().replace(/0+$/, -"");b="-"===a.charAt(0)?-1:1;c="-"===a.charAt(0)||"+"===a.charAt(0)?1:0;e=a.length-1;if(e+1c?"-inf":0c?-1:1;c*=l;h=Math.floor(c);g=Math.floor((c-h)*d+.5)/d;1<=g&&(h+=1,--g);c=[g,0,0];for(g=1;g<=e;++g)d=Math.floor(c[g-1]),n=c[g-1]-d,c[g]=60*n,c[g-1]=d;c[0]+=h;h="";m===a.NONE&&0>l&&(h+="-");switch(e){case a.ta:h+=b(c[0].toFixed(k),m===a.NONE?0:1+Math.min(m,2)+k+(k?1:0))+"\u00b0";break;default:switch(h+=b(c[0].toFixed(0),m===a.NONE?0:1+Math.min(m,2))+"\u00b0",e){case a.ya:h+=b(c[1].toFixed(k),2+k+(k?1:0))+"'"; -break;case a.za:h+=b(c[1].toFixed(0),2)+"'",h+=b(c[2].toFixed(k),2+k+(k?1:0))+'"'}}m!==a.NONE&&m!==a.v&&(h+="SNWE".charAt((m===a.a?0:2)+(0>l?0:1)));return h}})(p.wa);p.b={};p.J={};p.G={}; -(function(a,k,b,c,e){var m,f,w,y,t,d,g,l,h,n;a.Sa=Math.sqrt(Number.MIN_VALUE);a.R=6;a.S=6;a.T=6;a.j=6;a.l=6;m=a.j*(a.j-1)/2;f=a.l*(a.l+1)/2;a.w=1;a.V=2;a.I=4;a.W=8;a.X=16;a.NONE=0;a.a=128;a.i=256|a.W;a.v=512;a.ua=1024|a.w;a.Aa=a.a|a.i|a.v|a.ua;a.va=2048|a.w|a.V;a.cb=4096|a.w|a.I;a.ab=8192|a.w|a.I;a.Va=16384|a.X;a.ka=32671;a.Z=32768;a.bb=32640|a.Z;a.eb=function(a,c,b,d){for(var e=d.length,g=e-(a?1:0),h=2*(b-c)*(b+c),f=g&1?d[--e]:0,k=0,g=Math.floor(g/2);g--;)k=h*f-k+d[--e],f=h*k-f+d[--e];return a?2* -c*b*f:b*(f-k)};w=[1,4,64,0,256];a.Ta=function(a){var b=Math.floor(3);return(c.g(b,w,0,c.h(a))/w[b+1]+a)/(1-a)};y=[-1,6,-16,32,-9,64,-128,2048,9,-16,768,3,-5,512,-7,1280,-7,2048];a.la=function(b,d){var e=c.h(b),g=b,h=0,f,k;for(f=1;f<=a.R;++f)k=Math.floor((a.R-f)/2),d[f]=g*c.g(k,y,h,e)/y[h+k+1],h+=k+2,g*=b};t=[205,-432,768,1536,4005,-4736,3840,12288,-225,116,384,-7173,2695,7680,3467,7680,38081,61440];a.ma=function(b,d){var e=c.h(b),g=b,h=0,f,k;for(f=1;f<=a.S;++f)k=Math.floor((a.S-f)/2),d[f]=g*c.g(k, -t,h,e)/t[h+k+1],h+=k+2,g*=b};d=[-11,-28,-192,0,256];a.Ua=function(a){var b=Math.floor(3);return(c.g(b,d,0,c.h(a))/d[b+1]-a)/(1+a)};g=[1,2,16,32,35,64,384,2048,15,80,768,7,35,512,63,1280,77,2048];a.na=function(b,d){var e=c.h(b),h=b,f=0,k,m;for(k=1;k<=a.T;++k)m=Math.floor((a.T-k)/2),d[k]=h*c.g(m,g,f,e)/g[f+m+1],f+=m+2,h*=b};a.b=function(a,b){this.f=a;this.c=b;this.C=1-this.c;this.u=this.c*(2-this.c);this.Ja=this.u/c.h(this.C);this.O=this.c/(2-this.c);this.A=this.f*this.C;this.ba=(c.h(this.f)+c.h(this.A)* -(0===this.u?1:(0=e;--g)f=Math.min(a.j-g-1,g),this.$[d++]=c.g(f,h,b,this.O)/h[b+f+1],b+=f+2};n=[97,15015,1088,156,45045,-224,-4784,1573,45045,-10656,14144,-4576,-858,45045,64,624,-4576,6864,-3003,15015,100,208,572,3432,-12012,30030,45045,1,9009,-2944,468,135135,5792,1040,-1287,135135, -5952,-11648,9152,-2574,135135,-64,-624,4576,-6864,3003,135135,8,10725,1856,-936,225225,-8448,4992,-1144,225225,-1440,4160,-4576,1716,225225,-136,63063,1024,-208,105105,3584,-3328,1144,315315,-128,135135,-2560,832,405405,128,99099];a.b.prototype.qa=function(){var b=0,e=0,d,g,f;for(d=0;d=d;--g)f=a.l-g-1,this.aa[e++]=c.g(f,n,b,this.O)/n[b+f+1],b+=f+2};a.b.prototype.pa=function(b,d){var e=1,g=0,f,h;for(f=1;fa?-b:b};a.log1p=function(a){var b=1+a,c=b-1;return 0===c?a:a*Math.log(b)/c};a.atanh=function(l){var b=Math.abs(l),b=a.log1p(2*b/(1-b))/2;return 0>l?-b:b};a.sum=function(a,b){var c=a+b,e=c-b,k=c-e;return{s:c, -t:-(e-a+(k-b))}};a.polyval=function(a,b,c,e){for(var k=0>a?0:b[c++];0<=--a;)k=k*e+b[c++];return k};a.AngRound=function(a){var b=Math.abs(a),b=.0625>b?.0625-(.0625-b):b;return 0>a?0-b:b};a.AngNormalize=function(a){a%=360;return-180>a?a+360:180>a?a:a-360};a.LatFix=function(a){return 90c?-180:e)-c};a.sincosd=function(a){var b,c;b=a%360;c=Math.floor(b/90+.5); -b=(b-90*c)*this.degree;a=Math.sin(b);b=Math.cos(b);switch(c&3){case 0:c=a;a=b;break;case 1:c=b;a=0-a;break;case 2:c=0-a;a=0-b;break;default:c=0-b}return{s:c,c:a}};a.atan2d=function(a,b){var c=0,e;Math.abs(a)>Math.abs(b)&&(c=b,b=a,a=c,c=2);0>b&&(b=-b,++c);e=Math.atan2(a,b)/this.degree;switch(c){case 1:e=(0d?b:d+k,h=0>h?b:h+k,d=Math.min(d,h),n=c(f.substr(n,d-n)),F+=n.val,n=n.ind,g==a.NONE)g=n;else if(n!=a.NONE&&g!=n)throw Error("Incompatible hemisphere specifies in "+f.substr(0,d));if(0===e)throw Error("Empty or incomplete DMS string "+f);return{val:F, -ind:g}};c=function(f){var c={},b="",q,d,h,n,g,u,t,A,y,C,G,H,K,M,R,T;do{q=1;d=0;h=f.length;n=a.NONE;g=-1;h>d&&0<=(g=l("SNWE",f.charAt(d)))&&(n=g&2?a.LONGITUDE:a.LATITUDE,q=g&1?1:-1,++d);if(h>d&&0<=(g=l("SNWE",f.charAt(h-1)))&&0<=g){if(n!==a.NONE){b=f.charAt(d-1).toUpperCase()===f.charAt(h-1).toUpperCase()?"Repeated hemisphere indicators "+f.charAt(d-1)+" in "+f.substr(d-1,h-d+1):"Contradictory hemisphere indicators "+f.charAt(d-1)+" and "+f.charAt(h-1)+" in "+f.substr(d-1,h-d+1);break}n=g&2?a.LONGITUDE: -a.LATITUDE;q=g&1?1:-1;--h}h>d&&0<=(g=l("-+",f.charAt(d)))&&0<=g&&(q*=g?1:-1,++d);if(h===d)b="Empty or incomplete DMS string "+f;else{u=[0,0,0];t=[0,0,0];G=C=y=A=0;H=d;K=!1;for(R=M=0;Hl("D'\":",f.charAt(H-1))){if(3<=A){b="Extra text following seconds in DMS string "+ -f.substr(d,h-d);break}if(0===G){b="Missing numbers in trailing component of "+f.substr(d,h-d);break}0a.length)return 0;a=a.toUpperCase().replace(/0+$/,"");c="-"===a.charAt(0)?-1:1;b="-"===a.charAt(0)||"+"===a.charAt(0)?1:0;e=a.length-1;if(e+1c?"-inf":0c?-1:1;c*=n;g=Math.floor(c);h=Math.floor((c-g)*d+.5)/d;1<=h&&(g+=1,--h);c=[h,0,0];for(h=1;h<=e;++h)d=Math.floor(c[h-1]),u=c[h-1]-d,c[h]=60* -u,c[h-1]=d;c[0]+=g;g="";q===a.NONE&&0>n&&(g+="-");switch(e){case a.DEGREE:g+=b(c[0].toFixed(k),q===a.NONE?0:1+Math.min(q,2)+k+(k?1:0))+"\u00b0";break;default:switch(g+=b(c[0].toFixed(0),q===a.NONE?0:1+Math.min(q,2))+"\u00b0",e){case a.MINUTE:g+=b(c[1].toFixed(k),2+k+(k?1:0))+"'";break;case a.SECOND:g+=b(c[1].toFixed(0),2)+"'",g+=b(c[2].toFixed(k),2+k+(k?1:0))+'"'}}q!==a.NONE&&q!==a.AZIMUTH&&(g+="SNWE".charAt((q===a.LATITUDE?0:2)+(0>n?0:1)));return g}})(GeographicLib.DMS);GeographicLib.Geodesic={}; -GeographicLib.GeodesicLine={};GeographicLib.PolygonArea={}; -(function(a,l,b,c,e){var k,f,w=20+c.digits+10,F=c.epsilon,q=200*F,d=Math.sqrt(F),h=F*q,n=1E3*d,g,u,t,A,y,C,G,H,K;a.tiny_=Math.sqrt(Number.MIN_VALUE);a.nC1_=6;a.nC1p_=6;a.nC2_=6;a.nC3_=6;a.nC4_=6;k=a.nC3_*(a.nC3_-1)/2;f=a.nC4_*(a.nC4_+1)/2;a.CAP_C1=1;a.CAP_C1p=2;a.CAP_C2=4;a.CAP_C3=8;a.CAP_C4=16;a.NONE=0;a.LATITUDE=128;a.LONGITUDE=256|a.CAP_C3;a.AZIMUTH=512;a.DISTANCE=1024|a.CAP_C1;a.STANDARD=a.LATITUDE|a.LONGITUDE|a.AZIMUTH|a.DISTANCE;a.DISTANCE_IN=2048|a.CAP_C1|a.CAP_C1p;a.REDUCEDLENGTH=4096|a.CAP_C1| -a.CAP_C2;a.GEODESICSCALE=8192|a.CAP_C1|a.CAP_C2;a.AREA=16384|a.CAP_C4;a.ALL=32671;a.LONG_UNROLL=32768;a.OUT_MASK=32640|a.LONG_UNROLL;a.SinCosSeries=function(a,c,b,d){for(var v=d.length,f=v-(a?1:0),e=2*(b-c)*(b+c),m=f&1?d[--v]:0,g=0,f=Math.floor(f/2);f--;)g=e*m-g+d[--v],m=e*g-m+d[--v];return a?2*c*b*m:b*(m-g)};g=function(a,b){var d,f=c.sq(a);d=c.sq(b);var v=(f+d-1)/6,e,g,m,h;0===d&&0>=v?d=0:(e=f*d/4,g=c.sq(v),m=v*g,h=e*(e+2*m),f=v,0<=h?(v=e+m,v+=0>v?-Math.sqrt(h):Math.sqrt(h),v=c.cbrt(v),f+=v+(0!== -v?g/v:0)):(g=Math.atan2(Math.sqrt(-h),-(e+m)),f+=2*v*Math.cos(g/3)),v=Math.sqrt(c.sq(f)+d),f=0>f?d/(v-f):f+v,d=(f-d)/(2*v),d=f/(Math.sqrt(f+c.sq(d))+d));return d};u=[1,4,64,0,256];a.A1m1f=function(a){var b=Math.floor(3);return(c.polyval(b,u,0,c.sq(a))/u[b+1]+a)/(1-a)};t=[-1,6,-16,32,-9,64,-128,2048,9,-16,768,3,-5,512,-7,1280,-7,2048];a.C1f=function(b,d){var f=c.sq(b),e=b,v=0,g,h;for(g=1;g<=a.nC1_;++g)h=Math.floor((a.nC1_-g)/2),d[g]=e*c.polyval(h,t,v,f)/t[v+h+1],v+=h+2,e*=b};A=[205,-432,768,1536,4005, --4736,3840,12288,-225,116,384,-7173,2695,7680,3467,7680,38081,61440];a.C1pf=function(b,d){var f=c.sq(b),e=b,v=0,g,h;for(g=1;g<=a.nC1p_;++g)h=Math.floor((a.nC1p_-g)/2),d[g]=e*c.polyval(h,A,v,f)/A[v+h+1],v+=h+2,e*=b};y=[-11,-28,-192,0,256];a.A2m1f=function(a){var b=Math.floor(3);return(c.polyval(b,y,0,c.sq(a))/y[b+1]-a)/(1+a)};C=[1,2,16,32,35,64,384,2048,15,80,768,7,35,512,63,1280,77,2048];a.C2f=function(b,d){var f=c.sq(b),g=b,v=0,e,h;for(e=1;e<=a.nC2_;++e)h=Math.floor((a.nC2_-e)/2),d[e]=g*c.polyval(h, -C,v,f)/C[v+h+1],v+=h+2,g*=b};a.Geodesic=function(a,b){this.a=a;this.f=b;this._f1=1-this.f;this._e2=this.f*(2-this.f);this._ep2=this._e2/c.sq(this._f1);this._n=this.f/(2-this.f);this._b=this.a*this._f1;this._c2=(c.sq(this.a)+c.sq(this._b)*(0===this._e2?1:(0=f;--e)v=Math.min(a.nC3_-e-1,e),this._C3x[d++]=c.polyval(v,H,b,this._n)/H[b+v+1],b+=v+2};K=[97,15015,1088,156,45045,-224,-4784,1573,45045,-10656,14144,-4576,-858,45045,64,624,-4576,6864,-3003,15015,100,208,572,3432,-12012,30030,45045,1,9009,-2944,468,135135,5792,1040,-1287,135135,5952,-11648,9152,-2574,135135,-64,-624,4576,-6864,3003,135135,8,10725,1856,-936,225225,-8448,4992,-1144,225225, --1440,4160,-4576,1716,225225,-136,63063,1024,-208,105105,3584,-3328,1144,315315,-128,135135,-2560,832,405405,128,99099];a.Geodesic.prototype.C4coeff=function(){var b=0,d=0,f,e,v;for(f=0;f=f;--e)v=a.nC4_-e-1,this._C4x[d++]=c.polyval(v,K,b,this._n)/K[b+v+1],b+=v+2};a.Geodesic.prototype.A3f=function(a){return c.polyval(5,this._A3x,0,a)};a.Geodesic.prototype.C3f=function(b,f){var d=1,e=0,v,g;for(v=1;vu&&.5>h*w;P=w;p&&(z=c.sq(b+e),z/=z+c.sq(f+h),r.dnm=Math.sqrt(1+this._ep2*z),P/=this._f1*r.dnm);z=Math.sin(P);x=Math.cos(P);r.salp1=h*z;r.calp1=0<=x?u+h*b*c.sq(z)/(1+x):l-h*b*c.sq(z)/(1-x);P=c.hypot(r.salp1,r.calp1);t=b*e+f*h*x;p&&P=6*Math.abs(this._n)*Math.PI*c.sq(f)||(0<=this.f?(d=c.sq(b)*this._ep2,d/=2*(1+Math.sqrt(1+ -d))+d,e=this.f*f*this.A3f(d)*Math.PI,d=(w-Math.PI)/e,f=l/(e*f)):(u=Math.atan2(l,h*f-e*b),e=this.Lengths(this._n,Math.PI+u,b,-f,d,e,h,k,f,h,a.REDUCEDLENGTH,m,F),d=e.m12b,e=e.m0,d=-1+d/(f*h*e*Math.PI),e=-.01>d?l/d:-this.f*c.sq(f)*Math.PI,e/=f,f=(w-Math.PI)/e),f>-q&&d>-1-n?0<=this.f?(r.salp1=Math.min(1,-d),r.calp1=-Math.sqrt(1-c.sq(r.salp1))):(r.calp1=Math.max(d>-q?0:-1,d),r.salp1=Math.sqrt(1-c.sq(r.calp1))):(w=g(d,f),f=e*(0<=this.f?-d*w/(1+w):-f*(1+w)/w),z=Math.sin(f),x=-Math.cos(f),r.salp1=h*z,r.calp1= -l-h*b*c.sq(z)/(1-x)));0>=r.salp1?(r.salp1=1,r.calp1=0):(b=c.hypot(r.salp1,r.calp1),r.salp1/=b,r.calp1/=b);return r};a.Geodesic.prototype.Lambda12=function(b,f,d,e,h,g,k,m,w,n,F,q){var p={},u,l,x,t,E;0===b&&0===m&&(m=-a.tiny_);l=k*f;x=c.hypot(m,k*b);p.ssig1=b;t=l*b;p.csig1=E=m*f;u=c.hypot(p.ssig1,p.csig1);p.ssig1/=u;p.csig1/=u;p.salp2=h!==f?l/h:k;p.calp2=h!==f||Math.abs(e)!==-b?Math.sqrt(c.sq(m*f)+(f<-b?(h-f)*(f+h):(b-e)*(b+e)))/h:Math.abs(m);p.ssig2=e;e*=l;p.csig2=k=p.calp2*h;u=c.hypot(p.ssig2,p.csig2); -p.ssig2/=u;p.csig2/=u;p.sig12=Math.atan2(Math.max(0,p.csig1*p.ssig2-p.ssig1*p.csig2),p.csig1*p.csig2+p.ssig1*p.ssig2);u=Math.atan2(Math.max(0,E*e-t*k),E*k+t*e);x=c.sq(x)*this._ep2;p.eps=x/(2*(1+Math.sqrt(1+x))+x);this.C3f(p.eps,q);q=a.SinCosSeries(!0,p.ssig2,p.csig2,q)-a.SinCosSeries(!0,p.ssig1,p.csig1,q);x=-this.f*this.A3f(p.eps);p.domg12=l*x*(p.sig12+q);p.lam12=u+p.domg12;w&&(0===p.calp2?p.dlam12=-2*this._f1*d/b:(b=this.Lengths(p.eps,p.sig12,p.ssig1,p.csig1,d,p.ssig2,p.csig2,g,f,h,a.REDUCEDLENGTH, -n,F),p.dlam12=b.m12b,p.dlam12*=this._f1/(p.calp2*h)));return p};a.Geodesic.prototype.Inverse=function(b,f,d,e,g){var k={},n,m,u,r,q,l,p,t,z,x,y,E,B,D,A,C,G,H,K,L,N,J,O,Q,I,V,W,S,X,U,Y,Z;g||(g=a.STANDARD);g==a.LONG_UNROLL&&(g|=a.STANDARD);g&=a.OUT_MASK;k.lat1=b=c.LatFix(b);k.lat2=d=c.LatFix(d);n=c.AngDiff(f,e);g&a.LONG_UNROLL?(k.lon1=f,k.lon2=f+n):(k.lon1=c.AngNormalize(f),k.lon2=c.AngNormalize(e));n=c.AngRound(n);f=0<=n?1:-1;n*=f;b=c.AngRound(b);d=c.AngRound(d);e=Math.abs(b)e&& -(f*=-1,m=b,b=d,d=m);u=0>b?1:-1;b*=u;d*=u;m=c.sincosd(b);r=this._f1*m.s;q=m.c;m=c.hypot(r,q);r/=m;q=Math.max(a.tiny_,q/m);m=c.sincosd(d);d=this._f1*m.s;l=m.c;m=c.hypot(d,l);d/=m;l=Math.max(a.tiny_,l/m);q<-r?l===q&&(d=0>d?r:-r):Math.abs(d)===-r&&(l=q);z=Math.sqrt(1+this._ep2*c.sq(r));x=Math.sqrt(1+this._ep2*c.sq(d));y=n*c.degree;m=c.sincosd(n);E=m.s;m=m.c;G=Array(a.nC1_+1);H=Array(a.nC2_+1);K=Array(a.nC3_);if(b=-90===b||0===E)B=m,D=E,A=1,C=0,L=r,N=B*q,J=d,O=A*l,E=Math.atan2(Math.max(0,N*J-L*O),N*O+ -L*J),m=this.Lengths(this._n,E,L,N,z,J,O,x,q,l,g|a.DISTANCE|a.REDUCEDLENGTH,G,H),p=m.s12b,t=m.m12b,0!==(g&a.GEODESICSCALE)&&(k.M12=m.M12,k.M21=m.M21),1>E||0<=t?(E<3*a.tiny_&&(E=t=p=0),t*=this._b,p*=this._b,k.a12=E/c.degree):b=!1;if(!b&&0===r&&(0>=this.f||y<=Math.PI-this.f*Math.PI))B=A=0,D=C=1,p=this.a*y,E=I=y/this._f1,t=this._b*Math.sin(E),g&a.GEODESICSCALE&&(k.M12=k.M21=Math.cos(E)),k.a12=n/this._f1;else if(!b)if(m=this.InverseStart(r,q,z,d,l,x,y,G,H),E=m.sig12,D=m.salp1,B=m.calp1,0<=E)C=m.salp2, -A=m.calp2,I=m.dnm,p=E*this._b*I,t=c.sq(I)*this._b*Math.sin(E/I),g&a.GEODESICSCALE&&(k.M12=k.M21=Math.cos(E/I)),k.a12=E/c.degree,I=y/(this._f1*I);else{p=0;t=a.tiny_;n=1;V=a.tiny_;W=-1;for(X=S=!1;pp,G,H,K);U=m.lam12-y;C=m.salp2;A=m.calp2;E=m.sig12;L=m.ssig1;N=m.csig1;J=m.ssig2;O=m.csig2;Q=m.eps;I=m.domg12;m=m.dlam12;if(X||!(Math.abs(U)>=(S?8:2)*F))break;0p||B/D>W/V)?(V=D,W=B):0>U&&(20>p||B/Dp&&0d-r?(J=Math.sin(I),I=1+Math.cos(I),q=1+q,l=1+l,r=2*Math.atan2(J*(r*l+d*q),I*(r*d+q*l))):(r=C*B-A*D,d=A*B+C*D,0===r&&0>d&&(r=a.tiny_*B,d=-1),r=Math.atan2(r,d)),k.S12+=this._c2*r,k.S12=k.S12*e*f*u,k.S12+=0);0> -e&&(m=D,D=C,C=m,m=B,B=A,A=m,g&a.GEODESICSCALE&&(m=k.M12,k.M12=k.M21,k.M21=m));C=C*e*f;A=A*e*u;g&a.AZIMUTH&&(k.azi1=c.atan2d(D*e*f,B*e*u),k.azi2=c.atan2d(C,A));return k};a.Geodesic.prototype.GenDirect=function(b,d,f,c,e,g){g?g==a.LONG_UNROLL&&(g|=a.STANDARD):g=a.STANDARD;return(new l.GeodesicLine(this,b,d,f,g|(c?a.NONE:a.DISTANCE_IN))).GenPosition(c,e,g)};a.Geodesic.prototype.Direct=function(a,b,d,f,c){return this.GenDirect(a,b,d,!1,f,c)};a.Geodesic.prototype.ArcDirect=function(a,b,d,f,c){return this.GenDirect(a, -b,d,!0,f,c)};a.Geodesic.prototype.Line=function(a,b,d,f){return new l.GeodesicLine(this,a,b,d,f)};a.Geodesic.prototype.Polygon=function(a){return new b.PolygonArea(this,a)};a.WGS84=new a.Geodesic(e.WGS84.a,e.WGS84.f)})(GeographicLib.Geodesic,GeographicLib.GeodesicLine,GeographicLib.PolygonArea,GeographicLib.Math,GeographicLib.Constants); -(function(a,l,b){l.GeodesicLine=function(c,e,k,f,w){w||(w=a.STANDARD|a.DISTANCE_IN);this.a=c.a;this.f=c.f;this._b=c._b;this._c2=c._c2;this._f1=c._f1;this._caps=(w?w|a.LATITUDE|a.AZIMUTH:a.ALL)|a.LONG_UNROLL;this.lat1=b.LatFix(e);this.lon1=k;this.azi1=b.AngNormalize(f);e=b.sincosd(b.AngRound(this.azi1));this._salp1=e.s;this._calp1=e.c;e=b.sincosd(b.AngRound(this.lat1));f=this._f1*e.s;k=e.c;e=b.hypot(f,k);f/=e;k=Math.max(a.tiny_,k/e);this._dn1=Math.sqrt(1+c._ep2*b.sq(f));this._salp0=this._salp1*k;this._calp0= -b.hypot(this._calp1,this._salp1*f);this._ssig1=f;this._somg1=this._salp0*f;this._csig1=this._comg1=0!==f||0!==this._calp1?k*this._calp1:1;e=b.hypot(this._ssig1,this._csig1);this._ssig1/=e;this._csig1/=e;this._k2=b.sq(this._calp0)*c._ep2;e=this._k2/(2*(1+Math.sqrt(1+this._k2))+this._k2);this._caps&a.CAP_C1&&(this._A1m1=a.A1m1f(e),this._C1a=Array(a.nC1_+1),a.C1f(e,this._C1a),this._B11=a.SinCosSeries(!0,this._ssig1,this._csig1,this._C1a),k=Math.sin(this._B11),f=Math.cos(this._B11),this._stau1=this._ssig1* -f+this._csig1*k,this._ctau1=this._csig1*f-this._ssig1*k);this._caps&a.CAP_C1p&&(this._C1pa=Array(a.nC1p_+1),a.C1pf(e,this._C1pa));this._caps&a.CAP_C2&&(this._A2m1=a.A2m1f(e),this._C2a=Array(a.nC2_+1),a.C2f(e,this._C2a),this._B21=a.SinCosSeries(!0,this._ssig1,this._csig1,this._C2a));this._caps&a.CAP_C3&&(this._C3a=Array(a.nC3_),c.C3f(e,this._C3a),this._A3c=-this.f*this._salp0*c.A3f(e),this._B31=a.SinCosSeries(!0,this._ssig1,this._csig1,this._C3a));this._caps&a.CAP_C4&&(this._C4a=Array(a.nC4_),c.C4f(e, -this._C4a),this._A4=b.sq(this.a)*this._calp0*this._salp0*c._e2,this._B41=a.SinCosSeries(!1,this._ssig1,this._csig1,this._C4a))};l.GeodesicLine.prototype.GenPosition=function(c,e,k){var f={},w,l,q,d,h,n,g,u,t,A,y,C,G;k?k==a.LONG_UNROLL&&(k|=a.STANDARD):k=a.STANDARD;k=k&this._caps&a.OUT_MASK;f.lat1=this.lat1;f.azi1=this.azi1;f.lon1=k&a.LONG_UNROLL?this.lon1:b.AngNormalize(this.lon1);c?f.a12=e:f.s12=e;if(!(c||this._caps&a.DISTANCE_IN&a.OUT_MASK))return f.a12=Number.NaN,f;h=d=0;c?(w=e*b.degree,t=b.sincosd(e), -l=t.s,q=t.c):(w=e/(this._b*(1+this._A1m1)),g=Math.sin(w),l=Math.cos(w),d=-a.SinCosSeries(!0,this._stau1*l+this._ctau1*g,this._ctau1*l-this._stau1*g,this._C1pa),w-=d-this._B11,l=Math.sin(w),q=Math.cos(w),.01this._salp0?-1:1,u=k&a.LONG_UNROLL?u*(w-(Math.atan2(n,g)-Math.atan2(this._ssig1,this._csig1))+(Math.atan2(u*y,C)-Math.atan2(u*this._somg1,this._comg1))): -Math.atan2(y*this._comg1-C*this._somg1,C*this._comg1+y*this._somg1),u+=this._A3c*(w+(a.SinCosSeries(!0,n,g,this._C3a)-this._B31)),u/=b.degree,f.lon2=k&a.LONG_UNROLL?this.lon1+u:b.AngNormalize(b.AngNormalize(this.lon1)+b.AngNormalize(u)));k&a.LATITUDE&&(f.lat2=b.atan2d(t,this._f1*A));k&a.AZIMUTH&&(f.azi2=b.atan2d(d,e));k&(a.REDUCEDLENGTH|a.GEODESICSCALE)&&(t=a.SinCosSeries(!0,n,g,this._C2a),t=(1+this._A2m1)*(t-this._B21),h=(this._A1m1-this._A2m1)*w+(h-t),k&a.REDUCEDLENGTH&&(f.m12=this._b*(G*this._csig1* -n-this._dn1*this._ssig1*g-this._csig1*g*h)),k&a.GEODESICSCALE&&(t=this._k2*(n-this._ssig1)*(n+this._ssig1)/(this._dn1+G),f.M12=q+(t*n-g*h)*this._ssig1/this._dn1,f.M21=q-(t*this._ssig1-this._csig1*h)*n/G));k&a.AREA&&(k=a.SinCosSeries(!1,n,g,this._C4a),0===this._calp0||0===this._salp0?(h=d*this._calp1-e*this._salp1,g=e*this._calp1+d*this._salp1,0===h&&0>g&&(h=a.tiny_*this._calp1,g=-1)):(h=this._calp0*this._salp0*(0>=q?this._csig1*(1-q)+l*this._ssig1:l*(this._csig1*l/(1+q)+this._ssig1)),g=b.sq(this._salp0)+ -b.sq(this._calp0)*this._csig1*g),f.S12=this._c2*Math.atan2(h,g)+this._A4*(k-this._B41));c||(f.a12=w/b.degree);return f};l.GeodesicLine.prototype.Position=function(a,b){return this.GenPosition(!1,a,b)};l.GeodesicLine.prototype.ArcPosition=function(a,b){return this.GenPosition(!0,a,b)}})(GeographicLib.Geodesic,GeographicLib.GeodesicLine,GeographicLib.Math); -(function(a,l,b,c){var e,k;e=function(a,c){var e;a=b.AngNormalize(a);c=b.AngNormalize(c);e=b.AngDiff(a,c);return 0>a&&0<=c&&0c&&0<=a&&0>e?-1:0};k=function(a,b){a%=720;b%=720;return(0<=b&&360>b||-360>b?0:1)-(0<=a&&360>a||-360>a?0:1)};a.PolygonArea=function(a,b){this._geod=a;this.a=this._geod.a;this.f=this._geod.f;this._area0=4*Math.PI*a._c2;this.polyline=b?b:!1;this._mask=l.LATITUDE|l.LONGITUDE|l.DISTANCE|(this.polyline?l.NONE:l.AREA|l.LONG_UNROLL);this.polyline||(this._areasum=new c.Accumulator(0)); -this._perimetersum=new c.Accumulator(0);this.Clear()};a.PolygonArea.prototype.Clear=function(){this._crossings=this.num=0;this.polyline||this._areasum.Set(0);this._perimetersum.Set(0);this._lat0=this._lon0=this.lat=this.lon=Number.NaN};a.PolygonArea.prototype.AddPoint=function(a,b){var c;0===this.num?(this._lat0=this.lat=a,this._lon0=this.lon=b):(c=this._geod.Inverse(this.lat,this.lon,a,b,this._mask),this._perimetersum.Add(c.s12),this.polyline||(this._areasum.Add(c.S12),this._crossings+=e(this.lon, -b)),this.lat=a,this.lon=b);++this.num};a.PolygonArea.prototype.AddEdge=function(a,b){var c;this.num&&(c=this._geod.Direct(this.lat,this.lon,a,b,this._mask),this._perimetersum.Add(b),this.polyline||(this._areasum.Add(c.S12),this._crossings+=k(this.lon,c.lon2)),this.lat=c.lat2,this.lon=c.lon2);++this.num};a.PolygonArea.prototype.Compute=function(a,b){var k={number:this.num},l,d;if(2>this.num)return k.perimeter=0,this.polyline||(k.area=0),k;if(this.polyline)return k.perimeter=this._perimetersum.Sum(), -k;l=this._geod.Inverse(this.lat,this.lon,this._lat0,this._lon0,this._mask);k.perimeter=this._perimetersum.Sum(l.s12);d=new c.Accumulator(this._areasum);d.Add(l.S12);this._crossings+e(this.lon,this._lon0)&1&&d.Add((0>d.Sum()?1:-1)*this._area0/2);a||d.Negate();b?d.Sum()>this._area0/2?d.Add(-this._area0):d.Sum()<=-this._area0/2&&d.Add(+this._area0):d.Sum()>=this._area0?d.Add(-this._area0):0>d&&d.Add(-this._area0);k.area=d.Sum();return k};a.PolygonArea.prototype.TestPoint=function(a,b,c,k){var d={number:this.num+ -1},h,n,g,l;if(0===this.num)return d.perimeter=0,this.polyline||(d.area=0),d;d.perimeter=this._perimetersum.Sum();n=this.polyline?0:this._areasum.Sum();g=this._crossings;for(l=0;l<(this.polyline?1:2);++l)h=this._geod.Inverse(0===l?this.lat:a,0===l?this.lon:b,0!==l?this._lat0:a,0!==l?this._lon0:b,this._mask),d.perimeter+=h.s12,this.polyline||(n+=h.S12,g+=e(0===l?this.lon:b,0!==l?this._lon0:b));if(this.polyline)return d;g&1&&(n+=(0>n?1:-1)*this._area0/2);c||(n*=-1);k?n>this._area0/2?n-=this._area0:n<= --this._area0/2&&(n+=this._area0):n>=this._area0?n-=this._area0:0>n&&(n+=this._area0);d.area=n;return d};a.PolygonArea.prototype.TestEdge=function(a,b,c,l){var d={number:this.num?this.num+1:0},h;if(0===this.num)return d;d.perimeter=this._perimetersum.Sum()+b;if(this.polyline)return d;tempsum=this._areasum.Sum();h=this._crossings;a=this._geod.Direct(this.lat,this.lon,a,b,this._mask);tempsum+=a.S12;h+=k(this.lon,a.lon2);a=this._geod(a.lat2,a.lon2,this._lat0,this._lon0,this._mask);perimeter+=a.s12;tempsum+= -a.S12;h+=e(a.lon2,this._lon0);h&1&&(tempsum+=(0>tempsum?1:-1)*this._area0/2);c||(tempsum*=-1);l?tempsum>this._area0/2?tempsum-=this._area0:tempsum<=-this._area0/2&&(tempsum+=this._area0):tempsum>=this._area0?tempsum-=this._area0:0>tempsum&&(tempsum+=this._area0);d.area=tempsum;return d}})(GeographicLib.PolygonArea,GeographicLib.Geodesic,GeographicLib.Math,GeographicLib.Accumulator);window.GeographicLib=GeographicLib;window.GeographicLib.Geodesic=GeographicLib.Geodesic; -window.GeographicLib.Geodesic.Geodesic=GeographicLib.Geodesic.Geodesic; \ No newline at end of file diff --git a/src/core/utils/libs/geographics-full.js b/src/core/utils/libs/geographics-full.js deleted file mode 100755 index 83a5ddb0..00000000 --- a/src/core/utils/libs/geographics-full.js +++ /dev/null @@ -1,2863 +0,0 @@ -/* - * Math.js - * Transcription of Math.hpp, Constants.hpp, and Accumulator.hpp into - * JavaScript. - * - * Copyright (c) Charles Karney (2011-2015) and licensed - * under the MIT/X11 License. For more information, see - * http://geographiclib.sourceforge.net/ - */ - -/** - * @namespace GeographicLib - * @description The parent namespace for the following modules: - * - {@link module:GeographicLib/Geodesic GeographicLib/Geodesic} The main - * engine for solving geodesic problems via the - * {@link module:GeographicLib/Geodesic.Geodesic Geodesic} class. - * - {@link module:GeographicLib/GeodesicLine GeographicLib/GeodesicLine} - * computes points along a single geodesic line via the - * {@link module:GeographicLib/GeodesicLine.GeodesicLine GeodesicLine} - * class. - * - {@link module:GeographicLib/PolygonArea GeographicLib/PolygonArea} - * computes the area of a geodesic polygon via the - * {@link module:GeographicLib/PolygonArea.PolygonArea PolygonArea} - * class. - * - {@link module:GeographicLib/DMS GeographicLib/DMS} handles the decoding - * and encoding of angles in degree, minutes, and seconds, via static - * functions in this module. - * - {@link module:GeographicLib/Constants GeographicLib/Constants} defines - * constants specifying the version numbers and the parameters for the WGS84 - * ellipsoid. - * - * The following modules are used internally by the package: - * - {@link module:GeographicLib/Math GeographicLib/Math} defines various - * mathematical functions. - * - {@link module:GeographicLib/Accumulator GeographicLib/Accumulator} - * interally used by - * {@link module:GeographicLib/PolygonArea.PolygonArea PolygonArea} (via the - * {@link module:GeographicLib/Accumulator.Accumulator Accumulator} class) - * for summing the contributions to the area of a polygon. - */ -var GeographicLib = {}; -GeographicLib.Constants = {}; -GeographicLib.Math = {}; -GeographicLib.Accumulator = {}; - -(function( - /** - * @exports GeographicLib/Constants - * @description Define constants defining the version and WGS84 parameters. - */ - c) { - "use strict"; - - /** - * @constant - * @summary WGS84 parameters. - * @property {number} a the equatorial radius (meters). - * @property {number} f the flattening. - */ - c.WGS84 = { a: 6378137, f: 1/298.257223563 }; - /** - * @constant - * @summary an array of version numbers. - * @property {number} major the major version number. - * @property {number} minor the minor version number. - * @property {number} patch the patch number. - */ - c.version = { major: 1, minor: 45, patch: 0 }; - /** - * @constant - * @summary version string - */ - c.version_string = "1.45"; -})(GeographicLib.Constants); - -(function( - /** - * @exports GeographicLib/Math - * @description Some useful mathematical constants and functions (mainly for - * internal use). - */ - m) { - "use strict"; - - /** - * @summary The number of digits of precision in floating-point numbers. - * @constant {number} - */ - m.digits = 53; - /** - * @summary The machine epsilon. - * @constant {number} - */ - m.epsilon = Math.pow(0.5, m.digits - 1); - /** - * @summary The factor to convert degrees to radians. - * @constant {number} - */ - m.degree = Math.PI/180; - - /** - * @summary Square a number. - * @param {number} x the number. - * @returns {number} the square. - */ - m.sq = function(x) { return x * x; }; - - /** - * @summary The hypotenuse function. - * @param {number} x the first side. - * @param {number} y the second side. - * @returns {number} the hypotenuse. - */ - m.hypot = function(x, y) { - var a, b; - x = Math.abs(x); - y = Math.abs(y); - a = Math.max(x, y); b = Math.min(x, y) / (a ? a : 1); - return a * Math.sqrt(1 + b * b); - }; - - /** - * @summary Cube root function. - * @param {number} x the argument. - * @returns {number} the real cube root. - */ - m.cbrt = function(x) { - var y = Math.pow(Math.abs(x), 1/3); - return x < 0 ? -y : y; - }; - - /** - * @summary The log1p function. - * @param {number} x the argument. - * @returns {number} log(1 + x). - */ - m.log1p = function(x) { - var y = 1 + x, - z = y - 1; - // Here's the explanation for this magic: y = 1 + z, exactly, and z - // approx x, thus log(y)/z (which is nearly constant near z = 0) returns - // a good approximation to the true log(1 + x)/x. The multiplication x * - // (log(y)/z) introduces little additional error. - return z === 0 ? x : x * Math.log(y) / z; - }; - - /** - * @summary Inverse hyperbolic tangent. - * @param {number} x the argument. - * @returns {number} tanh−1 x. - */ - m.atanh = function(x) { - var y = Math.abs(x); // Enforce odd parity - y = m.log1p(2 * y/(1 - y))/2; - return x < 0 ? -y : y; - }; - - /** - * @summary An error-free sum. - * @param {number} u - * @param {number} v - * @returns {object} sum with sum.s = round(u + v) and sum.t is u + v − - * round(u + v) - */ - m.sum = function(u, v) { - var s = u + v, - up = s - v, - vpp = s - up, - t; - up -= u; - vpp -= v; - t = -(up + vpp); - // u + v = s + t - // = round(u + v) + t - return {s: s, t: t}; - }; - - /** - * @summary Evaluate a polynomial. - * @param {integer} N the order of the polynomial. - * @param {array} p the coefficient array (of size N + 1) (leading - * order coefficient first) - * @param {number} x the variable. - * @returns {number} the value of the polynomial. - */ - m.polyval = function(N, p, s, x) { - var y = N < 0 ? 0 : p[s++]; - while (--N >= 0) y = y * x + p[s++]; - return y; - }; - - /** - * @summary Coarsen a value close to zero. - * @param {number} x - * @returns {number} the coarsened value. - */ - m.AngRound = function(x) { - // The makes the smallest gap in x = 1/16 - nextafter(1/16, 0) = 1/2^57 for - // reals = 0.7 pm on the earth if x is an angle in degrees. (This is about - // 1000 times more resolution than we get with angles around 90 degrees.) - // We use this to avoid having to deal with near singular cases when x is - // non-zero but tiny (e.g., 1.0e-200). This also converts -0 to +0. - var z = 1/16, - y = Math.abs(x); - // The compiler mustn't "simplify" z - (z - y) to y - y = y < z ? z - (z - y) : y; - return x < 0 ? 0 - y : y; - }; - - /** - * @summary Normalize an angle. - * @param {number} x the angle in degrees. - * @returns {number} the angle reduced to the range [−180°, - * 180°). - */ - m.AngNormalize = function(x) { - // Place angle in [-180, 180). - x = x % 360; - return x < -180 ? x + 360 : (x < 180 ? x : x - 360); - }; - - /** - * @summary Normalize a latitude. - * @param {number} x the angle in degrees. - * @returns {number} x if it is in the range [−90°, 90°], - * otherwise return NaN. - */ - m.LatFix = function(x) { - // Replace angle with NaN if outside [-90, 90]. - return Math.abs(x) > 90 ? Number.NaN : x; - }; - - /** - * @summary Difference of two angles reduced to [−180°, - * 180°] - * @param {number} x the first angle in degrees. - * @param {number} y the second angle in degrees. - * @return {number} y − x, reduced to the range [−180°, - * 180°]. - */ - m.AngDiff = function(x, y) { - // Compute y - x and reduce to [-180,180] accurately. - var r = m.sum(m.AngNormalize(x), m.AngNormalize(-y)), - d = - m.AngNormalize(r.s), - t = r.t; - return (d == 180 && t < 0 ? -180 : d) - t; - }; - - /** - * @summary Evaluate the sine and cosine function with the argument in - * degrees - * @param {number} x in degrees. - * @returns {object} r with r.s = sin(x) and r.c = cos(x). - */ - m.sincosd = function(x) { - // In order to minimize round-off errors, this function exactly reduces - // the argument to the range [-45, 45] before converting it to radians. - var r, q, s, c, sinx, cosx; - r = x % 360; - q = Math.floor(r / 90 + 0.5); - r -= 90 * q; - // now abs(r) <= 45 - r *= this.degree; - // Possibly could call the gnu extension sincos - s = Math.sin(r); c = Math.cos(r); - switch (q & 3) { - case 0: sinx = s; cosx = c; break; - case 1: sinx = c; cosx = 0 - s; break; - case 2: sinx = 0 - s; cosx = 0 - c; break; - default: sinx = 0 - c; cosx = s; break; // case 3 - } - return {s: sinx, c: cosx}; - }; - - /** - * @summary Evaluate the atan2 function with the result in degrees - * @param {number} y - * @param {number} x - * @returns atan2(y, x) in degrees, in the range [−180° - * 180°). - */ - m.atan2d = function(y, x) { - // In order to minimize round-off errors, this function rearranges the - // arguments so that result of atan2 is in the range [-pi/4, pi/4] before - // converting it to degrees and mapping the result to the correct - // quadrant. - var q = 0, t, ang; - if (Math.abs(y) > Math.abs(x)) { t = x; x = y; y = t; q = 2; } - if (x < 0) { x = -x; ++q; } - // here x >= 0 and x >= abs(y), so angle is in [-pi/4, pi/4] - ang = Math.atan2(y, x) / this.degree; - switch (q) { - // Note that atan2d(-0.0, 1.0) will return -0. However, we expect that - // atan2d will not be called with y = -0. If need be, include - // - // case 0: ang = 0 + ang; break; - // - // and handle mpfr as in AngRound. - case 1: ang = (y > 0 ? 180 : -180) - ang; break; - case 2: ang = 90 - ang; break; - case 3: ang = -90 + ang; break; - } - return ang; - }; -})(GeographicLib.Math); - -(function( - /** - * @exports GeographicLib/Accumulator - * @description Accurate summation via the - * {@link module:GeographicLib/Accumulator.Accumulator Accumulator} class - * (mainly for internal use). - */ - a, m) { - "use strict"; - - /** - * @class - * @summary Accurate summation of many numbers. - * @classdesc This allows many numbers to be added together with twice the - * normal precision. In the documentation of the member functions, sum - * stands for the value currently held in the accumulator. - * @param {number | Accumulator} [y = 0] set sum = y. - */ - a.Accumulator = function(y) { - this.Set(y); - }; - - /** - * @summary Set the accumulator to a number. - * @param {number | Accumulator} [y = 0] set sum = y. - */ - a.Accumulator.prototype.Set = function(y) { - if (!y) y = 0; - if (y.constructor === a.Accumulator) { - this._s = y._s; - this._t = y._t; - } else { - this._s = y; - this._t = 0; - } - }; - - /** - * @summary Add a number to the accumulator. - * @param {number} [y = 0] set sum += y. - */ - a.Accumulator.prototype.Add = function(y) { - // Here's Shewchuk's solution... - // Accumulate starting at least significant end - var u = m.sum(y, this._t), - v = m.sum(u.s, this._s); - u = u.t; - this._s = v.s; - this._t = v.t; - // Start is _s, _t decreasing and non-adjacent. Sum is now (s + t + u) - // exactly with s, t, u non-adjacent and in decreasing order (except - // for possible zeros). The following code tries to normalize the - // result. Ideally, we want _s = round(s+t+u) and _u = round(s+t+u - - // _s). The follow does an approximate job (and maintains the - // decreasing non-adjacent property). Here are two "failures" using - // 3-bit floats: - // - // Case 1: _s is not equal to round(s+t+u) -- off by 1 ulp - // [12, -1] - 8 -> [4, 0, -1] -> [4, -1] = 3 should be [3, 0] = 3 - // - // Case 2: _s+_t is not as close to s+t+u as it shold be - // [64, 5] + 4 -> [64, 8, 1] -> [64, 8] = 72 (off by 1) - // should be [80, -7] = 73 (exact) - // - // "Fixing" these problems is probably not worth the expense. The - // representation inevitably leads to small errors in the accumulated - // values. The additional errors illustrated here amount to 1 ulp of - // the less significant word during each addition to the Accumulator - // and an additional possible error of 1 ulp in the reported sum. - // - // Incidentally, the "ideal" representation described above is not - // canonical, because _s = round(_s + _t) may not be true. For - // example, with 3-bit floats: - // - // [128, 16] + 1 -> [160, -16] -- 160 = round(145). - // But [160, 0] - 16 -> [128, 16] -- 128 = round(144). - // - if (this._s === 0) // This implies t == 0, - this._s = u; // so result is u - else - this._t += u; // otherwise just accumulate u to t. - }; - - /** - * @summary Return the result of adding a number to sum (but - * don't change sum). - * @param {number} [y = 0] the number to be added to the sum. - * @return sum + y. - */ - a.Accumulator.prototype.Sum = function(y) { - var b; - if (!y) - return this._s; - else { - b = new a.Accumulator(this); - b.Add(y); - return b._s; - } - }; - - /** - * @summary Set sum = −sum. - */ - a.Accumulator.prototype.Negate = function() { - this._s *= -1; - this._t *= -1; - }; -})(GeographicLib.Accumulator, GeographicLib.Math); - - -/* - * DMS.js - * Transcription of DMS.[ch]pp into JavaScript. - * - * See the documentation for the C++ class. The conversion is a literal - * conversion from C++. - * - * Copyright (c) Charles Karney (2011-2015) and licensed - * under the MIT/X11 License. For more information, see - * http://geographiclib.sourceforge.net/ - */ - -GeographicLib.DMS = {}; - -(function( - /** - * @exports GeographicLib/DMS - * @description Decode/Encode angles expressed as degrees, minutes, and - * seconds. This module defines several constants: - * - hemisphere indicator (returned by - * {@link module:GeographicLib/DMS.Decode Decode}) and a formatting - * indicator (used by - * {@link module:GeographicLib/DMS.Encode Encode}) - * - NONE = 0, no designator and format as plain angle; - * - LATITUDE = 1, a N/S designator and format as latitude; - * - LONGITUDE = 2, an E/W designator and format as longitude; - * - AZIMUTH = 3, format as azimuth; - * - the specification of the trailing component in - * {@link module:GeographicLib/DMS.Encode Encode} - * - DEGREE; - * - MINUTE; - * - SECOND. - */ - d) { - "use strict"; - - var lookup, zerofill, InternalDecode, NumMatch, - hemispheres_ = "SNWE", - signs_ = "-+", - digits_ = "0123456789", - dmsindicators_ = "D'\":", - // dmsindicatorsu_ = "\u00b0\u2032\u2033"; // Unicode variants - dmsindicatorsu_ = "\u00b0'\"", // Use degree symbol - components_ = ["degrees", "minutes", "seconds"]; - lookup = function(s, c) { - return s.indexOf(c.toUpperCase()); - }; - zerofill = function(s, n) { - return String("0000").substr(0, Math.max(0, Math.min(4, n-s.length))) + - s; - }; - d.NONE = 0; - d.LATITUDE = 1; - d.LONGITUDE = 2; - d.AZIMUTH = 3; - d.DEGREE = 0; - d.MINUTE = 1; - d.SECOND = 2; - - /** - * @summary Decode a DMS string. - * @description The interpretation of the string is given in the - * documentation of the corresponding function, Decode(string&, flag&) - * in the {@link - * http://geographiclib.sourceforge.net/html/classGeographicLib_1_1DMS.html - * C++ DMS class} - * @param {string} dms the string. - * @returns {object} r where r.val is the decoded value (degrees) and r.ind - * is a hemisphere designator, one of NONE, LATITUDE, LONGITUDE. - * @throws an error if the string is illegal. - */ - d.Decode = function(dms) { - var dmsa = dms, end, - v = 0, i = 0, mi, pi, vals, - ind1 = d.NONE, ind2, p, pa, pb; - dmsa = dmsa.replace(/\u00b0/g, 'd') - .replace(/\u00ba/g, 'd') - .replace(/\u2070/g, 'd') - .replace(/\u02da/g, 'd') - .replace(/\u2032/g, '\'') - .replace(/\u00b4/g, '\'') - .replace(/\u2019/g, '\'') - .replace(/\u2033/g, '"') - .replace(/\u201d/g, '"') - .replace(/\u2212/g, '-') - .replace(/''/g, '"') - .trim(); - end = dmsa.length; - // p is pointer to the next piece that needs decoding - for (p = 0; p < end; p = pb, ++i) { - pa = p; - // Skip over initial hemisphere letter (for i == 0) - if (i === 0 && lookup(hemispheres_, dmsa.charAt(pa)) >= 0) - ++pa; - // Skip over initial sign (checking for it if i == 0) - if (i > 0 || (pa < end && lookup(signs_, dmsa.charAt(pa)) >= 0)) - ++pa; - // Find next sign - mi = dmsa.substr(pa, end - pa).indexOf('-'); - pi = dmsa.substr(pa, end - pa).indexOf('+'); - if (mi < 0) mi = end; else mi += pa; - if (pi < 0) pi = end; else pi += pa; - pb = Math.min(mi, pi); - vals = InternalDecode(dmsa.substr(p, pb - p)); - v += vals.val; ind2 = vals.ind; - if (ind1 == d.NONE) - ind1 = ind2; - else if (!(ind2 == d.NONE || ind1 == ind2)) - throw new Error("Incompatible hemisphere specifies in " + - dmsa.substr(0, pb)); - } - if (i === 0) - throw new Error("Empty or incomplete DMS string " + dmsa); - return {val: v, ind: ind1}; - }; - - InternalDecode = function(dmsa) { - var vals = {}, errormsg = "", - sign, beg, end, ind1, k, - ipieces, fpieces, npiece, - icurrent, fcurrent, ncurrent, p, - pointseen, - digcount, intcount, - x; - do { // Executed once (provides the ability to break) - sign = 1; - beg = 0; end = dmsa.length; - ind1 = d.NONE; - k = -1; - if (end > beg && (k = lookup(hemispheres_, dmsa.charAt(beg))) >= 0) { - ind1 = (k & 2) ? d.LONGITUDE : d.LATITUDE; - sign = (k & 1) ? 1 : -1; - ++beg; - } - if (end > beg && - (k = lookup(hemispheres_, dmsa.charAt(end-1))) >= 0) { - if (k >= 0) { - if (ind1 !== d.NONE) { - if (dmsa.charAt(beg - 1).toUpperCase() === - dmsa.charAt(end - 1).toUpperCase()) - errormsg = "Repeated hemisphere indicators " + - dmsa.charAt(beg - 1) + " in " + - dmsa.substr(beg - 1, end - beg + 1); - else - errormsg = "Contradictory hemisphere indicators " + - dmsa.charAt(beg - 1) + " and " + dmsa.charAt(end - 1) + " in " + - dmsa.substr(beg - 1, end - beg + 1); - break; - } - ind1 = (k & 2) ? d.LONGITUDE : d.LATITUDE; - sign = (k & 1) ? 1 : -1; - --end; - } - } - if (end > beg && (k = lookup(signs_, dmsa.charAt(beg))) >= 0) { - if (k >= 0) { - sign *= k ? 1 : -1; - ++beg; - } - } - if (end === beg) { - errormsg = "Empty or incomplete DMS string " + dmsa; - break; - } - ipieces = [0, 0, 0]; - fpieces = [0, 0, 0]; - npiece = 0; - icurrent = 0; - fcurrent = 0; - ncurrent = 0; - p = beg; - pointseen = false; - digcount = 0; - intcount = 0; - while (p < end) { - x = dmsa.charAt(p++); - if ((k = lookup(digits_, x)) >= 0) { - ++ncurrent; - if (digcount > 0) { - ++digcount; // Count of decimal digits - } else { - icurrent = 10 * icurrent + k; - ++intcount; - } - } else if (x === '.') { - if (pointseen) { - errormsg = "Multiple decimal points in " + - dmsa.substr(beg, end - beg); - break; - } - pointseen = true; - digcount = 1; - } else if ((k = lookup(dmsindicators_, x)) >= 0) { - if (k >= 3) { - if (p === end) { - errormsg = "Illegal for colon to appear at the end of " + - dmsa.substr(beg, end - beg); - break; - } - k = npiece; - } - if (k === npiece - 1) { - errormsg = "Repeated " + components_[k] + - " component in " + dmsa.substr(beg, end - beg); - break; - } else if (k < npiece) { - errormsg = components_[k] + " component follows " + - components_[npiece - 1] + " component in " + - dmsa.substr(beg, end - beg); - break; - } - if (ncurrent === 0) { - errormsg = "Missing numbers in " + components_[k] + - " component of " + dmsa.substr(beg, end - beg); - break; - } - if (digcount > 0) { - fcurrent = parseFloat(dmsa.substr(p - intcount - digcount - 1, - intcount + digcount)); - icurrent = 0; - } - ipieces[k] = icurrent; - fpieces[k] = icurrent + fcurrent; - if (p < end) { - npiece = k + 1; - icurrent = fcurrent = 0; - ncurrent = digcount = intcount = 0; - } - } else if (lookup(signs_, x) >= 0) { - errormsg = "Internal sign in DMS string " + - dmsa.substr(beg, end - beg); - break; - } else { - errormsg = "Illegal character " + x + " in DMS string " + - dmsa.substr(beg, end - beg); - break; - } - } - if (errormsg.length) - break; - if (lookup(dmsindicators_, dmsa.charAt(p - 1)) < 0) { - if (npiece >= 3) { - errormsg = "Extra text following seconds in DMS string " + - dmsa.substr(beg, end - beg); - break; - } - if (ncurrent === 0) { - errormsg = "Missing numbers in trailing component of " + - dmsa.substr(beg, end - beg); - break; - } - if (digcount > 0) { - fcurrent = parseFloat(dmsa.substr(p - intcount - digcount, - intcount + digcount)); - icurrent = 0; - } - ipieces[npiece] = icurrent; - fpieces[npiece] = icurrent + fcurrent; - } - if (pointseen && digcount === 0) { - errormsg = "Decimal point in non-terminal component of " + - dmsa.substr(beg, end - beg); - break; - } - // Note that we accept 59.999999... even though it rounds to 60. - if (ipieces[1] >= 60 || fpieces[1] > 60) { - errormsg = "Minutes " + fpieces[1] + " not in range [0,60)"; - break; - } - if (ipieces[2] >= 60 || fpieces[2] > 60) { - errormsg = "Seconds " + fpieces[2] + " not in range [0,60)"; - break; - } - vals.ind = ind1; - // Assume check on range of result is made by calling routine (which - // might be able to offer a better diagnostic). - vals.val = sign * - ( fpieces[2] ? (60*(60*fpieces[0] + fpieces[1]) + fpieces[2]) / 3600 : - ( fpieces[1] ? (60*fpieces[0] + fpieces[1]) / 60 : fpieces[0] ) ); - return vals; - } while (false); - vals.val = NumMatch(dmsa); - if (vals.val === 0) - throw new Error(errormsg); - else - vals.ind = d.NONE; - return vals; - }; - - NumMatch = function(s) { - var t, sign, p0, p1; - if (s.length < 3) - return 0; - t = s.toUpperCase().replace(/0+$/,""); - sign = t.charAt(0) === '-' ? -1 : 1; - p0 = t.charAt(0) === '-' || t.charAt(0) === '+' ? 1 : 0; - p1 = t.length - 1; - if (p1 + 1 < p0 + 3) - return 0; - // Strip off sign and trailing 0s - t = t.substr(p0, p1 + 1 - p0); // Length at least 3 - if (t === "NAN" || t === "1.#QNAN" || t === "1.#SNAN" || t === "1.#IND" || - t === "1.#R") - return Number.NaN; - else if (t === "INF" || t === "1.#INF") - return sign * Number.POSITIVE_INFINITY; - return 0; - }; - - /** - * @summary Decode two DMS strings interpreting them as a latitude/longitude - * pair. - * @param {string} stra the first string. - * @param {string} strb the first string. - * @param {bool} [longfirst = false] if true assume then longitude is given - * first (in the absense of any hemisphere indicators). - * @returns {object} r where r.lat is the decoded latitude and r.lon is the - * decoded longitude (both in degrees). - * @throws an error if the strings are illegal. - */ - d.DecodeLatLon = function(stra, strb, longfirst) { - var vals = {}, - valsa = d.Decode(stra), - valsb = d.Decode(strb), - a = valsa.val, ia = valsa.ind, - b = valsb.val, ib = valsb.ind, - lat, lon; - if (!longfirst) longfirst = false; - if (ia === d.NONE && ib === d.NONE) { - // Default to lat, long unless longfirst - ia = longfirst ? d.LONGITUDE : d.LATITUDE; - ib = longfirst ? d.LATITUDE : d.LONGITUDE; - } else if (ia === d.NONE) - ia = d.LATITUDE + d.LONGITUDE - ib; - else if (ib === d.NONE) - ib = d.LATITUDE + d.LONGITUDE - ia; - if (ia === ib) - throw new Error("Both " + stra + " and " + strb + " interpreted as " + - (ia === d.LATITUDE ? "latitudes" : "longitudes")); - lat = ia === d.LATITUDE ? a : b; - lon = ia === d.LATITUDE ? b : a; - if (Math.abs(lat) > 90) - throw new Error("Latitude " + lat + " not in [-90,90]"); - vals.lat = lat; - vals.lon = lon; - return vals; - }; - - /** - * @summary Decode a DMS string interpreting it as an arc length. - * @param {string} angstr the string (this must not include a hemisphere - * indicator). - * @returns {number} the arc length (degrees). - * @throws an error if the string is illegal. - */ - d.DecodeAngle = function(angstr) { - var vals = d.Decode(angstr), - ang = vals.val, ind = vals.ind; - if (ind !== d.NONE) - throw new Error("Arc angle " + angstr + " includes a hemisphere N/E/W/S"); - return ang; - }; - - /** - * @summary Decode a DMS string interpreting it as an azimuth. - * @param {string} azistr the string (this may include an E/W hemisphere - * indicator). - * @returns {number} the azimuth (degrees). - * @throws an error if the string is illegal. - */ - d.DecodeAzimuth = function(azistr) { - var vals = d.Decode(azistr), - azi = vals.val, ind = vals.ind; - if (ind === d.LATITUDE) - throw new Error("Azimuth " + azistr + " has a latitude hemisphere N/S"); - return azi; - }; - - /** - * @summary Convert angle (in degrees) into a DMS string (using °, ', - * and "). - * @param {number} angle input angle (degrees). - * @param {number} trailing one of DEGREE, MINUTE, or SECOND to indicate - * the trailing component of the string (this component is given as a - * decimal number if necessary). - * @param {number} prec the number of digits after the decimal point for - * the trailing component. - * @param {number} [ind = NONE] a formatting indicator, one of NONE, - * LATITUDE, LONGITUDE, AZIMUTH. - * @returns {string} the resulting string formatted as follows: - * * NONE, signed result no leading zeros on degrees except in the units - * place, e.g., -8°03'. - * * LATITUDE, trailing N or S hemisphere designator, no sign, pad - * degrees to 2 digits, e.g., 08°03'S. - * * LONGITUDE, trailing E or W hemisphere designator, no sign, pad - * degrees to 3 digits, e.g., 008°03'W. - * * AZIMUTH, convert to the range [0, 360°), no sign, pad degrees to - * 3 digits, e.g., 351°57'. - */ - d.Encode = function(angle, trailing, prec, ind) { - // Assume check on range of input angle has been made by calling - // routine (which might be able to offer a better diagnostic). - var scale = 1, i, sign, - idegree, fdegree, f, pieces, ip, fp, s; - if (!ind) ind = d.NONE; - if (!isFinite(angle)) - return angle < 0 ? String("-inf") : - (angle > 0 ? String("inf") : String("nan")); - - // 15 - 2 * trailing = ceiling(log10(2^53/90/60^trailing)). - // This suffices to give full real precision for numbers in [-90,90] - prec = Math.min(15 - 2 * trailing, prec); - for (i = 0; i < trailing; ++i) - scale *= 60; - for (i = 0; i < prec; ++i) - scale *= 10; - if (ind === d.AZIMUTH) - angle -= Math.floor(angle/360) * 360; - sign = angle < 0 ? -1 : 1; - angle *= sign; - - // Break off integer part to preserve precision in manipulation of - // fractional part. - idegree = Math.floor(angle); - fdegree = (angle - idegree) * scale + 0.5; - f = Math.floor(fdegree); - // Implement the "round ties to even" rule - fdegree = (f == fdegree && (f & 1)) ? f - 1 : f; - fdegree /= scale; - - fdegree = Math.floor((angle - idegree) * scale + 0.5) / scale; - if (fdegree >= 1) { - idegree += 1; - fdegree -= 1; - } - pieces = [fdegree, 0, 0]; - for (i = 1; i <= trailing; ++i) { - ip = Math.floor(pieces[i - 1]); - fp = pieces[i - 1] - ip; - pieces[i] = fp * 60; - pieces[i - 1] = ip; - } - pieces[0] += idegree; - s = ""; - if (ind === d.NONE && sign < 0) - s += '-'; - switch (trailing) { - case d.DEGREE: - s += zerofill(pieces[0].toFixed(prec), - ind === d.NONE ? 0 : - 1 + Math.min(ind, 2) + prec + (prec ? 1 : 0)) + - dmsindicatorsu_.charAt(0); - break; - default: - s += zerofill(pieces[0].toFixed(0), - ind === d.NONE ? 0 : 1 + Math.min(ind, 2)) + - dmsindicatorsu_.charAt(0); - switch (trailing) { - case d.MINUTE: - s += zerofill(pieces[1].toFixed(prec), 2 + prec + (prec ? 1 : 0)) + - dmsindicatorsu_.charAt(1); - break; - case d.SECOND: - s += zerofill(pieces[1].toFixed(0), 2) + dmsindicatorsu_.charAt(1); - s += zerofill(pieces[2].toFixed(prec), 2 + prec + (prec ? 1 : 0)) + - dmsindicatorsu_.charAt(2); - break; - default: - break; - } - } - if (ind !== d.NONE && ind !== d.AZIMUTH) - s += hemispheres_.charAt((ind === d.LATITUDE ? 0 : 2) + - (sign < 0 ? 0 : 1)); - return s; - }; -})(GeographicLib.DMS); - -/* - * Geodesic.js - * Transcription of Geodesic.[ch]pp into JavaScript. - * - * See the documentation for the C++ class. The conversion is a literal - * conversion from C++. - * - * The algorithms are derived in - * - * Charles F. F. Karney, - * Algorithms for geodesics, J. Geodesy 87, 43-55 (2013); - * https://dx.doi.org/10.1007/s00190-012-0578-z - * Addenda: http://geographiclib.sf.net/geod-addenda.html - * - * Copyright (c) Charles Karney (2011-2015) and licensed - * under the MIT/X11 License. For more information, see - * http://geographiclib.sourceforge.net/ - */ - -// Load AFTER Math.js - -GeographicLib.Geodesic = {}; -GeographicLib.GeodesicLine = {}; -GeographicLib.PolygonArea = {}; - -(function( - /** - * @exports GeographicLib/Geodesic - * @description Solve geodesic problems via the - * {@link module:GeographicLib/Geodesic.Geodesic Geodesic} class. - */ - g, l, p, m, c) { - "use strict"; - - var GEOGRAPHICLIB_GEODESIC_ORDER = 6, - nA1_ = GEOGRAPHICLIB_GEODESIC_ORDER, - nA2_ = GEOGRAPHICLIB_GEODESIC_ORDER, - nA3_ = GEOGRAPHICLIB_GEODESIC_ORDER, - nA3x_ = nA3_, - nC3x_, nC4x_, - maxit1_ = 20, - maxit2_ = maxit1_ + m.digits + 10, - tol0_ = m.epsilon, - tol1_ = 200 * tol0_, - tol2_ = Math.sqrt(tol0_), - tolb_ = tol0_ * tol1_, - xthresh_ = 1000 * tol2_, - CAP_NONE = 0, - CAP_ALL = 0x1F, - CAP_MASK = CAP_ALL, - OUT_ALL = 0x7F80, - Astroid, - A1m1f_coeff, C1f_coeff, C1pf_coeff, - A2m1f_coeff, C2f_coeff, - A3_coeff, C3_coeff, C4_coeff; - - g.tiny_ = Math.sqrt(Number.MIN_VALUE); - g.nC1_ = GEOGRAPHICLIB_GEODESIC_ORDER; - g.nC1p_ = GEOGRAPHICLIB_GEODESIC_ORDER; - g.nC2_ = GEOGRAPHICLIB_GEODESIC_ORDER; - g.nC3_ = GEOGRAPHICLIB_GEODESIC_ORDER; - g.nC4_ = GEOGRAPHICLIB_GEODESIC_ORDER; - nC3x_ = (g.nC3_ * (g.nC3_ - 1)) / 2; - nC4x_ = (g.nC4_ * (g.nC4_ + 1)) / 2, - g.CAP_C1 = 1<<0; - g.CAP_C1p = 1<<1; - g.CAP_C2 = 1<<2; - g.CAP_C3 = 1<<3; - g.CAP_C4 = 1<<4; - - g.NONE = 0; - g.LATITUDE = 1<<7 | CAP_NONE; - g.LONGITUDE = 1<<8 | g.CAP_C3; - g.AZIMUTH = 1<<9 | CAP_NONE; - g.DISTANCE = 1<<10 | g.CAP_C1; - g.STANDARD = g.LATITUDE | g.LONGITUDE | g.AZIMUTH | g.DISTANCE; - g.DISTANCE_IN = 1<<11 | g.CAP_C1 | g.CAP_C1p; - g.REDUCEDLENGTH = 1<<12 | g.CAP_C1 | g.CAP_C2; - g.GEODESICSCALE = 1<<13 | g.CAP_C1 | g.CAP_C2; - g.AREA = 1<<14 | g.CAP_C4; - g.ALL = OUT_ALL| CAP_ALL; - g.LONG_UNROLL = 1<<15; - g.OUT_MASK = OUT_ALL| g.LONG_UNROLL; - - g.SinCosSeries = function(sinp, sinx, cosx, c) { - // Evaluate - // y = sinp ? sum(c[i] * sin( 2*i * x), i, 1, n) : - // sum(c[i] * cos((2*i+1) * x), i, 0, n-1) - // using Clenshaw summation. N.B. c[0] is unused for sin series - // Approx operation count = (n + 5) mult and (2 * n + 2) add - var k = c.length, // Point to one beyond last element - n = k - (sinp ? 1 : 0), - ar = 2 * (cosx - sinx) * (cosx + sinx), // 2 * cos(2 * x) - y0 = n & 1 ? c[--k] : 0, y1 = 0; // accumulators for sum - // Now n is even - n = Math.floor(n/2); - while (n--) { - // Unroll loop x 2, so accumulators return to their original role - y1 = ar * y0 - y1 + c[--k]; - y0 = ar * y1 - y0 + c[--k]; - } - return (sinp ? 2 * sinx * cosx * y0 : // sin(2 * x) * y0 - cosx * (y0 - y1)); // cos(x) * (y0 - y1) - }; - - Astroid = function(x, y) { - // Solve k^4+2*k^3-(x^2+y^2-1)*k^2-2*y^2*k-y^2 = 0 for positive - // root k. This solution is adapted from Geocentric::Reverse. - var k, - p = m.sq(x), - q = m.sq(y), - r = (p + q - 1) / 6, - S, r2, r3, disc, u, T3, T, ang, v, uv, w; - if ( !(q === 0 && r <= 0) ) { - // Avoid possible division by zero when r = 0 by multiplying - // equations for s and t by r^3 and r, resp. - S = p * q / 4; // S = r^3 * s - r2 = m.sq(r); - r3 = r * r2 - // The discriminant of the quadratic equation for T3. This is - // zero on the evolute curve p^(1/3)+q^(1/3) = 1 - disc = S * (S + 2 * r3); - u = r; - if (disc >= 0) { - T3 = S + r3; - // Pick the sign on the sqrt to maximize abs(T3). This - // minimizes loss of precision due to cancellation. The - // result is unchanged because of the way the T is used - // in definition of u. - T3 += T3 < 0 ? -Math.sqrt(disc) : Math.sqrt(disc); // T3 = (r * t)^3 - // N.B. cbrt always returns the real root. cbrt(-8) = -2. - T = m.cbrt(T3); // T = r * t - // T can be zero; but then r2 / T -> 0. - u += T + (T !== 0 ? r2 / T : 0); - } else { - // T is complex, but the way u is defined the result is real. - ang = Math.atan2(Math.sqrt(-disc), -(S + r3)); - // There are three possible cube roots. We choose the - // root which avoids cancellation. Note that disc < 0 - // implies that r < 0. - u += 2 * r * Math.cos(ang / 3); - } - v = Math.sqrt(m.sq(u) + q); // guaranteed positive - // Avoid loss of accuracy when u < 0. - uv = u < 0 ? q / (v - u) : u + v; // u+v, guaranteed positive - w = (uv - q) / (2 * v); // positive? - // Rearrange expression for k to avoid loss of accuracy due to - // subtraction. Division by 0 not possible because uv > 0, w >= 0. - k = uv / (Math.sqrt(uv + m.sq(w)) + w); // guaranteed positive - } else { // q == 0 && r <= 0 - // y = 0 with |x| <= 1. Handle this case directly. - // for y small, positive root is k = abs(y)/sqrt(1-x^2) - k = 0; - } - return k; - }; - - A1m1f_coeff = [ - // (1-eps)*A1-1, polynomial in eps2 of order 3 - +1, 4, 64, 0, 256 - ]; - - // The scale factor A1-1 = mean value of (d/dsigma)I1 - 1 - g.A1m1f = function(eps) { - var p = Math.floor(nA1_/2), - t = m.polyval(p, A1m1f_coeff, 0, m.sq(eps)) / A1m1f_coeff[p + 1]; - return (t + eps) / (1 - eps); - }; - - C1f_coeff = [ - // C1[1]/eps^1, polynomial in eps2 of order 2 - -1, 6, -16, 32, - // C1[2]/eps^2, polynomial in eps2 of order 2 - -9, 64, -128, 2048, - // C1[3]/eps^3, polynomial in eps2 of order 1 - +9, -16, 768, - // C1[4]/eps^4, polynomial in eps2 of order 1 - +3, -5, 512, - // C1[5]/eps^5, polynomial in eps2 of order 0 - -7, 1280, - // C1[6]/eps^6, polynomial in eps2 of order 0 - -7, 2048 - ]; - - // The coefficients C1[l] in the Fourier expansion of B1 - g.C1f = function(eps, c) { - var eps2 = m.sq(eps), - d = eps, - o = 0, - l, p; - for (l = 1; l <= g.nC1_; ++l) { // l is index of C1p[l] - p = Math.floor((g.nC1_ - l) / 2); // order of polynomial in eps^2 - c[l] = d * m.polyval(p, C1f_coeff, o, eps2) / C1f_coeff[o + p + 1]; - o += p + 2; - d *= eps; - } - }; - - C1pf_coeff = [ - // C1p[1]/eps^1, polynomial in eps2 of order 2 - +205, -432, 768, 1536, - // C1p[2]/eps^2, polynomial in eps2 of order 2 - +4005, -4736, 3840, 12288, - // C1p[3]/eps^3, polynomial in eps2 of order 1 - -225, 116, 384, - // C1p[4]/eps^4, polynomial in eps2 of order 1 - -7173, 2695, 7680, - // C1p[5]/eps^5, polynomial in eps2 of order 0 - +3467, 7680, - // C1p[6]/eps^6, polynomial in eps2 of order 0 - +38081, 61440 - ]; - - // The coefficients C1p[l] in the Fourier expansion of B1p - g.C1pf = function(eps, c) { - var eps2 = m.sq(eps), - d = eps, - o = 0, - l, p; - for (l = 1; l <= g.nC1p_; ++l) { // l is index of C1p[l] - p = Math.floor((g.nC1p_ - l) / 2); // order of polynomial in eps^2 - c[l] = d * m.polyval(p, C1pf_coeff, o, eps2) / C1pf_coeff[o + p + 1]; - o += p + 2; - d *= eps; - } - }; - - A2m1f_coeff = [ - // (eps+1)*A2-1, polynomial in eps2 of order 3 - -11, -28, -192, 0, 256 - ]; - - // The scale factor A2-1 = mean value of (d/dsigma)I2 - 1 - g.A2m1f = function(eps) { - var p = Math.floor(nA2_/2), - t = m.polyval(p, A2m1f_coeff, 0, m.sq(eps)) / A2m1f_coeff[p + 1]; - return (t - eps) / (1 + eps); - }; - - C2f_coeff = [ - // C2[1]/eps^1, polynomial in eps2 of order 2 - +1, 2, 16, 32, - // C2[2]/eps^2, polynomial in eps2 of order 2 - +35, 64, 384, 2048, - // C2[3]/eps^3, polynomial in eps2 of order 1 - +15, 80, 768, - // C2[4]/eps^4, polynomial in eps2 of order 1 - +7, 35, 512, - // C2[5]/eps^5, polynomial in eps2 of order 0 - +63, 1280, - // C2[6]/eps^6, polynomial in eps2 of order 0 - +77, 2048 - ]; - - // The coefficients C2[l] in the Fourier expansion of B2 - g.C2f = function(eps, c) { - var eps2 = m.sq(eps), - d = eps, - o = 0, - l, p; - for (l = 1; l <= g.nC2_; ++l) { // l is index of C2[l] - p = Math.floor((g.nC2_ - l) / 2); // order of polynomial in eps^2 - c[l] = d * m.polyval(p, C2f_coeff, o, eps2) / C2f_coeff[o + p + 1]; - o += p + 2; - d *= eps; - } - }; - - /** - * @class - * @property {number} a the equatorial radius (meters). - * @property {number} f the flattening. - * @summary Initialize a Geodesic object for a specific ellipsoid. - * @classdesc Performs geodesic calculations on an ellipsoid of revolution. - * The routines for solving the direct and inverse problems return an - * object with some of the following fields set: lat1, lon1, azi1, lat2, - * lon2, azi2, s12, a12, m12, M12, M21, S12. See {@tutorial 2-interface}, - * "The results". - * @example - * var GeographicLib = require("geographiclib"), - * geod = GeographicLib.Geodesic.WGS84; - * var inv = geod.Inverse(1,2,3,4); - * console.log("lat1 = " + inv.lat1 + ", lon1 = " + inv.lon1 + - * ", lat2 = " + inv.lat2 + ", lon2 = " + inv.lon2 + - * ",\nazi1 = " + inv.azi1 + ", azi2 = " + inv.azi2 + - * ", s12 = " + inv.s12); - * @param {number} a the equatorial radius of the ellipsoid (meters). - * @param {number} f the flattening of the ellipsoid. Setting f = 0 gives - * a sphere (on which geodesics are great circles). Negative f gives a - * prolate ellipsoid. - * @throws an error if the parameters are illegal. - */ - g.Geodesic = function(a, f) { - this.a = a; - this.f = f; - this._f1 = 1 - this.f; - this._e2 = this.f * (2 - this.f); - this._ep2 = this._e2 / m.sq(this._f1); // e2 / (1 - e2) - this._n = this.f / ( 2 - this.f); - this._b = this.a * this._f1; - // authalic radius squared - this._c2 = (m.sq(this.a) + m.sq(this._b) * - (this._e2 === 0 ? 1 : - (this._e2 > 0 ? m.atanh(Math.sqrt(this._e2)) : - Math.atan(Math.sqrt(-this._e2))) / - Math.sqrt(Math.abs(this._e2))))/2; - // The sig12 threshold for "really short". Using the auxiliary sphere - // solution with dnm computed at (bet1 + bet2) / 2, the relative error in - // the azimuth consistency check is sig12^2 * abs(f) * min(1, 1-f/2) / 2. - // (Error measured for 1/100 < b/a < 100 and abs(f) >= 1/1000. For a given - // f and sig12, the max error occurs for lines near the pole. If the old - // rule for computing dnm = (dn1 + dn2)/2 is used, then the error increases - // by a factor of 2.) Setting this equal to epsilon gives sig12 = etol2. - // Here 0.1 is a safety factor (error decreased by 100) and max(0.001, - // abs(f)) stops etol2 getting too large in the nearly spherical case. - this._etol2 = 0.1 * tol2_ / - Math.sqrt( Math.max(0.001, Math.abs(this.f)) * - Math.min(1.0, 1 - this.f/2) / 2 ); - if (!(isFinite(this.a) && this.a > 0)) - throw new Error("Major radius is not positive"); - if (!(isFinite(this._b) && this._b > 0)) - throw new Error("Minor radius is not positive"); - this._A3x = new Array(nA3x_); - this._C3x = new Array(nC3x_); - this._C4x = new Array(nC4x_); - this.A3coeff(); - this.C3coeff(); - this.C4coeff(); - }; - - A3_coeff = [ - // A3, coeff of eps^5, polynomial in n of order 0 - -3, 128, - // A3, coeff of eps^4, polynomial in n of order 1 - -2, -3, 64, - // A3, coeff of eps^3, polynomial in n of order 2 - -1, -3, -1, 16, - // A3, coeff of eps^2, polynomial in n of order 2 - +3, -1, -2, 8, - // A3, coeff of eps^1, polynomial in n of order 1 - +1, -1, 2, - // A3, coeff of eps^0, polynomial in n of order 0 - +1, 1 - ]; - - // The scale factor A3 = mean value of (d/dsigma)I3 - g.Geodesic.prototype.A3coeff = function() { - var o = 0, k = 0, - j, p; - for (j = nA3_ - 1; j >= 0; --j) { // coeff of eps^j - p = Math.min(nA3_ - j - 1, j); // order of polynomial in n - this._A3x[k++] = m.polyval(p, A3_coeff, o, this._n) - / A3_coeff[o + p + 1]; - o += p + 2; - } - }; - - C3_coeff = [ - // C3[1], coeff of eps^5, polynomial in n of order 0 - +3, 128, - // C3[1], coeff of eps^4, polynomial in n of order 1 - +2, 5, 128, - // C3[1], coeff of eps^3, polynomial in n of order 2 - -1, 3, 3, 64, - // C3[1], coeff of eps^2, polynomial in n of order 2 - -1, 0, 1, 8, - // C3[1], coeff of eps^1, polynomial in n of order 1 - -1, 1, 4, - // C3[2], coeff of eps^5, polynomial in n of order 0 - +5, 256, - // C3[2], coeff of eps^4, polynomial in n of order 1 - +1, 3, 128, - // C3[2], coeff of eps^3, polynomial in n of order 2 - -3, -2, 3, 64, - // C3[2], coeff of eps^2, polynomial in n of order 2 - +1, -3, 2, 32, - // C3[3], coeff of eps^5, polynomial in n of order 0 - +7, 512, - // C3[3], coeff of eps^4, polynomial in n of order 1 - -10, 9, 384, - // C3[3], coeff of eps^3, polynomial in n of order 2 - +5, -9, 5, 192, - // C3[4], coeff of eps^5, polynomial in n of order 0 - +7, 512, - // C3[4], coeff of eps^4, polynomial in n of order 1 - -14, 7, 512, - // C3[5], coeff of eps^5, polynomial in n of order 0 - +21, 2560 - ]; - - // The coefficients C3[l] in the Fourier expansion of B3 - g.Geodesic.prototype.C3coeff = function() { - var o = 0, k = 0, - l, j, p; - for (l = 1; l < g.nC3_; ++l) { // l is index of C3[l] - for (j = g.nC3_ - 1; j >= l; --j) { // coeff of eps^j - p = Math.min(g.nC3_ - j - 1, j); // order of polynomial in n - this._C3x[k++] = m.polyval(p, C3_coeff, o, this._n) / - C3_coeff[o + p + 1]; - o += p + 2; - } - } - }; - - C4_coeff = [ - // C4[0], coeff of eps^5, polynomial in n of order 0 - +97, 15015, - // C4[0], coeff of eps^4, polynomial in n of order 1 - +1088, 156, 45045, - // C4[0], coeff of eps^3, polynomial in n of order 2 - -224, -4784, 1573, 45045, - // C4[0], coeff of eps^2, polynomial in n of order 3 - -10656, 14144, -4576, -858, 45045, - // C4[0], coeff of eps^1, polynomial in n of order 4 - +64, 624, -4576, 6864, -3003, 15015, - // C4[0], coeff of eps^0, polynomial in n of order 5 - +100, 208, 572, 3432, -12012, 30030, 45045, - // C4[1], coeff of eps^5, polynomial in n of order 0 - +1, 9009, - // C4[1], coeff of eps^4, polynomial in n of order 1 - -2944, 468, 135135, - // C4[1], coeff of eps^3, polynomial in n of order 2 - +5792, 1040, -1287, 135135, - // C4[1], coeff of eps^2, polynomial in n of order 3 - +5952, -11648, 9152, -2574, 135135, - // C4[1], coeff of eps^1, polynomial in n of order 4 - -64, -624, 4576, -6864, 3003, 135135, - // C4[2], coeff of eps^5, polynomial in n of order 0 - +8, 10725, - // C4[2], coeff of eps^4, polynomial in n of order 1 - +1856, -936, 225225, - // C4[2], coeff of eps^3, polynomial in n of order 2 - -8448, 4992, -1144, 225225, - // C4[2], coeff of eps^2, polynomial in n of order 3 - -1440, 4160, -4576, 1716, 225225, - // C4[3], coeff of eps^5, polynomial in n of order 0 - -136, 63063, - // C4[3], coeff of eps^4, polynomial in n of order 1 - +1024, -208, 105105, - // C4[3], coeff of eps^3, polynomial in n of order 2 - +3584, -3328, 1144, 315315, - // C4[4], coeff of eps^5, polynomial in n of order 0 - -128, 135135, - // C4[4], coeff of eps^4, polynomial in n of order 1 - -2560, 832, 405405, - // C4[5], coeff of eps^5, polynomial in n of order 0 - +128, 99099 - ]; - - g.Geodesic.prototype.C4coeff = function() { - var o = 0, k = 0, - l, j, p; - for (l = 0; l < g.nC4_; ++l) { // l is index of C4[l] - for (j = g.nC4_ - 1; j >= l; --j) { // coeff of eps^j - p = g.nC4_ - j - 1; // order of polynomial in n - this._C4x[k++] = m.polyval(p, C4_coeff, o, this._n) - / C4_coeff[o + p + 1]; - o += p + 2; - } - } - }; - - g.Geodesic.prototype.A3f = function(eps) { - // Evaluate A3 - return m.polyval(nA3x_ - 1, this._A3x, 0, eps); - }; - - g.Geodesic.prototype.C3f = function(eps, c) { - // Evaluate C3 coeffs - // Elements c[1] thru c[nC3_ - 1] are set - var mult = 1, - o = 0, - l, p; - for (l = 1; l < g.nC3_; ++l) { // l is index of C3[l] - p = g.nC3_ - l - 1; // order of polynomial in eps - mult *= eps; - c[l] = mult * m.polyval(p, this._C3x, o, eps); - o += p + 1; - } - }; - - g.Geodesic.prototype.C4f = function(eps, c) { - // Evaluate C4 coeffs - // Elements c[0] thru c[g.nC4_ - 1] are set - var mult = 1, - o = 0, - l, p; - for (l = 0; l < g.nC4_; ++l) { // l is index of C4[l] - p = g.nC4_ - l - 1; // order of polynomial in eps - c[l] = mult * m.polyval(p, this._C4x, o, eps); - o += p + 1; - mult *= eps; - } - }; - - // return s12b, m12b, m0, M12, M21 - g.Geodesic.prototype.Lengths = function(eps, sig12, - ssig1, csig1, dn1, ssig2, csig2, dn2, - cbet1, cbet2, outmask, - C1a, C2a) { - // Return m12b = (reduced length)/_b; also calculate s12b = - // distance/_b, and m0 = coefficient of secular term in - // expression for reduced length. - outmask &= g.OUT_MASK; - var vals = {}, - m0x = 0, J12 = 0, A1 = 0, A2 = 0, - B1, B2, l, csig12, t; - if (outmask & (g.DISTANCE | g.REDUCEDLENGTH | g.GEODESICSCALE)) { - A1 = g.A1m1f(eps); - g.C1f(eps, C1a); - if (outmask & (g.REDUCEDLENGTH | g.GEODESICSCALE)) { - A2 = g.A2m1f(eps); - g.C2f(eps, C2a); - m0x = A1 - A2; - A2 = 1 + A2; - } - A1 = 1 + A1; - } - if (outmask & g.DISTANCE) { - B1 = g.SinCosSeries(true, ssig2, csig2, C1a) - - g.SinCosSeries(true, ssig1, csig1, C1a); - // Missing a factor of _b - vals.s12b = A1 * (sig12 + B1); - if (outmask & (g.REDUCEDLENGTH | g.GEODESICSCALE)) { - B2 = g.SinCosSeries(true, ssig2, csig2, C2a) - - g.SinCosSeries(true, ssig1, csig1, C2a); - J12 = m0x * sig12 + (A1 * B1 - A2 * B2); - } - } else if (outmask & (g.REDUCEDLENGTH | g.GEODESICSCALE)) { - // Assume here that nC1_ >= nC2_ - for (l = 1; l <= g.nC2_; ++l) - C2a[l] = A1 * C1a[l] - A2 * C2a[l]; - J12 = m0x * sig12 + (g.SinCosSeries(true, ssig2, csig2, C2a) - - g.SinCosSeries(true, ssig1, csig1, C2a)); - } - if (outmask & g.REDUCEDLENGTH) { - vals.m0 = m0x; - // Missing a factor of _b. - // Add parens around (csig1 * ssig2) and (ssig1 * csig2) to ensure - // accurate cancellation in the case of coincident points. - vals.m12b = dn2 * (csig1 * ssig2) - dn1 * (ssig1 * csig2) - - csig1 * csig2 * J12; - } - if (outmask & g.GEODESICSCALE) { - csig12 = csig1 * csig2 + ssig1 * ssig2; - t = this._ep2 * (cbet1 - cbet2) * (cbet1 + cbet2) / (dn1 + dn2); - vals.M12 = csig12 + (t * ssig2 - csig2 * J12) * ssig1 / dn1; - vals.M21 = csig12 - (t * ssig1 - csig1 * J12) * ssig2 / dn2; - } - return vals; - }; - - // return sig12, salp1, calp1, salp2, calp2, dnm - g.Geodesic.prototype.InverseStart = function(sbet1, cbet1, dn1, - sbet2, cbet2, dn2, lam12, - C1a, C2a) { - // Return a starting point for Newton's method in salp1 and calp1 - // (function value is -1). If Newton's method doesn't need to be - // used, return also salp2 and calp2 and function value is sig12. - // salp2, calp2 only updated if return val >= 0. - var vals = {}, - // bet12 = bet2 - bet1 in [0, pi); bet12a = bet2 + bet1 in (-pi, 0] - sbet12 = sbet2 * cbet1 - cbet2 * sbet1, - cbet12 = cbet2 * cbet1 + sbet2 * sbet1, - sbet12a, shortline, omg12, sbetm2, somg12, comg12, t, ssig12, csig12, - x, y, lamscale, betscale, k2, eps, cbet12a, bet12a, m12b, m0, nvals, - k, omg12a; - vals.sig12 = -1; // Return value - // Volatile declaration needed to fix inverse cases - // 88.202499451857 0 -88.202499451857 179.981022032992859592 - // 89.262080389218 0 -89.262080389218 179.992207982775375662 - // 89.333123580033 0 -89.333123580032997687 179.99295812360148422 - // which otherwise fail with g++ 4.4.4 x86 -O3 - sbet12a = sbet2 * cbet1; - sbet12a += cbet2 * sbet1; - - shortline = cbet12 >= 0 && sbet12 < 0.5 && cbet2 * lam12 < 0.5; - omg12 = lam12; - if (shortline) { - sbetm2 = m.sq(sbet1 + sbet2); - // sin((bet1+bet2)/2)^2 - // = (sbet1 + sbet2)^2 / ((sbet1 + sbet2)^2 + (cbet1 + cbet2)^2) - sbetm2 /= sbetm2 + m.sq(cbet1 + cbet2); - vals.dnm = Math.sqrt(1 + this._ep2 * sbetm2); - omg12 /= this._f1 * vals.dnm; - } - somg12 = Math.sin(omg12); comg12 = Math.cos(omg12); - - vals.salp1 = cbet2 * somg12; - vals.calp1 = comg12 >= 0 ? - sbet12 + cbet2 * sbet1 * m.sq(somg12) / (1 + comg12) : - sbet12a - cbet2 * sbet1 * m.sq(somg12) / (1 - comg12); - - ssig12 = m.hypot(vals.salp1, vals.calp1); - csig12 = sbet1 * sbet2 + cbet1 * cbet2 * comg12; - - if (shortline && ssig12 < this._etol2) { - // really short lines - vals.salp2 = cbet1 * somg12; - vals.calp2 = sbet12 - cbet1 * sbet2 * - (comg12 >= 0 ? m.sq(somg12) / (1 + comg12) : 1 - comg12); - // norm(vals.salp2, vals.calp2); - t = m.hypot(vals.salp2, vals.calp2); vals.salp2 /= t; vals.calp2 /= t; - // Set return value - vals.sig12 = Math.atan2(ssig12, csig12); - } else if (Math.abs(this._n) > 0.1 || // Skip astroid calc if too eccentric - csig12 >= 0 || - ssig12 >= 6 * Math.abs(this._n) * Math.PI * m.sq(cbet1)) { - // Nothing to do, zeroth order spherical approximation is OK - } else { - // Scale lam12 and bet2 to x, y coordinate system where antipodal - // point is at origin and singular point is at y = 0, x = -1. - if (this.f >= 0) { // In fact f == 0 does not get here - // x = dlong, y = dlat - k2 = m.sq(sbet1) * this._ep2; - eps = k2 / (2 * (1 + Math.sqrt(1 + k2)) + k2); - lamscale = this.f * cbet1 * this.A3f(eps) * Math.PI; - betscale = lamscale * cbet1; - - x = (lam12 - Math.PI) / lamscale; - y = sbet12a / betscale; - } else { // f < 0 - // x = dlat, y = dlong - cbet12a = cbet2 * cbet1 - sbet2 * sbet1; - bet12a = Math.atan2(sbet12a, cbet12a); - // In the case of lon12 = 180, this repeats a calculation made - // in Inverse. - nvals = this.Lengths(this._n, Math.PI + bet12a, - sbet1, -cbet1, dn1, sbet2, cbet2, dn2, - cbet1, cbet2, g.REDUCEDLENGTH, C1a, C2a); - m12b = nvals.m12b; m0 = nvals.m0; - x = -1 + m12b / (cbet1 * cbet2 * m0 * Math.PI); - betscale = x < -0.01 ? sbet12a / x : - -this.f * m.sq(cbet1) * Math.PI; - lamscale = betscale / cbet1; - y = (lam12 - Math.PI) / lamscale; - } - - if (y > -tol1_ && x > -1 - xthresh_) { - // strip near cut - if (this.f >= 0) { - vals.salp1 = Math.min(1, -x); - vals.calp1 = - Math.sqrt(1 - m.sq(vals.salp1)); - } else { - vals.calp1 = Math.max(x > -tol1_ ? 0 : -1, x); - vals.salp1 = Math.sqrt(1 - m.sq(vals.calp1)); - } - } else { - // Estimate alp1, by solving the astroid problem. - // - // Could estimate alpha1 = theta + pi/2, directly, i.e., - // calp1 = y/k; salp1 = -x/(1+k); for f >= 0 - // calp1 = x/(1+k); salp1 = -y/k; for f < 0 (need to check) - // - // However, it's better to estimate omg12 from astroid and use - // spherical formula to compute alp1. This reduces the mean number of - // Newton iterations for astroid cases from 2.24 (min 0, max 6) to 2.12 - // (min 0 max 5). The changes in the number of iterations are as - // follows: - // - // change percent - // 1 5 - // 0 78 - // -1 16 - // -2 0.6 - // -3 0.04 - // -4 0.002 - // - // The histogram of iterations is (m = number of iterations estimating - // alp1 directly, n = number of iterations estimating via omg12, total - // number of trials = 148605): - // - // iter m n - // 0 148 186 - // 1 13046 13845 - // 2 93315 102225 - // 3 36189 32341 - // 4 5396 7 - // 5 455 1 - // 6 56 0 - // - // Because omg12 is near pi, estimate work with omg12a = pi - omg12 - k = Astroid(x, y); - omg12a = lamscale * ( this.f >= 0 ? -x * k/(1 + k) : -y * (1 + k)/k ); - somg12 = Math.sin(omg12a); comg12 = -Math.cos(omg12a); - // Update spherical estimate of alp1 using omg12 instead of - // lam12 - vals.salp1 = cbet2 * somg12; - vals.calp1 = sbet12a - - cbet2 * sbet1 * m.sq(somg12) / (1 - comg12); - } - } - // Sanity check on starting guess. Backwards check allows NaN through. - if (!(vals.salp1 <= 0)) { - // norm(vals.salp1, vals.calp1); - t = m.hypot(vals.salp1, vals.calp1); vals.salp1 /= t; vals.calp1 /= t; - } else { - vals.salp1 = 1; vals.calp1 = 0; - } - return vals; - }; - - // return lam12, salp2, calp2, sig12, ssig1, csig1, ssig2, csig2, eps, - // domg12, dlam12, - g.Geodesic.prototype.Lambda12 = function(sbet1, cbet1, dn1, sbet2, cbet2, dn2, - salp1, calp1, diffp, - C1a, C2a, C3a) { - var vals = {}, - t, salp0, calp0, - somg1, comg1, somg2, comg2, omg12, B312, h0, k2, nvals; - if (sbet1 === 0 && calp1 === 0) - // Break degeneracy of equatorial line. This case has already been - // handled. - calp1 = -g.tiny_; - - // sin(alp1) * cos(bet1) = sin(alp0) - salp0 = salp1 * cbet1; - calp0 = m.hypot(calp1, salp1 * sbet1); // calp0 > 0 - - // tan(bet1) = tan(sig1) * cos(alp1) - // tan(omg1) = sin(alp0) * tan(sig1) = tan(omg1)=tan(alp1)*sin(bet1) - vals.ssig1 = sbet1; somg1 = salp0 * sbet1; - vals.csig1 = comg1 = calp1 * cbet1; - // norm(vals.ssig1, vals.csig1); - t = m.hypot(vals.ssig1, vals.csig1); vals.ssig1 /= t; vals.csig1 /= t; - // norm(somg1, comg1); -- don't need to normalize! - - // Enforce symmetries in the case abs(bet2) = -bet1. Need to be careful - // about this case, since this can yield singularities in the Newton - // iteration. - // sin(alp2) * cos(bet2) = sin(alp0) - vals.salp2 = cbet2 !== cbet1 ? salp0 / cbet2 : salp1; - // calp2 = sqrt(1 - sq(salp2)) - // = sqrt(sq(calp0) - sq(sbet2)) / cbet2 - // and subst for calp0 and rearrange to give (choose positive sqrt - // to give alp2 in [0, pi/2]). - vals.calp2 = cbet2 !== cbet1 || Math.abs(sbet2) !== -sbet1 ? - Math.sqrt(m.sq(calp1 * cbet1) + (cbet1 < -sbet1 ? - (cbet2 - cbet1) * (cbet1 + cbet2) : - (sbet1 - sbet2) * (sbet1 + sbet2))) / - cbet2 : Math.abs(calp1); - // tan(bet2) = tan(sig2) * cos(alp2) - // tan(omg2) = sin(alp0) * tan(sig2). - vals.ssig2 = sbet2; somg2 = salp0 * sbet2; - vals.csig2 = comg2 = vals.calp2 * cbet2; - // norm(vals.ssig2, vals.csig2); - t = m.hypot(vals.ssig2, vals.csig2); vals.ssig2 /= t; vals.csig2 /= t; - // norm(somg2, comg2); -- don't need to normalize! - - // sig12 = sig2 - sig1, limit to [0, pi] - vals.sig12 = Math.atan2(Math.max(0, vals.csig1 * vals.ssig2 - - vals.ssig1 * vals.csig2), - vals.csig1 * vals.csig2 + vals.ssig1 * vals.ssig2); - - // omg12 = omg2 - omg1, limit to [0, pi] - omg12 = Math.atan2(Math.max(0, comg1 * somg2 - somg1 * comg2), - comg1 * comg2 + somg1 * somg2); - k2 = m.sq(calp0) * this._ep2; - vals.eps = k2 / (2 * (1 + Math.sqrt(1 + k2)) + k2); - this.C3f(vals.eps, C3a); - B312 = (g.SinCosSeries(true, vals.ssig2, vals.csig2, C3a) - - g.SinCosSeries(true, vals.ssig1, vals.csig1, C3a)); - h0 = -this.f * this.A3f(vals.eps); - vals.domg12 = salp0 * h0 * (vals.sig12 + B312); - vals.lam12 = omg12 + vals.domg12; - - if (diffp) { - if (vals.calp2 === 0) - vals.dlam12 = - 2 * this._f1 * dn1 / sbet1; - else { - nvals = this.Lengths(vals.eps, vals.sig12, - vals.ssig1, vals.csig1, dn1, - vals.ssig2, vals.csig2, dn2, - cbet1, cbet2, g.REDUCEDLENGTH, C1a, C2a); - vals.dlam12 = nvals.m12b; - vals.dlam12 *= this._f1 / (vals.calp2 * cbet2); - } - } - return vals; - }; - - /** - * @summary Solve the inverse geodesic problem. - * @param {number} lat1 the latitude of the first point in degrees. - * @param {number} lon1 the longitude of the first point in degrees. - * @param {number} lat2 the latitude of the second point in degrees. - * @param {number} lon2 the longitude of the second point in degrees. - * @param {bitmask} [outmask = STANDARD] which results to include. - * @returns {object} the requested results - * @description The lat1, lon1, lat2, lon2, and a12 fields of the result are - * always set. For details on the outmask parameter, see {@tutorial - * 2-interface}, "The outmask and caps parameters". - */ - g.Geodesic.prototype.Inverse = function(lat1, lon1, lat2, lon2, outmask) { - var vals = {}, - lon12, lonsign, t, swapp, latsign, - sbet1, cbet1, sbet2, cbet2, s12x, m12x, - dn1, dn2, lam12, slam12, clam12, - sig12, calp1, salp1, calp2, salp2, C1a, C2a, C3a, meridian, nvals, - ssig1, csig1, ssig2, csig2, eps, omg12, dnm, - numit, salp1a, calp1a, salp1b, calp1b, - tripn, tripb, v, dv, dalp1, sdalp1, cdalp1, nsalp1, - lengthmask, salp0, calp0, alp12, k2, A4, C4a, B41, B42, - somg12, domg12, dbet1, dbet2, salp12, calp12; - if (!outmask) outmask = g.STANDARD; - if (outmask == g.LONG_UNROLL) outmask |= g.STANDARD; - outmask &= g.OUT_MASK; - // Compute longitude difference (AngDiff does this carefully). Result is - // in [-180, 180] but -180 is only for west-going geodesics. 180 is for - // east-going and meridional geodesics. - vals.lat1 = lat1 = m.LatFix(lat1); vals.lat2 = lat2 = m.LatFix(lat2); - lon12 = m.AngDiff(lon1, lon2); - if (outmask & g.LONG_UNROLL) { - vals.lon1 = lon1; vals.lon2 = lon1 + lon12; - } else { - vals.lon1 = m.AngNormalize(lon1); vals.lon2 = m.AngNormalize(lon2); - } - // If very close to being on the same half-meridian, then make it so. - lon12 = m.AngRound(lon12); - // Make longitude difference positive. - lonsign = lon12 >= 0 ? 1 : -1; - lon12 *= lonsign; - // If really close to the equator, treat as on equator. - lat1 = m.AngRound(lat1); - lat2 = m.AngRound(lat2); - // Swap points so that point with higher (abs) latitude is point 1 - // If one latitude is a nan, then it becomes lat1. - swapp = Math.abs(lat1) < Math.abs(lat2) ? -1 : 1; - if (swapp < 0) { - lonsign *= -1; - t = lat1; - lat1 = lat2; - lat2 = t; - // swap(lat1, lat2); - } - // Make lat1 <= 0 - latsign = lat1 < 0 ? 1 : -1; - lat1 *= latsign; - lat2 *= latsign; - // Now we have - // - // 0 <= lon12 <= 180 - // -90 <= lat1 <= 0 - // lat1 <= lat2 <= -lat1 - // - // longsign, swapp, latsign register the transformation to bring the - // coordinates to this canonical form. In all cases, 1 means no change was - // made. We make these transformations so that there are few cases to - // check, e.g., on verifying quadrants in atan2. In addition, this - // enforces some symmetries in the results returned. - - t = m.sincosd(lat1); sbet1 = this._f1 * t.s; cbet1 = t.c; - // norm(sbet1, cbet1); - t = m.hypot(sbet1, cbet1); sbet1 /= t; cbet1 /= t; - // Ensure cbet1 = +epsilon at poles - cbet1 = Math.max(g.tiny_, cbet1); - - t = m.sincosd(lat2); sbet2 = this._f1 * t.s; cbet2 = t.c; - // norm(sbet2, cbet2); - t = m.hypot(sbet2, cbet2); sbet2 /= t; cbet2 /= t; - // Ensure cbet2 = +epsilon at poles - cbet2 = Math.max(g.tiny_, cbet2); - - // If cbet1 < -sbet1, then cbet2 - cbet1 is a sensitive measure of the - // |bet1| - |bet2|. Alternatively (cbet1 >= -sbet1), abs(sbet2) + sbet1 is - // a better measure. This logic is used in assigning calp2 in Lambda12. - // Sometimes these quantities vanish and in that case we force bet2 = +/- - // bet1 exactly. An example where is is necessary is the inverse problem - // 48.522876735459 0 -48.52287673545898293 179.599720456223079643 - // which failed with Visual Studio 10 (Release and Debug) - - if (cbet1 < -sbet1) { - if (cbet2 === cbet1) - sbet2 = sbet2 < 0 ? sbet1 : -sbet1; - } else { - if (Math.abs(sbet2) === -sbet1) - cbet2 = cbet1; - } - - dn1 = Math.sqrt(1 + this._ep2 * m.sq(sbet1)); - dn2 = Math.sqrt(1 + this._ep2 * m.sq(sbet2)); - - lam12 = lon12 * m.degree; - t = m.sincosd(lon12); slam12 = t.s; clam12 = t.c; - - // index zero elements of these arrays are unused - C1a = new Array(g.nC1_ + 1); - C2a = new Array(g.nC2_ + 1) - C3a = new Array(g.nC3_); - - meridian = lat1 === -90 || slam12 === 0; - if (meridian) { - - // Endpoints are on a single full meridian, so the geodesic might - // lie on a meridian. - - calp1 = clam12; salp1 = slam12; // Head to the target longitude - calp2 = 1; salp2 = 0; // At the target we're heading north - - // tan(bet) = tan(sig) * cos(alp) - ssig1 = sbet1; csig1 = calp1 * cbet1; - ssig2 = sbet2; csig2 = calp2 * cbet2; - - // sig12 = sig2 - sig1 - sig12 = Math.atan2(Math.max(0, csig1 * ssig2 - ssig1 * csig2), - csig1 * csig2 + ssig1 * ssig2); - nvals = this.Lengths(this._n, sig12, - ssig1, csig1, dn1, ssig2, csig2, dn2, cbet1, cbet2, - outmask | g.DISTANCE | g.REDUCEDLENGTH, - C1a, C2a); - s12x = nvals.s12b; - m12x = nvals.m12b; - // Ignore m0 - if ((outmask & g.GEODESICSCALE) !== 0) { - vals.M12 = nvals.M12; - vals.M21 = nvals.M21; - } - // Add the check for sig12 since zero length geodesics might yield - // m12 < 0. Test case was - // - // echo 20.001 0 20.001 0 | GeodSolve -i - // - // In fact, we will have sig12 > pi/2 for meridional geodesic - // which is not a shortest path. - if (sig12 < 1 || m12x >= 0) { - // Need at least 2, to handle 90 0 90 180 - if (sig12 < 3 * g.tiny_) - sig12 = m12x = s12x = 0; - m12x *= this._b; - s12x *= this._b; - vals.a12 = sig12 / m.degree; - } else - // m12 < 0, i.e., prolate and too close to anti-podal - meridian = false; - } - - if (!meridian && - sbet1 === 0 && // and sbet2 == 0 - // Mimic the way Lambda12 works with calp1 = 0 - (this.f <= 0 || lam12 <= Math.PI - this.f * Math.PI)) { - - // Geodesic runs along equator - calp1 = calp2 = 0; salp1 = salp2 = 1; - s12x = this.a * lam12; - sig12 = omg12 = lam12 / this._f1; - m12x = this._b * Math.sin(sig12); - if (outmask & g.GEODESICSCALE) - vals.M12 = vals.M21 = Math.cos(sig12); - vals.a12 = lon12 / this._f1; - - } else if (!meridian) { - - // Now point1 and point2 belong within a hemisphere bounded by a - // meridian and geodesic is neither meridional or equatorial. - - // Figure a starting point for Newton's method - nvals = this.InverseStart(sbet1, cbet1, dn1, sbet2, cbet2, dn2, lam12, - C1a, C2a); - sig12 = nvals.sig12; - salp1 = nvals.salp1; - calp1 = nvals.calp1; - - if (sig12 >= 0) { - salp2 = nvals.salp2; - calp2 = nvals.calp2; - // Short lines (InverseStart sets salp2, calp2, dnm) - - dnm = nvals.dnm; - s12x = sig12 * this._b * dnm; - m12x = m.sq(dnm) * this._b * Math.sin(sig12 / dnm); - if (outmask & g.GEODESICSCALE) - vals.M12 = vals.M21 = Math.cos(sig12 / dnm); - vals.a12 = sig12 / m.degree; - omg12 = lam12 / (this._f1 * dnm); - } else { - - // Newton's method. This is a straightforward solution of f(alp1) = - // lambda12(alp1) - lam12 = 0 with one wrinkle. f(alp) has exactly one - // root in the interval (0, pi) and its derivative is positive at the - // root. Thus f(alp) is positive for alp > alp1 and negative for alp < - // alp1. During the course of the iteration, a range (alp1a, alp1b) is - // maintained which brackets the root and with each evaluation of - // f(alp) the range is shrunk if possible. Newton's method is - // restarted whenever the derivative of f is negative (because the new - // value of alp1 is then further from the solution) or if the new - // estimate of alp1 lies outside (0,pi); in this case, the new starting - // guess is taken to be (alp1a + alp1b) / 2. - numit = 0; - // Bracketing range - salp1a = g.tiny_; calp1a = 1; salp1b = g.tiny_; calp1b = -1; - for (tripn = false, tripb = false; numit < maxit2_; ++numit) { - // the WGS84 test set: mean = 1.47, sd = 1.25, max = 16 - // WGS84 and random input: mean = 2.85, sd = 0.60 - nvals = this.Lambda12(sbet1, cbet1, dn1, sbet2, cbet2, dn2, - salp1, calp1, numit < maxit1_, - C1a, C2a, C3a); - v = nvals.lam12 - lam12; - salp2 = nvals.salp2; - calp2 = nvals.calp2; - sig12 = nvals.sig12; - ssig1 = nvals.ssig1; - csig1 = nvals.csig1; - ssig2 = nvals.ssig2; - csig2 = nvals.csig2; - eps = nvals.eps; - omg12 = nvals.domg12; - dv = nvals.dlam12; - - // 2 * tol0 is approximately 1 ulp for a number in [0, pi]. - // Reversed test to allow escape with NaNs - if (tripb || !(Math.abs(v) >= (tripn ? 8 : 2) * tol0_)) - break; - // Update bracketing values - if (v > 0 && (numit < maxit1_ || calp1/salp1 > calp1b/salp1b)) { - salp1b = salp1; calp1b = calp1; - } else if (v < 0 && - (numit < maxit1_ || calp1/salp1 < calp1a/salp1a)) { - salp1a = salp1; calp1a = calp1; - } - if (numit < maxit1_ && dv > 0) { - dalp1 = -v/dv; - sdalp1 = Math.sin(dalp1); cdalp1 = Math.cos(dalp1); - nsalp1 = salp1 * cdalp1 + calp1 * sdalp1; - if (nsalp1 > 0 && Math.abs(dalp1) < Math.PI) { - calp1 = calp1 * cdalp1 - salp1 * sdalp1; - salp1 = nsalp1; - // norm(salp1, calp1); - t = m.hypot(salp1, calp1); salp1 /= t; calp1 /= t; - // In some regimes we don't get quadratic convergence because - // slope -> 0. So use convergence conditions based on epsilon - // instead of sqrt(epsilon). - tripn = Math.abs(v) <= 16 * tol0_; - continue; - } - } - // Either dv was not postive or updated value was outside legal - // range. Use the midpoint of the bracket as the next estimate. - // This mechanism is not needed for the WGS84 ellipsoid, but it does - // catch problems with more eccentric ellipsoids. Its efficacy is - // such for the WGS84 test set with the starting guess set to alp1 = - // 90deg: - // the WGS84 test set: mean = 5.21, sd = 3.93, max = 24 - // WGS84 and random input: mean = 4.74, sd = 0.99 - salp1 = (salp1a + salp1b)/2; - calp1 = (calp1a + calp1b)/2; - // norm(salp1, calp1); - t = m.hypot(salp1, calp1); salp1 /= t; calp1 /= t; - tripn = false; - tripb = (Math.abs(salp1a - salp1) + (calp1a - calp1) < tolb_ || - Math.abs(salp1 - salp1b) + (calp1 - calp1b) < tolb_); - } - lengthmask = outmask | - (outmask & (g.REDUCEDLENGTH | g.GEODESICSCALE) ? - g.DISTANCE : g.NONE); - nvals = this.Lengths(eps, sig12, - ssig1, csig1, dn1, ssig2, csig2, dn2, cbet1, cbet2, - lengthmask, C1a, C2a); - s12x = nvals.s12b; - m12x = nvals.m12b; - // Ignore m0 - if ((outmask & g.GEODESICSCALE) !== 0) { - vals.M12 = nvals.M12; - vals.M21 = nvals.M21; - } - m12x *= this._b; - s12x *= this._b; - vals.a12 = sig12 / m.degree; - omg12 = lam12 - omg12; - } - } - - if (outmask & g.DISTANCE) - vals.s12 = 0 + s12x; // Convert -0 to 0 - - if (outmask & g.REDUCEDLENGTH) - vals.m12 = 0 + m12x; // Convert -0 to 0 - - if (outmask & g.AREA) { - // From Lambda12: sin(alp1) * cos(bet1) = sin(alp0) - salp0 = salp1 * cbet1; - calp0 = m.hypot(calp1, salp1 * sbet1); // calp0 > 0 - if (calp0 !== 0 && salp0 !== 0) { - // From Lambda12: tan(bet) = tan(sig) * cos(alp) - ssig1 = sbet1; csig1 = calp1 * cbet1; - ssig2 = sbet2; csig2 = calp2 * cbet2; - k2 = m.sq(calp0) * this._ep2; - eps = k2 / (2 * (1 + Math.sqrt(1 + k2)) + k2); - // Multiplier = a^2 * e^2 * cos(alpha0) * sin(alpha0). - A4 = m.sq(this.a) * calp0 * salp0 * this._e2; - // norm(ssig1, csig1); - t = m.hypot(ssig1, csig1); ssig1 /= t; csig1 /= t; - // norm(ssig2, csig2); - t = m.hypot(ssig2, csig2); ssig2 /= t; csig2 /= t; - C4a = new Array(g.nC4_); - this.C4f(eps, C4a); - B41 = g.SinCosSeries(false, ssig1, csig1, C4a); - B42 = g.SinCosSeries(false, ssig2, csig2, C4a); - vals.S12 = A4 * (B42 - B41); - } else - // Avoid problems with indeterminate sig1, sig2 on equator - vals.S12 = 0; - if (!meridian && - omg12 < 0.75 * Math.PI && // Long difference too big - sbet2 - sbet1 < 1.75) { // Lat difference too big - // Use tan(Gamma/2) = tan(omg12/2) - // * (tan(bet1/2)+tan(bet2/2))/(1+tan(bet1/2)*tan(bet2/2)) - // with tan(x/2) = sin(x)/(1+cos(x)) - somg12 = Math.sin(omg12); domg12 = 1 + Math.cos(omg12); - dbet1 = 1 + cbet1; dbet2 = 1 + cbet2; - alp12 = 2 * Math.atan2( somg12 * (sbet1*dbet2 + sbet2*dbet1), - domg12 * (sbet1*sbet2 + dbet1*dbet2) ); - } else { - // alp12 = alp2 - alp1, used in atan2 so no need to normalize - salp12 = salp2 * calp1 - calp2 * salp1; - calp12 = calp2 * calp1 + salp2 * salp1; - // The right thing appears to happen if alp1 = +/-180 and alp2 = 0, viz - // salp12 = -0 and alp12 = -180. However this depends on the sign - // being attached to 0 correctly. The following ensures the correct - // behavior. - if (salp12 === 0 && calp12 < 0) { - salp12 = g.tiny_ * calp1; - calp12 = -1; - } - alp12 = Math.atan2(salp12, calp12); - } - vals.S12 += this._c2 * alp12; - vals.S12 *= swapp * lonsign * latsign; - // Convert -0 to 0 - vals.S12 += 0; - } - - // Convert calp, salp to azimuth accounting for lonsign, swapp, latsign. - if (swapp < 0) { - t = salp1; - salp1 = salp2; - salp2 = t; - // swap(salp1, salp2); - t = calp1; - calp1 = calp2; - calp2 = t; - // swap(calp1, calp2); - if (outmask & g.GEODESICSCALE) { - t = vals.M12; - vals.M12 = vals.M21; - vals.M21 = t; - // swap(vals.M12, vals.M21); - } - } - - salp1 *= swapp * lonsign; calp1 *= swapp * latsign; - salp2 *= swapp * lonsign; calp2 *= swapp * latsign; - - if (outmask & g.AZIMUTH) { - vals.azi1 = m.atan2d(salp1, calp1); - vals.azi2 = m.atan2d(salp2, calp2); - } - - // Returned value in [0, 180] - return vals; - }; - - /** - * @summary Solve the general direct geodesic problem. - * @param {number} lat1 the latitude of the first point in degrees. - * @param {number} lon1 the longitude of the first point in degrees. - * @param {number} azi1 the azimuth at the first point in degrees. - * @param {bool} arcmode is the next parameter an arc length? - * @param {number} s12_a12 the (arcmode ? arc length : distance) from the - * first point to the second in (arcmode ? degrees : meters). - * @param {bitmask} [outmask = STANDARD] which results to include. - * @returns {object} the requested results. - * @description The lat1, lon1, azi1, and a12 fields of the result are always - * set; s12 is included if arcmode is false. For details on the outmask - * parameter, see {@tutorial 2-interface}, "The outmask and caps - * parameters". - */ - g.Geodesic.prototype.GenDirect = function (lat1, lon1, azi1, - arcmode, s12_a12, outmask) { - var line; - if (!outmask) - outmask = g.STANDARD; - else if (outmask == g.LONG_UNROLL) - outmask |= g.STANDARD; - line = new l.GeodesicLine(this, lat1, lon1, azi1, - // Automatically supply DISTANCE_IN if necessary - outmask | (arcmode ? g.NONE : g.DISTANCE_IN)); - return line.GenPosition(arcmode, s12_a12, outmask); - }; - - /** - * @summary Solve the direct geodesic problem. - * @param {number} lat1 the latitude of the first point in degrees. - * @param {number} lon1 the longitude of the first point in degrees. - * @param {number} azi1 the azimuth at the first point in degrees. - * @param {number} s12 the distance from the first point to the second in - * meters. - * @param {bitmask} [outmask = STANDARD] which results to include. - * @returns {object} the requested results. - * @description The lat1, lon1, azi1, s12, and a12 fields of the result are - * always set. For details on the outmask parameter, see {@tutorial - * 2-interface}, "The outmask and caps parameters". - */ - g.Geodesic.prototype.Direct = function (lat1, lon1, azi1, s12, outmask) { - return this.GenDirect(lat1, lon1, azi1, false, s12, outmask); - }; - - /** - * @summary Solve the direct geodesic problem with arc length. - * @param {number} lat1 the latitude of the first point in degrees. - * @param {number} lon1 the longitude of the first point in degrees. - * @param {number} azi1 the azimuth at the first point in degrees. - * @param {number} a12 the arc length from the first point to the second in - * degrees. - * @param {bitmask} [outmask = STANDARD] which results to include. - * @returns {object} the requested results. - * @description The lat1, lon1, azi1, and a12 fields of the result are - * always set. For details on the outmask parameter, see {@tutorial - * 2-interface}, "The outmask and caps parameters". - */ - g.Geodesic.prototype.ArcDirect = function (lat1, lon1, azi1, a12, outmask) { - return this.GenDirect(lat1, lon1, azi1, true, a12, outmask); - }; - - /** - * @summary Create a {@link module:GeographicLib/GeodesicLine.GeodesicLine - * GeodesicLine} object. - * @param {number} lat1 the latitude of the first point in degrees. - * @param {number} lon1 the longitude of the first point in degrees. - * @param {number} azi1 the azimuth at the first point in degrees. - * degrees. - * @param {bitmask} [caps = STANDARD | DISTANCE_IN] which capabilities to - * include. - * @returns {object} the - * {@link module:GeographicLib/GeodesicLine.GeodesicLine - * GeodesicLine} object - * @description For details on the caps parameter, see {@tutorial - * 2-interface}, "The outmask and caps parameters". - */ - g.Geodesic.prototype.Line = function (lat1, lon1, azi1, caps) { - return new l.GeodesicLine(this, lat1, lon1, azi1, caps); - }; - - /** - * @summary Create a {@link module:GeographicLib/PolygonArea.PolygonArea - * PolygonArea} object. - * @param {bool} [polyline = false] if true the new PolygonArea object - * describes a polyline instead of a polygon. - * @returns {object} the - * {@link module:GeographicLib/PolygonArea.PolygonArea - * PolygonArea} object - */ - g.Geodesic.prototype.Polygon = function (polyline) { - return new p.PolygonArea(this, polyline); - }; - - /** - * @summary a {@link module:GeographicLib/Geodesic.Geodesic Geodesic} object - * initialized for the WGS84 ellipsoid. - * @constant {object} - */ - g.WGS84 = new g.Geodesic(c.WGS84.a, c.WGS84.f); -})(GeographicLib.Geodesic, GeographicLib.GeodesicLine, - GeographicLib.PolygonArea, GeographicLib.Math, GeographicLib.Constants); - -/* - * GeodesicLine.js - * Transcription of GeodesicLine.[ch]pp into JavaScript. - * - * See the documentation for the C++ class. The conversion is a literal - * conversion from C++. - * - * The algorithms are derived in - * - * Charles F. F. Karney, - * Algorithms for geodesics, J. Geodesy 87, 43-55 (2013); - * https://dx.doi.org/10.1007/s00190-012-0578-z - * Addenda: http://geographiclib.sf.net/geod-addenda.html - * - * Copyright (c) Charles Karney (2011-2015) and licensed - * under the MIT/X11 License. For more information, see - * http://geographiclib.sourceforge.net/ - */ - -// Load AFTER GeographicLib/Math.js, GeographicLib/Geodesic.js - -(function( - g, - /** - * @exports GeographicLib/GeodesicLine - * @description Solve geodesic problems on a single geodesic line via the - * {@link module:GeographicLib/GeodesicLine.GeodesicLine GeodesicLine} - * class. - */ - l, m) { - "use strict"; - - /** - * @class - * @property {number} a the equatorial radius (meters). - * @property {number} f the flattening. - * @property {number} lat1 the initial latitude (degrees). - * @property {number} lon1 the initial longitude (degrees). - * @property {number} azi1 the initial azimuth (degrees). - * @property {bitmask} caps the capabilities of the object. - * @summary Initialize a GeodesicLine object. For details on the caps - * parameter, see {@tutorial 2-interface}, "The outmask and caps - * parameters". - * @classdesc Performs geodesic calculations along a given geodesic line. - * This object is usually instantiated by - * {@link module:GeographicLib/Geodesic.Geodesic#Line Geodesic.Line}. - * @param {object} geod a {@link module:GeographicLib/Geodesic.Geodesic - * Geodesic} object. - * @param {number} lat1 the latitude of the first point in degrees. - * @param {number} lon1 the longitude of the first point in degrees. - * @param {number} azi1 the azimuth at the first point in degrees. - * @param {bitmask} [caps = STANDARD | DISTANCE_IN] which capabilities to - * include; LATITUDE | AZIMUTH are always included. - */ - l.GeodesicLine = function(geod, lat1, lon1, azi1, caps) { - var t, cbet1, sbet1, eps, s, c; - if (!caps) caps = g.STANDARD | g.DISTANCE_IN; - - this.a = geod.a; - this.f = geod.f; - this._b = geod._b; - this._c2 = geod._c2; - this._f1 = geod._f1; - this._caps = (!caps ? g.ALL : (caps | g.LATITUDE | g.AZIMUTH)) | - g.LONG_UNROLL; - - this.lat1 = m.LatFix(lat1); - this.lon1 = lon1; - this.azi1 = m.AngNormalize(azi1); - t = m.sincosd(m.AngRound(this.azi1)); this._salp1 = t.s; this._calp1 = t.c; - t = m.sincosd(m.AngRound(this.lat1)); sbet1 = this._f1 * t.s; cbet1 = t.c; - // norm(sbet1, cbet1); - t = m.hypot(sbet1, cbet1); sbet1 /= t; cbet1 /= t; - // Ensure cbet1 = +epsilon at poles - cbet1 = Math.max(g.tiny_, cbet1); - this._dn1 = Math.sqrt(1 + geod._ep2 * m.sq(sbet1)); - - // Evaluate alp0 from sin(alp1) * cos(bet1) = sin(alp0), - this._salp0 = this._salp1 * cbet1; // alp0 in [0, pi/2 - |bet1|] - // Alt: calp0 = hypot(sbet1, calp1 * cbet1). The following - // is slightly better (consider the case salp1 = 0). - this._calp0 = m.hypot(this._calp1, this._salp1 * sbet1); - // Evaluate sig with tan(bet1) = tan(sig1) * cos(alp1). - // sig = 0 is nearest northward crossing of equator. - // With bet1 = 0, alp1 = pi/2, we have sig1 = 0 (equatorial line). - // With bet1 = pi/2, alp1 = -pi, sig1 = pi/2 - // With bet1 = -pi/2, alp1 = 0 , sig1 = -pi/2 - // Evaluate omg1 with tan(omg1) = sin(alp0) * tan(sig1). - // With alp0 in (0, pi/2], quadrants for sig and omg coincide. - // No atan2(0,0) ambiguity at poles since cbet1 = +epsilon. - // With alp0 = 0, omg1 = 0 for alp1 = 0, omg1 = pi for alp1 = pi. - this._ssig1 = sbet1; this._somg1 = this._salp0 * sbet1; - this._csig1 = this._comg1 = - sbet1 !== 0 || this._calp1 !== 0 ? cbet1 * this._calp1 : 1; - // norm(this._ssig1, this._csig1); // sig1 in (-pi, pi] - t = m.hypot(this._ssig1, this._csig1); - this._ssig1 /= t; this._csig1 /= t; - // norm(this._somg1, this._comg1); -- don't need to normalize! - - this._k2 = m.sq(this._calp0) * geod._ep2; - eps = this._k2 / (2 * (1 + Math.sqrt(1 + this._k2)) + this._k2); - - if (this._caps & g.CAP_C1) { - this._A1m1 = g.A1m1f(eps); - this._C1a = new Array(g.nC1_ + 1); - g.C1f(eps, this._C1a); - this._B11 = g.SinCosSeries(true, this._ssig1, this._csig1, this._C1a); - s = Math.sin(this._B11); c = Math.cos(this._B11); - // tau1 = sig1 + B11 - this._stau1 = this._ssig1 * c + this._csig1 * s; - this._ctau1 = this._csig1 * c - this._ssig1 * s; - // Not necessary because C1pa reverts C1a - // _B11 = -SinCosSeries(true, _stau1, _ctau1, _C1pa); - } - - if (this._caps & g.CAP_C1p) { - this._C1pa = new Array(g.nC1p_ + 1); - g.C1pf(eps, this._C1pa); - } - - if (this._caps & g.CAP_C2) { - this._A2m1 = g.A2m1f(eps); - this._C2a = new Array(g.nC2_ + 1); - g.C2f(eps, this._C2a); - this._B21 = g.SinCosSeries(true, this._ssig1, this._csig1, this._C2a); - } - - if (this._caps & g.CAP_C3) { - this._C3a = new Array(g.nC3_); - geod.C3f(eps, this._C3a); - this._A3c = -this.f * this._salp0 * geod.A3f(eps); - this._B31 = g.SinCosSeries(true, this._ssig1, this._csig1, this._C3a); - } - - if (this._caps & g.CAP_C4) { - this._C4a = new Array(g.nC4_); // all the elements of _C4a are used - geod.C4f(eps, this._C4a); - // Multiplier = a^2 * e^2 * cos(alpha0) * sin(alpha0) - this._A4 = m.sq(this.a) * this._calp0 * this._salp0 * geod._e2; - this._B41 = g.SinCosSeries(false, this._ssig1, this._csig1, this._C4a); - } - }; - - /** - * @summary Find the position on the line (general case). - * @param {bool} arcmode is the next parameter an arc length? - * @param {number} s12_a12 the (arcmode ? arc length : distance) from the - * first point to the second in (arcmode ? degrees : meters). - * @param {bitmask} [outmask = STANDARD] which results to include; this is - * subject to the capabilities of the object. - * @returns {object} the requested results. - * @description The lat1, lon1, azi1, and a12 fields of the result are - * always set; s12 is included if arcmode is false. For details on the - * outmask parameter, see {@tutorial 2-interface}, "The outmask and caps - * parameters". - */ - l.GeodesicLine.prototype.GenPosition = function(arcmode, s12_a12, - outmask) { - var vals = {}, - sig12, ssig12, csig12, B12, AB1, ssig2, csig2, tau12, s, c, serr, - omg12, lam12, lon12, E, sbet2, cbet2, somg2, comg2, salp2, calp2, dn2, - B22, AB2, J12, t, B42, salp12, calp12; - if (!outmask) - outmask = g.STANDARD; - else if (outmask == g.LONG_UNROLL) - outmask |= g.STANDARD; - outmask &= this._caps & g.OUT_MASK; - vals.lat1 = this.lat1; vals.azi1 = this.azi1; - vals.lon1 = outmask & g.LONG_UNROLL ? - this.lon1 : m.AngNormalize(this.lon1); - if (arcmode) - vals.a12 = s12_a12; - else - vals.s12 = s12_a12; - if (!( arcmode || (this._caps & g.DISTANCE_IN & g.OUT_MASK) )) { - // Uninitialized or impossible distance calculation requested - vals.a12 = Number.NaN; - return vals; - } - - // Avoid warning about uninitialized B12. - B12 = 0; AB1 = 0; - if (arcmode) { - // Interpret s12_a12 as spherical arc length - sig12 = s12_a12 * m.degree; - t = m.sincosd(s12_a12); ssig12 = t.s; csig12 = t.c; - } else { - // Interpret s12_a12 as distance - tau12 = s12_a12 / (this._b * (1 + this._A1m1)); - s = Math.sin(tau12); - c = Math.cos(tau12); - // tau2 = tau1 + tau12 - B12 = - g.SinCosSeries(true, - this._stau1 * c + this._ctau1 * s, - this._ctau1 * c - this._stau1 * s, - this._C1pa); - sig12 = tau12 - (B12 - this._B11); - ssig12 = Math.sin(sig12); csig12 = Math.cos(sig12); - if (Math.abs(this.f) > 0.01) { - // Reverted distance series is inaccurate for |f| > 1/100, so correct - // sig12 with 1 Newton iteration. The following table shows the - // approximate maximum error for a = WGS_a() and various f relative to - // GeodesicExact. - // erri = the error in the inverse solution (nm) - // errd = the error in the direct solution (series only) (nm) - // errda = the error in the direct solution (series + 1 Newton) (nm) - // - // f erri errd errda - // -1/5 12e6 1.2e9 69e6 - // -1/10 123e3 12e6 765e3 - // -1/20 1110 108e3 7155 - // -1/50 18.63 200.9 27.12 - // -1/100 18.63 23.78 23.37 - // -1/150 18.63 21.05 20.26 - // 1/150 22.35 24.73 25.83 - // 1/100 22.35 25.03 25.31 - // 1/50 29.80 231.9 30.44 - // 1/20 5376 146e3 10e3 - // 1/10 829e3 22e6 1.5e6 - // 1/5 157e6 3.8e9 280e6 - ssig2 = this._ssig1 * csig12 + this._csig1 * ssig12; - csig2 = this._csig1 * csig12 - this._ssig1 * ssig12; - B12 = g.SinCosSeries(true, ssig2, csig2, this._C1a); - serr = (1 + this._A1m1) * (sig12 + (B12 - this._B11)) - - s12_a12 / this._b; - sig12 = sig12 - serr / Math.sqrt(1 + this._k2 * m.sq(ssig2)); - ssig12 = Math.sin(sig12); csig12 = Math.cos(sig12); - // Update B12 below - } - } - - // sig2 = sig1 + sig12 - ssig2 = this._ssig1 * csig12 + this._csig1 * ssig12; - csig2 = this._csig1 * csig12 - this._ssig1 * ssig12; - dn2 = Math.sqrt(1 + this._k2 * m.sq(ssig2)); - if (outmask & (g.DISTANCE | g.REDUCEDLENGTH | g.GEODESICSCALE)) { - if (arcmode || Math.abs(this.f) > 0.01) - B12 = g.SinCosSeries(true, ssig2, csig2, this._C1a); - AB1 = (1 + this._A1m1) * (B12 - this._B11); - } - // sin(bet2) = cos(alp0) * sin(sig2) - sbet2 = this._calp0 * ssig2; - // Alt: cbet2 = hypot(csig2, salp0 * ssig2); - cbet2 = m.hypot(this._salp0, this._calp0 * csig2); - if (cbet2 === 0) - // I.e., salp0 = 0, csig2 = 0. Break the degeneracy in this case - cbet2 = csig2 = g.tiny_; - // tan(alp0) = cos(sig2)*tan(alp2) - salp2 = this._salp0; calp2 = this._calp0 * csig2; // No need to normalize - - if (arcmode && (outmask & g.DISTANCE)) - vals.s12 = this._b * ((1 + this._A1m1) * sig12 + AB1); - - if (outmask & g.LONGITUDE) { - // tan(omg2) = sin(alp0) * tan(sig2) - somg2 = this._salp0 * ssig2; comg2 = csig2; // No need to normalize - E = this._salp0 < 0 ? -1 : 1; - // omg12 = omg2 - omg1 - omg12 = outmask & g.LONG_UNROLL ? - E * (sig12 - - (Math.atan2(ssig2, csig2) - - Math.atan2(this._ssig1, this._csig1)) + - (Math.atan2(E * somg2, comg2) - - Math.atan2(E * this._somg1, this._comg1))) : - Math.atan2(somg2 * this._comg1 - comg2 * this._somg1, - comg2 * this._comg1 + somg2 * this._somg1); - lam12 = omg12 + this._A3c * - ( sig12 + (g.SinCosSeries(true, ssig2, csig2, this._C3a) - - this._B31)); - lon12 = lam12 / m.degree; - vals.lon2 = outmask & g.LONG_UNROLL ? this.lon1 + lon12 : - m.AngNormalize(m.AngNormalize(this.lon1) + m.AngNormalize(lon12)); - } - - if (outmask & g.LATITUDE) - vals.lat2 = m.atan2d(sbet2, this._f1 * cbet2); - - if (outmask & g.AZIMUTH) - vals.azi2 = m.atan2d(salp2, calp2); - - if (outmask & (g.REDUCEDLENGTH | g.GEODESICSCALE)) { - B22 = g.SinCosSeries(true, ssig2, csig2, this._C2a); - AB2 = (1 + this._A2m1) * (B22 - this._B21); - J12 = (this._A1m1 - this._A2m1) * sig12 + (AB1 - AB2); - if (outmask & g.REDUCEDLENGTH) - // Add parens around (_csig1 * ssig2) and (_ssig1 * csig2) to ensure - // accurate cancellation in the case of coincident points. - vals.m12 = this._b * (( dn2 * (this._csig1 * ssig2) - - this._dn1 * (this._ssig1 * csig2)) - - this._csig1 * csig2 * J12); - if (outmask & g.GEODESICSCALE) { - t = this._k2 * (ssig2 - this._ssig1) * (ssig2 + this._ssig1) / - (this._dn1 + dn2); - vals.M12 = csig12 + (t * ssig2 - csig2 * J12) * this._ssig1 / this._dn1; - vals.M21 = csig12 - (t * this._ssig1 - this._csig1 * J12) * ssig2 / dn2; - } - } - - if (outmask & g.AREA) { - B42 = g.SinCosSeries(false, ssig2, csig2, this._C4a); - if (this._calp0 === 0 || this._salp0 === 0) { - // alp12 = alp2 - alp1, used in atan2 so no need to normalize - salp12 = salp2 * this._calp1 - calp2 * this._salp1; - calp12 = calp2 * this._calp1 + salp2 * this._salp1; - // The right thing appears to happen if alp1 = +/-180 and alp2 = 0, viz - // salp12 = -0 and alp12 = -180. However this depends on the sign being - // attached to 0 correctly. The following ensures the correct behavior. - if (salp12 === 0 && calp12 < 0) { - salp12 = g.tiny_ * this._calp1; - calp12 = -1; - } - } else { - // tan(alp) = tan(alp0) * sec(sig) - // tan(alp2-alp1) = (tan(alp2) -tan(alp1)) / (tan(alp2)*tan(alp1)+1) - // = calp0 * salp0 * (csig1-csig2) / (salp0^2 + calp0^2 * csig1*csig2) - // If csig12 > 0, write - // csig1 - csig2 = ssig12 * (csig1 * ssig12 / (1 + csig12) + ssig1) - // else - // csig1 - csig2 = csig1 * (1 - csig12) + ssig12 * ssig1 - // No need to normalize - salp12 = this._calp0 * this._salp0 * - (csig12 <= 0 ? this._csig1 * (1 - csig12) + ssig12 * this._ssig1 : - ssig12 * (this._csig1 * ssig12 / (1 + csig12) + this._ssig1)); - calp12 = m.sq(this._salp0) + m.sq(this._calp0) * this._csig1 * csig2; - } - vals.S12 = this._c2 * Math.atan2(salp12, calp12) + - this._A4 * (B42 - this._B41); - } - - if (!arcmode) - vals.a12 = sig12 / m.degree; - return vals; - }; - - /** - * @summary Find the position on the line given s12. - * @param {number} s12 the distance from the first point to the second in - * meters. - * @param {bitmask} [outmask = STANDARD] which results to include; this is - * subject to the capabilities of the object. - * @returns {object} the requested results. - * @description The lat1, lon1, azi1, s12, and a12 fields of the result are - * always set; s12 is included if arcmode is false. For details on the - * outmask parameter, see {@tutorial 2-interface}, "The outmask and caps - * parameters". - */ - l.GeodesicLine.prototype.Position = function(s12, outmask) { - return this.GenPosition(false, s12, outmask); - }; - - /** - * @summary Find the position on the line given a12. - * @param {number} a12 the arc length from the first point to the second in - * degrees. - * @param {bitmask} [outmask = STANDARD] which results to include; this is - * subject to the capabilities of the object. - * @returns {object} the requested results. - * @description The lat1, lon1, azi1, and a12 fields of the result are - * always set. For details on the outmask parameter, see {@tutorial - * 2-interface}, "The outmask and caps parameters". - */ - l.GeodesicLine.prototype.ArcPosition = function(a12, outmask) { - return this.GenPosition(true, a12, outmask); - }; - -})(GeographicLib.Geodesic, GeographicLib.GeodesicLine, GeographicLib.Math); - - -/* - * PolygonArea.js - * Transcription of PolygonArea.[ch]pp into JavaScript. - * - * See the documentation for the C++ class. The conversion is a literal - * conversion from C++. - * - * The algorithms are derived in - * - * Charles F. F. Karney, - * Algorithms for geodesics, J. Geodesy 87, 43-55 (2013); - * https://dx.doi.org/10.1007/s00190-012-0578-z - * Addenda: http://geographiclib.sf.net/geod-addenda.html - * - * Copyright (c) Charles Karney (2011-2014) and licensed - * under the MIT/X11 License. For more information, see - * http://geographiclib.sourceforge.net/ - */ - -// Load AFTER GeographicLib/Math.js and GeographicLib/Geodesic.js - -(function( - /** - * @exports GeographicLib/PolygonArea - * @description Compute the area of geodesic polygons via the - * {@link module:GeographicLib/PolygonArea.PolygonArea PolygonArea} - * class. - */ - p, g, m, a) { - "use strict"; - - var transit, transitdirect; - transit = function(lon1, lon2) { - // Return 1 or -1 if crossing prime meridian in east or west direction. - // Otherwise return zero. - var lon12, cross; - // Compute lon12 the same way as Geodesic::Inverse. - lon1 = m.AngNormalize(lon1); - lon2 = m.AngNormalize(lon2); - lon12 = m.AngDiff(lon1, lon2); - cross = lon1 < 0 && lon2 >= 0 && lon12 > 0 ? 1 : - (lon2 < 0 && lon1 >= 0 && lon12 < 0 ? -1 : 0); - return cross; - }; - - // an alternate version of transit to deal with longitudes in the direct - // problem. - transitdirect = function(lon1, lon2) { - // We want to compute exactly - // int(floor(lon2 / 360)) - int(floor(lon1 / 360)) - // Since we only need the parity of the result we can use std::remquo but - // this is buggy with g++ 4.8.3 and requires C++11. So instead we do - lon1 = lon1 % 720.0; lon2 = lon2 % 720.0; - return ( ((lon2 >= 0 && lon2 < 360) || lon2 < -360 ? 0 : 1) - - ((lon1 >= 0 && lon1 < 360) || lon1 < -360 ? 0 : 1) ); - }; - - /** - * @class - * @property {number} a the equatorial radius (meters). - * @property {number} f the flattening. - * @property {bool} polyline whether the PolygonArea object describes a - * polyline or a polygon. - * @property {number} num the number of vertices so far. - * @property {number} lat the current latitude (degrees). - * @property {number} lon the current longitude (degrees). - * @summary Initialize a PolygonArea object. - * @classdesc Computes the area and perimeter of a geodesic polygon. - * This object is usually instantiated by - * {@link module:GeographicLib/Geodesic.Geodesic#Polygon Geodesic.Polygon}. - * @param {object} geod a {@link module:GeographicLib/Geodesic.Geodesic - * Geodesic} object. - * @param {bool} [polyline = false] if true the new PolygonArea object - * describes a polyline instead of a polygon. - */ - p.PolygonArea = function(geod, polyline) { - this._geod = geod; - this.a = this._geod.a; - this.f = this._geod.f; - this._area0 = 4 * Math.PI * geod._c2; - this.polyline = !polyline ? false : polyline; - this._mask = g.LATITUDE | g.LONGITUDE | g.DISTANCE | - (this.polyline ? g.NONE : g.AREA | g.LONG_UNROLL); - if (!this.polyline) - this._areasum = new a.Accumulator(0); - this._perimetersum = new a.Accumulator(0); - this.Clear(); - }; - - /** - * @summary Clear the PolygonArea object, setting the number of vertices to - * 0. - */ - p.PolygonArea.prototype.Clear = function() { - this.num = 0; - this._crossings = 0; - if (!this.polyline) - this._areasum.Set(0); - this._perimetersum.Set(0); - this._lat0 = this._lon0 = this.lat = this.lon = Number.NaN; - }; - - /** - * @summary Add the next vertex to the polygon. - * @param {number} lat the latitude of the point (degrees). - * @param {number} lon the longitude of the point (degrees). - * @description This adds an edge from the current vertex to the new vertex. - */ - p.PolygonArea.prototype.AddPoint = function(lat, lon) { - var t; - if (this.num === 0) { - this._lat0 = this.lat = lat; - this._lon0 = this.lon = lon; - } else { - t = this._geod.Inverse(this.lat, this.lon, lat, lon, this._mask); - this._perimetersum.Add(t.s12); - if (!this.polyline) { - this._areasum.Add(t.S12); - this._crossings += transit(this.lon, lon); - } - this.lat = lat; - this.lon = lon; - } - ++this.num; - }; - - /** - * @summary Add the next edge to the polygon. - * @param {number} azi the azimuth at the current the point (degrees). - * @param {number} s the length of the edge (meters). - * @description This specifies the new vertex in terms of the edge from the - * current vertex. - */ - p.PolygonArea.prototype.AddEdge = function(azi, s) { - var t; - if (this.num) { - t = this._geod.Direct(this.lat, this.lon, azi, s, this._mask); - this._perimetersum.Add(s); - if (!this.polyline) { - this._areasum.Add(t.S12); - this._crossings += transitdirect(this.lon, t.lon2); - } - this.lat = t.lat2; - this.lon = t.lon2; - } - ++this.num; - }; - - /** - * @summary Compute the perimeter and area of the polygon. - * @param {bool} reverse if true then clockwise (instead of - * counter-clockwise) traversal counts as a positive area. - * @param {bool} sign if true then return a signed result for the area if the - * polygon is traversed in the "wrong" direction instead of returning the - * @returns {object} r where r.number is the number of vertices, r.perimeter - * is the perimeter (meters), and r.area (only returned if polyline is - * false) is the area (meters2). - * @description More points can be added to the polygon after this call. - */ - p.PolygonArea.prototype.Compute = function(reverse, sign) { - var vals = {number: this.num}, t, tempsum, crossings; - if (this.num < 2) { - vals.perimeter = 0; - if (!this.polyline) - vals.area = 0; - return vals; - } - if (this.polyline) { - vals.perimeter = this._perimetersum.Sum(); - return vals; - } - t = this._geod.Inverse(this.lat, this.lon, this._lat0, this._lon0, - this._mask); - vals.perimeter = this._perimetersum.Sum(t.s12); - tempsum = new a.Accumulator(this._areasum); - tempsum.Add(t.S12); - crossings = this._crossings + transit(this.lon, this._lon0); - if (crossings & 1) - tempsum.Add( (tempsum.Sum() < 0 ? 1 : -1) * this._area0/2 ); - // area is with the clockwise sense. If !reverse convert to - // counter-clockwise convention. - if (!reverse) - tempsum.Negate(); - // If sign put area in (-area0/2, area0/2], else put area in [0, area0) - if (sign) { - if (tempsum.Sum() > this._area0/2) - tempsum.Add( -this._area0 ); - else if (tempsum.Sum() <= -this._area0/2) - tempsum.Add( +this._area0 ); - } else { - if (tempsum.Sum() >= this._area0) - tempsum.Add( -this._area0 ); - else if (tempsum < 0) - tempsum.Add( -this._area0 ); - } - vals.area = tempsum.Sum(); - return vals; - }; - - /** - * @summary Compute the perimeter and area of the polygon with a tentative - * new vertex. - * @param {number} lat the latitude of the point (degrees). - * @param {number} lon the longitude of the point (degrees). - * @param {bool} reverse if true then clockwise (instead of - * counter-clockwise) traversal counts as a positive area. - * @param {bool} sign if true then return a signed result for the area if the - * polygon is traversed in the "wrong" direction instead of returning the - * @returns {object} r where r.number is the number of vertices, r.perimeter - * is the perimeter (meters), and r.area (only returned if polyline is - * false) is the area (meters2). - * @description A new vertex is *not* added to the polygon. - */ - p.PolygonArea.prototype.TestPoint = function(lat, lon, reverse, sign) { - var vals = {number: this.num + 1}, t, tempsum, crossings, i; - if (this.num === 0) { - vals.perimeter = 0; - if (!this.polyline) - vals.area = 0; - return vals; - } - vals.perimeter = this._perimetersum.Sum(); - tempsum = this.polyline ? 0 : this._areasum.Sum(); - crossings = this._crossings; - for (i = 0; i < (this.polyline ? 1 : 2); ++i) { - t = this._geod.Inverse( - i === 0 ? this.lat : lat, i === 0 ? this.lon : lon, - i !== 0 ? this._lat0 : lat, i !== 0 ? this._lon0 : lon, - this._mask); - vals.perimeter += t.s12; - if (!this.polyline) { - tempsum += t.S12; - crossings += transit(i === 0 ? this.lon : lon, - i !== 0 ? this._lon0 : lon); - } - } - - if (this.polyline) - return vals; - - if (crossings & 1) - tempsum += (tempsum < 0 ? 1 : -1) * this._area0/2; - // area is with the clockwise sense. If !reverse convert to - // counter-clockwise convention. - if (!reverse) - tempsum *= -1; - // If sign put area in (-area0/2, area0/2], else put area in [0, area0) - if (sign) { - if (tempsum > this._area0/2) - tempsum -= this._area0; - else if (tempsum <= -this._area0/2) - tempsum += this._area0; - } else { - if (tempsum >= this._area0) - tempsum -= this._area0; - else if (tempsum < 0) - tempsum += this._area0; - } - vals.area = tempsum; - return vals; - }; - - /** - * @summary Compute the perimeter and area of the polygon with a tentative - * new edge. - * @param {number} azi the azimuth of the edge (degrees). - * @param {number} s the length of the edge (meters). - * @param {bool} reverse if true then clockwise (instead of - * counter-clockwise) traversal counts as a positive area. - * @param {bool} sign if true then return a signed result for the area if the - * polygon is traversed in the "wrong" direction instead of returning the - * @returns {object} r where r.number is the number of vertices, r.perimeter - * is the perimeter (meters), and r.area (only returned if polyline is - * false) is the area (meters2). - * @description A new vertex is *not* added to the polygon. - */ - p.PolygonArea.prototype.TestEdge = function(azi, s, reverse, sign) { - var vals = {number: this.num ? this.num + 1 : 0}, t, tempsump, crossings; - if (this.num === 0) - return vals; - vals.perimeter = this._perimetersum.Sum() + s; - if (this.polyline) - return vals; - - tempsum = this._areasum.Sum(); - crossings = this._crossings; - t = this._geod.Direct(this.lat, this.lon, azi, s, this._mask); - tempsum += t.S12; - crossings += transitdirect(this.lon, t.lon2); - t = this._geod(t.lat2, t.lon2, this._lat0, this._lon0, this._mask); - perimeter += t.s12; - tempsum += t.S12; - crossings += transit(t.lon2, this._lon0); - - if (crossings & 1) - tempsum += (tempsum < 0 ? 1 : -1) * this._area0/2; - // area is with the clockwise sense. If !reverse convert to - // counter-clockwise convention. - if (!reverse) - tempsum *= -1; - // If sign put area in (-area0/2, area0/2], else put area in [0, area0) - if (sign) { - if (tempsum > this._area0/2) - tempsum -= this._area0; - else if (tempsum <= -this._area0/2) - tempsum += this._area0; - } else { - if (tempsum >= this._area0) - tempsum -= this._area0; - else if (tempsum < 0) - tempsum += this._area0; - } - vals.area = tempsum; - return vals; - }; - -})(GeographicLib.PolygonArea, GeographicLib.Geodesic, - GeographicLib.Math, GeographicLib.Accumulator); - - -window["GeographicLib"] = GeographicLib; -window["GeographicLib"]["Geodesic"] = GeographicLib.Geodesic; -window["GeographicLib"]["Geodesic"]["Geodesic"] = GeographicLib.Geodesic.Geodesic; -//window["GeographicLib"]["Geodesic"]["Direct"] = GeographicLib.Geodesic.prototype.Direct; - - - - - - - - - - - - - diff --git a/src/core/utils/libs/geographics-nomini.js b/src/core/utils/libs/geographics-nomini.js deleted file mode 100755 index de12b872..00000000 --- a/src/core/utils/libs/geographics-nomini.js +++ /dev/null @@ -1,75 +0,0 @@ -var GeographicLib={};GeographicLib.Constants={};GeographicLib.Math={};GeographicLib.Accumulator={};(function(c){c.WGS84={a:6378137,f:1/298.257223563};c.version={major:1,minor:45,patch:0};c.version_string="1.45"})(GeographicLib.Constants); -(function(m){m.digits=53;m.epsilon=Math.pow(.5,m.digits-1);m.degree=Math.PI/180;m.sq=function(x){return x*x};m.hypot=function(x,y){var a,b;x=Math.abs(x);y=Math.abs(y);a=Math.max(x,y);b=Math.min(x,y)/(a?a:1);return a*Math.sqrt(1+b*b)};m.cbrt=function(x){var y=Math.pow(Math.abs(x),1/3);return x<0?-y:y};m.log1p=function(x){var y=1+x,z=y-1;return z===0?x:x*Math.log(y)/z};m.atanh=function(x){var y=Math.abs(x);y=m.log1p(2*y/(1-y))/2;return x<0?-y:y};m.sum=function(u,v){var s=u+v,up=s-v,vpp=s-up,t;up-=u; -vpp-=v;t=-(up+vpp);return{s:s,t:t}};m.polyval=function(N,p,s,x){var y=N<0?0:p[s++];while(--N>=0)y=y*x+p[s++];return y};m.AngRound=function(x){var z=1/16,y=Math.abs(x);y=y90?Number.NaN:x};m.AngDiff=function(x,y){var r=m.sum(m.AngNormalize(x),m.AngNormalize(-y)),d=-m.AngNormalize(r.s),t=r.t;return(d==180&&t<0?-180:d)-t};m.sincosd=function(x){var r,q,s,c,sinx,cosx; -r=x%360;q=Math.floor(r/90+.5);r-=90*q;r*=this.degree;s=Math.sin(r);c=Math.cos(r);switch(q&3){case 0:sinx=s;cosx=c;break;case 1:sinx=c;cosx=0-s;break;case 2:sinx=0-s;cosx=0-c;break;default:sinx=0-c;cosx=s;break}return{s:sinx,c:cosx}};m.atan2d=function(y,x){var q=0,t,ang;if(Math.abs(y)>Math.abs(x)){t=x;x=y;y=t;q=2}if(x<0){x=-x;++q}ang=Math.atan2(y,x)/this.degree;switch(q){case 1:ang=(y>0?180:-180)-ang;break;case 2:ang=90-ang;break;case 3:ang=-90+ang;break}return ang}})(GeographicLib.Math); -(function(a,m){a.Accumulator=function(y){this.Set(y)};a.Accumulator.prototype.Set=function(y){if(!y)y=0;if(y.constructor===a.Accumulator){this._s=y._s;this._t=y._t}else{this._s=y;this._t=0}};a.Accumulator.prototype.Add=function(y){var u=m.sum(y,this._t),v=m.sum(u.s,this._s);u=u.t;this._s=v.s;this._t=v.t;if(this._s===0)this._s=u;else this._t+=u};a.Accumulator.prototype.Sum=function(y){var b;if(!y)return this._s;else{b=new a.Accumulator(this);b.Add(y);return b._s}};a.Accumulator.prototype.Negate=function(){this._s*= --1;this._t*=-1}})(GeographicLib.Accumulator,GeographicLib.Math);GeographicLib.DMS={}; -(function(d){var lookup,zerofill,InternalDecode,NumMatch,hemispheres_="SNWE",signs_="-+",digits_="0123456789",dmsindicators_="D'\":",dmsindicatorsu_="\u00b0'\"",components_=["degrees","minutes","seconds"];lookup=function(s,c){return s.indexOf(c.toUpperCase())};zerofill=function(s,n){return String("0000").substr(0,Math.max(0,Math.min(4,n-s.length)))+s};d.NONE=0;d.LATITUDE=1;d.LONGITUDE=2;d.AZIMUTH=3;d.DEGREE=0;d.MINUTE=1;d.SECOND=2;d.Decode=function(dms){var dmsa=dms,end,v=0,i=0,mi,pi,vals,ind1=d.NONE, -ind2,p,pa,pb;dmsa=dmsa.replace(/\u00b0/g,"d").replace(/\u00ba/g,"d").replace(/\u2070/g,"d").replace(/\u02da/g,"d").replace(/\u2032/g,"'").replace(/\u00b4/g,"'").replace(/\u2019/g,"'").replace(/\u2033/g,'"').replace(/\u201d/g,'"').replace(/\u2212/g,"-").replace(/''/g,'"').trim();end=dmsa.length;for(p=0;p=0)++pa;if(i>0||pa=0)++pa;mi=dmsa.substr(pa,end-pa).indexOf("-");pi=dmsa.substr(pa,end-pa).indexOf("+"); -if(mi<0)mi=end;else mi+=pa;if(pi<0)pi=end;else pi+=pa;pb=Math.min(mi,pi);vals=InternalDecode(dmsa.substr(p,pb-p));v+=vals.val;ind2=vals.ind;if(ind1==d.NONE)ind1=ind2;else if(!(ind2==d.NONE||ind1==ind2))throw new Error("Incompatible hemisphere specifies in "+dmsa.substr(0,pb));}if(i===0)throw new Error("Empty or incomplete DMS string "+dmsa);return{val:v,ind:ind1}};InternalDecode=function(dmsa){var vals={},errormsg="",sign,beg,end,ind1,k,ipieces,fpieces,npiece,icurrent,fcurrent,ncurrent,p,pointseen, -digcount,intcount,x;do{sign=1;beg=0;end=dmsa.length;ind1=d.NONE;k=-1;if(end>beg&&(k=lookup(hemispheres_,dmsa.charAt(beg)))>=0){ind1=k&2?d.LONGITUDE:d.LATITUDE;sign=k&1?1:-1;++beg}if(end>beg&&(k=lookup(hemispheres_,dmsa.charAt(end-1)))>=0)if(k>=0){if(ind1!==d.NONE){if(dmsa.charAt(beg-1).toUpperCase()===dmsa.charAt(end-1).toUpperCase())errormsg="Repeated hemisphere indicators "+dmsa.charAt(beg-1)+" in "+dmsa.substr(beg-1,end-beg+1);else errormsg="Contradictory hemisphere indicators "+dmsa.charAt(beg- -1)+" and "+dmsa.charAt(end-1)+" in "+dmsa.substr(beg-1,end-beg+1);break}ind1=k&2?d.LONGITUDE:d.LATITUDE;sign=k&1?1:-1;--end}if(end>beg&&(k=lookup(signs_,dmsa.charAt(beg)))>=0)if(k>=0){sign*=k?1:-1;++beg}if(end===beg){errormsg="Empty or incomplete DMS string "+dmsa;break}ipieces=[0,0,0];fpieces=[0,0,0];npiece=0;icurrent=0;fcurrent=0;ncurrent=0;p=beg;pointseen=false;digcount=0;intcount=0;while(p=0){++ncurrent;if(digcount>0)++digcount;else{icurrent=10* -icurrent+k;++intcount}}else if(x==="."){if(pointseen){errormsg="Multiple decimal points in "+dmsa.substr(beg,end-beg);break}pointseen=true;digcount=1}else if((k=lookup(dmsindicators_,x))>=0){if(k>=3){if(p===end){errormsg="Illegal for colon to appear at the end of "+dmsa.substr(beg,end-beg);break}k=npiece}if(k===npiece-1){errormsg="Repeated "+components_[k]+" component in "+dmsa.substr(beg,end-beg);break}else if(k0){fcurrent=parseFloat(dmsa.substr(p-intcount-digcount-1,intcount+digcount));icurrent=0}ipieces[k]=icurrent;fpieces[k]=icurrent+fcurrent;if(p=0){errormsg="Internal sign in DMS string "+dmsa.substr(beg,end-beg);break}else{errormsg="Illegal character "+x+" in DMS string "+ -dmsa.substr(beg,end-beg);break}}if(errormsg.length)break;if(lookup(dmsindicators_,dmsa.charAt(p-1))<0){if(npiece>=3){errormsg="Extra text following seconds in DMS string "+dmsa.substr(beg,end-beg);break}if(ncurrent===0){errormsg="Missing numbers in trailing component of "+dmsa.substr(beg,end-beg);break}if(digcount>0){fcurrent=parseFloat(dmsa.substr(p-intcount-digcount,intcount+digcount));icurrent=0}ipieces[npiece]=icurrent;fpieces[npiece]=icurrent+fcurrent}if(pointseen&&digcount===0){errormsg="Decimal point in non-terminal component of "+ -dmsa.substr(beg,end-beg);break}if(ipieces[1]>=60||fpieces[1]>60){errormsg="Minutes "+fpieces[1]+" not in range [0,60)";break}if(ipieces[2]>=60||fpieces[2]>60){errormsg="Seconds "+fpieces[2]+" not in range [0,60)";break}vals.ind=ind1;vals.val=sign*(fpieces[2]?(60*(60*fpieces[0]+fpieces[1])+fpieces[2])/3600:fpieces[1]?(60*fpieces[0]+fpieces[1])/60:fpieces[0]);return vals}while(false);vals.val=NumMatch(dmsa);if(vals.val===0)throw new Error(errormsg);else vals.ind=d.NONE;return vals};NumMatch=function(s){var t, -sign,p0,p1;if(s.length<3)return 0;t=s.toUpperCase().replace(/0+$/,"");sign=t.charAt(0)==="-"?-1:1;p0=t.charAt(0)==="-"||t.charAt(0)==="+"?1:0;p1=t.length-1;if(p1+190)throw new Error("Latitude "+lat+" not in [-90,90]");vals.lat=lat;vals.lon= -lon;return vals};d.DecodeAngle=function(angstr){var vals=d.Decode(angstr),ang=vals.val,ind=vals.ind;if(ind!==d.NONE)throw new Error("Arc angle "+angstr+" includes a hemisphere N/E/W/S");return ang};d.DecodeAzimuth=function(azistr){var vals=d.Decode(azistr),azi=vals.val,ind=vals.ind;if(ind===d.LATITUDE)throw new Error("Azimuth "+azistr+" has a latitude hemisphere N/S");return azi};d.Encode=function(angle,trailing,prec,ind){var scale=1,i,sign,idegree,fdegree,f,pieces,ip,fp,s;if(!ind)ind=d.NONE;if(!isFinite(angle))return angle< -0?String("-inf"):angle>0?String("inf"):String("nan");prec=Math.min(15-2*trailing,prec);for(i=0;i=1){idegree+=1;fdegree-=1}pieces=[fdegree,0,0];for(i=1;i<=trailing;++i){ip=Math.floor(pieces[i- -1]);fp=pieces[i-1]-ip;pieces[i]=fp*60;pieces[i-1]=ip}pieces[0]+=idegree;s="";if(ind===d.NONE&&sign<0)s+="-";switch(trailing){case d.DEGREE:s+=zerofill(pieces[0].toFixed(prec),ind===d.NONE?0:1+Math.min(ind,2)+prec+(prec?1:0))+dmsindicatorsu_.charAt(0);break;default:s+=zerofill(pieces[0].toFixed(0),ind===d.NONE?0:1+Math.min(ind,2))+dmsindicatorsu_.charAt(0);switch(trailing){case d.MINUTE:s+=zerofill(pieces[1].toFixed(prec),2+prec+(prec?1:0))+dmsindicatorsu_.charAt(1);break;case d.SECOND:s+=zerofill(pieces[1].toFixed(0), -2)+dmsindicatorsu_.charAt(1);s+=zerofill(pieces[2].toFixed(prec),2+prec+(prec?1:0))+dmsindicatorsu_.charAt(2);break;default:break}}if(ind!==d.NONE&&ind!==d.AZIMUTH)s+=hemispheres_.charAt((ind===d.LATITUDE?0:2)+(sign<0?0:1));return s}})(GeographicLib.DMS);GeographicLib.Geodesic={};GeographicLib.GeodesicLine={};GeographicLib.PolygonArea={}; -(function(g,l,p,m,c){var GEOGRAPHICLIB_GEODESIC_ORDER=6,nA1_=GEOGRAPHICLIB_GEODESIC_ORDER,nA2_=GEOGRAPHICLIB_GEODESIC_ORDER,nA3_=GEOGRAPHICLIB_GEODESIC_ORDER,nA3x_=nA3_,nC3x_,nC4x_,maxit1_=20,maxit2_=maxit1_+m.digits+10,tol0_=m.epsilon,tol1_=200*tol0_,tol2_=Math.sqrt(tol0_),tolb_=tol0_*tol1_,xthresh_=1E3*tol2_,CAP_NONE=0,CAP_ALL=31,CAP_MASK=CAP_ALL,OUT_ALL=32640,Astroid,A1m1f_coeff,C1f_coeff,C1pf_coeff,A2m1f_coeff,C2f_coeff,A3_coeff,C3_coeff,C4_coeff;g.tiny_=Math.sqrt(Number.MIN_VALUE);g.nC1_=GEOGRAPHICLIB_GEODESIC_ORDER; -g.nC1p_=GEOGRAPHICLIB_GEODESIC_ORDER;g.nC2_=GEOGRAPHICLIB_GEODESIC_ORDER;g.nC3_=GEOGRAPHICLIB_GEODESIC_ORDER;g.nC4_=GEOGRAPHICLIB_GEODESIC_ORDER;nC3x_=g.nC3_*(g.nC3_-1)/2;nC4x_=g.nC4_*(g.nC4_+1)/2,g.CAP_C1=1<<0;g.CAP_C1p=1<<1;g.CAP_C2=1<<2;g.CAP_C3=1<<3;g.CAP_C4=1<<4;g.NONE=0;g.LATITUDE=1<<7|CAP_NONE;g.LONGITUDE=1<<8|g.CAP_C3;g.AZIMUTH=1<<9|CAP_NONE;g.DISTANCE=1<<10|g.CAP_C1;g.STANDARD=g.LATITUDE|g.LONGITUDE|g.AZIMUTH|g.DISTANCE;g.DISTANCE_IN=1<<11|g.CAP_C1|g.CAP_C1p;g.REDUCEDLENGTH=1<<12|g.CAP_C1| -g.CAP_C2;g.GEODESICSCALE=1<<13|g.CAP_C1|g.CAP_C2;g.AREA=1<<14|g.CAP_C4;g.ALL=OUT_ALL|CAP_ALL;g.LONG_UNROLL=1<<15;g.OUT_MASK=OUT_ALL|g.LONG_UNROLL;g.SinCosSeries=function(sinp,sinx,cosx,c){var k=c.length,n=k-(sinp?1:0),ar=2*(cosx-sinx)*(cosx+sinx),y0=n&1?c[--k]:0,y1=0;n=Math.floor(n/2);while(n--){y1=ar*y0-y1+c[--k];y0=ar*y1-y0+c[--k]}return sinp?2*sinx*cosx*y0:cosx*(y0-y1)};Astroid=function(x,y){var k,p=m.sq(x),q=m.sq(y),r=(p+q-1)/6,S,r2,r3,disc,u,T3,T,ang,v,uv,w;if(!(q===0&&r<=0)){S=p*q/4;r2=m.sq(r); -r3=r*r2;disc=S*(S+2*r3);u=r;if(disc>=0){T3=S+r3;T3+=T3<0?-Math.sqrt(disc):Math.sqrt(disc);T=m.cbrt(T3);u+=T+(T!==0?r2/T:0)}else{ang=Math.atan2(Math.sqrt(-disc),-(S+r3));u+=2*r*Math.cos(ang/3)}v=Math.sqrt(m.sq(u)+q);uv=u<0?q/(v-u):u+v;w=(uv-q)/(2*v);k=uv/(Math.sqrt(uv+m.sq(w))+w)}else k=0;return k};A1m1f_coeff=[+1,4,64,0,256];g.A1m1f=function(eps){var p=Math.floor(nA1_/2),t=m.polyval(p,A1m1f_coeff,0,m.sq(eps))/A1m1f_coeff[p+1];return(t+eps)/(1-eps)};C1f_coeff=[-1,6,-16,32,-9,64,-128,2048,+9,-16,768, -+3,-5,512,-7,1280,-7,2048];g.C1f=function(eps,c){var eps2=m.sq(eps),d=eps,o=0,l,p;for(l=1;l<=g.nC1_;++l){p=Math.floor((g.nC1_-l)/2);c[l]=d*m.polyval(p,C1f_coeff,o,eps2)/C1f_coeff[o+p+1];o+=p+2;d*=eps}};C1pf_coeff=[+205,-432,768,1536,+4005,-4736,3840,12288,-225,116,384,-7173,2695,7680,+3467,7680,+38081,61440];g.C1pf=function(eps,c){var eps2=m.sq(eps),d=eps,o=0,l,p;for(l=1;l<=g.nC1p_;++l){p=Math.floor((g.nC1p_-l)/2);c[l]=d*m.polyval(p,C1pf_coeff,o,eps2)/C1pf_coeff[o+p+1];o+=p+2;d*=eps}};A2m1f_coeff= -[-11,-28,-192,0,256];g.A2m1f=function(eps){var p=Math.floor(nA2_/2),t=m.polyval(p,A2m1f_coeff,0,m.sq(eps))/A2m1f_coeff[p+1];return(t-eps)/(1+eps)};C2f_coeff=[+1,2,16,32,+35,64,384,2048,+15,80,768,+7,35,512,+63,1280,+77,2048];g.C2f=function(eps,c){var eps2=m.sq(eps),d=eps,o=0,l,p;for(l=1;l<=g.nC2_;++l){p=Math.floor((g.nC2_-l)/2);c[l]=d*m.polyval(p,C2f_coeff,o,eps2)/C2f_coeff[o+p+1];o+=p+2;d*=eps}};g.Geodesic=function(a,f){this.a=a;this.f=f;this._f1=1-this.f;this._e2=this.f*(2-this.f);this._ep2=this._e2/ -m.sq(this._f1);this._n=this.f/(2-this.f);this._b=this.a*this._f1;this._c2=(m.sq(this.a)+m.sq(this._b)*(this._e2===0?1:(this._e2>0?m.atanh(Math.sqrt(this._e2)):Math.atan(Math.sqrt(-this._e2)))/Math.sqrt(Math.abs(this._e2))))/2;this._etol2=.1*tol2_/Math.sqrt(Math.max(.001,Math.abs(this.f))*Math.min(1,1-this.f/2)/2);if(!(isFinite(this.a)&&this.a>0))throw new Error("Major radius is not positive");if(!(isFinite(this._b)&&this._b>0))throw new Error("Minor radius is not positive");this._A3x=new Array(nA3x_); -this._C3x=new Array(nC3x_);this._C4x=new Array(nC4x_);this.A3coeff();this.C3coeff();this.C4coeff()};A3_coeff=[-3,128,-2,-3,64,-1,-3,-1,16,+3,-1,-2,8,+1,-1,2,+1,1];g.Geodesic.prototype.A3coeff=function(){var o=0,k=0,j,p;for(j=nA3_-1;j>=0;--j){p=Math.min(nA3_-j-1,j);this._A3x[k++]=m.polyval(p,A3_coeff,o,this._n)/A3_coeff[o+p+1];o+=p+2}};C3_coeff=[+3,128,+2,5,128,-1,3,3,64,-1,0,1,8,-1,1,4,+5,256,+1,3,128,-3,-2,3,64,+1,-3,2,32,+7,512,-10,9,384,+5,-9,5,192,+7,512,-14,7,512,+21,2560];g.Geodesic.prototype.C3coeff= -function(){var o=0,k=0,l,j,p;for(l=1;l=l;--j){p=Math.min(g.nC3_-j-1,j);this._C3x[k++]=m.polyval(p,C3_coeff,o,this._n)/C3_coeff[o+p+1];o+=p+2}};C4_coeff=[+97,15015,+1088,156,45045,-224,-4784,1573,45045,-10656,14144,-4576,-858,45045,+64,624,-4576,6864,-3003,15015,+100,208,572,3432,-12012,30030,45045,+1,9009,-2944,468,135135,+5792,1040,-1287,135135,+5952,-11648,9152,-2574,135135,-64,-624,4576,-6864,3003,135135,+8,10725,+1856,-936,225225,-8448,4992,-1144,225225,-1440,4160, --4576,1716,225225,-136,63063,+1024,-208,105105,+3584,-3328,1144,315315,-128,135135,-2560,832,405405,+128,99099];g.Geodesic.prototype.C4coeff=function(){var o=0,k=0,l,j,p;for(l=0;l=l;--j){p=g.nC4_-j-1;this._C4x[k++]=m.polyval(p,C4_coeff,o,this._n)/C4_coeff[o+p+1];o+=p+2}};g.Geodesic.prototype.A3f=function(eps){return m.polyval(nA3x_-1,this._A3x,0,eps)};g.Geodesic.prototype.C3f=function(eps,c){var mult=1,o=0,l,p;for(l=1;l=0&&sbet12<.5&&cbet2*lam12<.5;omg12=lam12;if(shortline){sbetm2=m.sq(sbet1+sbet2);sbetm2/=sbetm2+m.sq(cbet1+cbet2);vals.dnm=Math.sqrt(1+this._ep2*sbetm2);omg12/=this._f1*vals.dnm}somg12=Math.sin(omg12);comg12=Math.cos(omg12);vals.salp1=cbet2*somg12;vals.calp1=comg12>=0?sbet12+cbet2*sbet1*m.sq(somg12)/(1+comg12):sbet12a- -cbet2*sbet1*m.sq(somg12)/(1-comg12);ssig12=m.hypot(vals.salp1,vals.calp1);csig12=sbet1*sbet2+cbet1*cbet2*comg12;if(shortline&&ssig12=0?m.sq(somg12)/(1+comg12):1-comg12);t=m.hypot(vals.salp2,vals.calp2);vals.salp2/=t;vals.calp2/=t;vals.sig12=Math.atan2(ssig12,csig12)}else if(Math.abs(this._n)>.1||csig12>=0||ssig12>=6*Math.abs(this._n)*Math.PI*m.sq(cbet1));else{if(this.f>=0){k2=m.sq(sbet1)*this._ep2;eps=k2/(2*(1+Math.sqrt(1+ -k2))+k2);lamscale=this.f*cbet1*this.A3f(eps)*Math.PI;betscale=lamscale*cbet1;x=(lam12-Math.PI)/lamscale;y=sbet12a/betscale}else{cbet12a=cbet2*cbet1-sbet2*sbet1;bet12a=Math.atan2(sbet12a,cbet12a);nvals=this.Lengths(this._n,Math.PI+bet12a,sbet1,-cbet1,dn1,sbet2,cbet2,dn2,cbet1,cbet2,g.REDUCEDLENGTH,C1a,C2a);m12b=nvals.m12b;m0=nvals.m0;x=-1+m12b/(cbet1*cbet2*m0*Math.PI);betscale=x<-.01?sbet12a/x:-this.f*m.sq(cbet1)*Math.PI;lamscale=betscale/cbet1;y=(lam12-Math.PI)/lamscale}if(y>-tol1_&&x>-1-xthresh_)if(this.f>= -0){vals.salp1=Math.min(1,-x);vals.calp1=-Math.sqrt(1-m.sq(vals.salp1))}else{vals.calp1=Math.max(x>-tol1_?0:-1,x);vals.salp1=Math.sqrt(1-m.sq(vals.calp1))}else{k=Astroid(x,y);omg12a=lamscale*(this.f>=0?-x*k/(1+k):-y*(1+k)/k);somg12=Math.sin(omg12a);comg12=-Math.cos(omg12a);vals.salp1=cbet2*somg12;vals.calp1=sbet12a-cbet2*sbet1*m.sq(somg12)/(1-comg12)}}if(!(vals.salp1<=0)){t=m.hypot(vals.salp1,vals.calp1);vals.salp1/=t;vals.calp1/=t}else{vals.salp1=1;vals.calp1=0}return vals};g.Geodesic.prototype.Lambda12= -function(sbet1,cbet1,dn1,sbet2,cbet2,dn2,salp1,calp1,diffp,C1a,C2a,C3a){var vals={},t,salp0,calp0,somg1,comg1,somg2,comg2,omg12,B312,h0,k2,nvals;if(sbet1===0&&calp1===0)calp1=-g.tiny_;salp0=salp1*cbet1;calp0=m.hypot(calp1,salp1*sbet1);vals.ssig1=sbet1;somg1=salp0*sbet1;vals.csig1=comg1=calp1*cbet1;t=m.hypot(vals.ssig1,vals.csig1);vals.ssig1/=t;vals.csig1/=t;vals.salp2=cbet2!==cbet1?salp0/cbet2:salp1;vals.calp2=cbet2!==cbet1||Math.abs(sbet2)!==-sbet1?Math.sqrt(m.sq(calp1*cbet1)+(cbet1<-sbet1?(cbet2- -cbet1)*(cbet1+cbet2):(sbet1-sbet2)*(sbet1+sbet2)))/cbet2:Math.abs(calp1);vals.ssig2=sbet2;somg2=salp0*sbet2;vals.csig2=comg2=vals.calp2*cbet2;t=m.hypot(vals.ssig2,vals.csig2);vals.ssig2/=t;vals.csig2/=t;vals.sig12=Math.atan2(Math.max(0,vals.csig1*vals.ssig2-vals.ssig1*vals.csig2),vals.csig1*vals.csig2+vals.ssig1*vals.ssig2);omg12=Math.atan2(Math.max(0,comg1*somg2-somg1*comg2),comg1*comg2+somg1*somg2);k2=m.sq(calp0)*this._ep2;vals.eps=k2/(2*(1+Math.sqrt(1+k2))+k2);this.C3f(vals.eps,C3a);B312=g.SinCosSeries(true, -vals.ssig2,vals.csig2,C3a)-g.SinCosSeries(true,vals.ssig1,vals.csig1,C3a);h0=-this.f*this.A3f(vals.eps);vals.domg12=salp0*h0*(vals.sig12+B312);vals.lam12=omg12+vals.domg12;if(diffp)if(vals.calp2===0)vals.dlam12=-2*this._f1*dn1/sbet1;else{nvals=this.Lengths(vals.eps,vals.sig12,vals.ssig1,vals.csig1,dn1,vals.ssig2,vals.csig2,dn2,cbet1,cbet2,g.REDUCEDLENGTH,C1a,C2a);vals.dlam12=nvals.m12b;vals.dlam12*=this._f1/(vals.calp2*cbet2)}return vals};g.Geodesic.prototype.Inverse=function(lat1,lon1,lat2,lon2, -outmask){var vals={},lon12,lonsign,t,swapp,latsign,sbet1,cbet1,sbet2,cbet2,s12x,m12x,dn1,dn2,lam12,slam12,clam12,sig12,calp1,salp1,calp2,salp2,C1a,C2a,C3a,meridian,nvals,ssig1,csig1,ssig2,csig2,eps,omg12,dnm,numit,salp1a,calp1a,salp1b,calp1b,tripn,tripb,v,dv,dalp1,sdalp1,cdalp1,nsalp1,lengthmask,salp0,calp0,alp12,k2,A4,C4a,B41,B42,somg12,domg12,dbet1,dbet2,salp12,calp12;if(!outmask)outmask=g.STANDARD;if(outmask==g.LONG_UNROLL)outmask|=g.STANDARD;outmask&=g.OUT_MASK;vals.lat1=lat1=m.LatFix(lat1);vals.lat2= -lat2=m.LatFix(lat2);lon12=m.AngDiff(lon1,lon2);if(outmask&g.LONG_UNROLL){vals.lon1=lon1;vals.lon2=lon1+lon12}else{vals.lon1=m.AngNormalize(lon1);vals.lon2=m.AngNormalize(lon2)}lon12=m.AngRound(lon12);lonsign=lon12>=0?1:-1;lon12*=lonsign;lat1=m.AngRound(lat1);lat2=m.AngRound(lat2);swapp=Math.abs(lat1)=0){if(sig12<3*g.tiny_)sig12=m12x=s12x=0;m12x*=this._b;s12x*=this._b;vals.a12=sig12/m.degree}else meridian= -false}if(!meridian&&sbet1===0&&(this.f<=0||lam12<=Math.PI-this.f*Math.PI)){calp1=calp2=0;salp1=salp2=1;s12x=this.a*lam12;sig12=omg12=lam12/this._f1;m12x=this._b*Math.sin(sig12);if(outmask&g.GEODESICSCALE)vals.M12=vals.M21=Math.cos(sig12);vals.a12=lon12/this._f1}else if(!meridian){nvals=this.InverseStart(sbet1,cbet1,dn1,sbet2,cbet2,dn2,lam12,C1a,C2a);sig12=nvals.sig12;salp1=nvals.salp1;calp1=nvals.calp1;if(sig12>=0){salp2=nvals.salp2;calp2=nvals.calp2;dnm=nvals.dnm;s12x=sig12*this._b*dnm;m12x=m.sq(dnm)* -this._b*Math.sin(sig12/dnm);if(outmask&g.GEODESICSCALE)vals.M12=vals.M21=Math.cos(sig12/dnm);vals.a12=sig12/m.degree;omg12=lam12/(this._f1*dnm)}else{numit=0;salp1a=g.tiny_;calp1a=1;salp1b=g.tiny_;calp1b=-1;for(tripn=false,tripb=false;numit=(tripn?8:2)*tol0_))break;if(v>0&&(numitcalp1b/salp1b)){salp1b=salp1;calp1b=calp1}else if(v<0&&(numit0){dalp1=-v/dv;sdalp1=Math.sin(dalp1);cdalp1=Math.cos(dalp1);nsalp1=salp1*cdalp1+calp1*sdalp1;if(nsalp1>0&&Math.abs(dalp1).01){ssig2=this._ssig1*csig12+this._csig1*ssig12;csig2=this._csig1*csig12-this._ssig1*ssig12;B12=g.SinCosSeries(true,ssig2,csig2,this._C1a);serr=(1+this._A1m1)*(sig12+(B12-this._B11))-s12_a12/this._b;sig12=sig12-serr/Math.sqrt(1+ -this._k2*m.sq(ssig2));ssig12=Math.sin(sig12);csig12=Math.cos(sig12)}}ssig2=this._ssig1*csig12+this._csig1*ssig12;csig2=this._csig1*csig12-this._ssig1*ssig12;dn2=Math.sqrt(1+this._k2*m.sq(ssig2));if(outmask&(g.DISTANCE|g.REDUCEDLENGTH|g.GEODESICSCALE)){if(arcmode||Math.abs(this.f)>.01)B12=g.SinCosSeries(true,ssig2,csig2,this._C1a);AB1=(1+this._A1m1)*(B12-this._B11)}sbet2=this._calp0*ssig2;cbet2=m.hypot(this._salp0,this._calp0*csig2);if(cbet2===0)cbet2=csig2=g.tiny_;salp2=this._salp0;calp2=this._calp0* -csig2;if(arcmode&&outmask&g.DISTANCE)vals.s12=this._b*((1+this._A1m1)*sig12+AB1);if(outmask&g.LONGITUDE){somg2=this._salp0*ssig2;comg2=csig2;E=this._salp0<0?-1:1;omg12=outmask&g.LONG_UNROLL?E*(sig12-(Math.atan2(ssig2,csig2)-Math.atan2(this._ssig1,this._csig1))+(Math.atan2(E*somg2,comg2)-Math.atan2(E*this._somg1,this._comg1))):Math.atan2(somg2*this._comg1-comg2*this._somg1,comg2*this._comg1+somg2*this._somg1);lam12=omg12+this._A3c*(sig12+(g.SinCosSeries(true,ssig2,csig2,this._C3a)-this._B31));lon12= -lam12/m.degree;vals.lon2=outmask&g.LONG_UNROLL?this.lon1+lon12:m.AngNormalize(m.AngNormalize(this.lon1)+m.AngNormalize(lon12))}if(outmask&g.LATITUDE)vals.lat2=m.atan2d(sbet2,this._f1*cbet2);if(outmask&g.AZIMUTH)vals.azi2=m.atan2d(salp2,calp2);if(outmask&(g.REDUCEDLENGTH|g.GEODESICSCALE)){B22=g.SinCosSeries(true,ssig2,csig2,this._C2a);AB2=(1+this._A2m1)*(B22-this._B21);J12=(this._A1m1-this._A2m1)*sig12+(AB1-AB2);if(outmask&g.REDUCEDLENGTH)vals.m12=this._b*(dn2*(this._csig1*ssig2)-this._dn1*(this._ssig1* -csig2)-this._csig1*csig2*J12);if(outmask&g.GEODESICSCALE){t=this._k2*(ssig2-this._ssig1)*(ssig2+this._ssig1)/(this._dn1+dn2);vals.M12=csig12+(t*ssig2-csig2*J12)*this._ssig1/this._dn1;vals.M21=csig12-(t*this._ssig1-this._csig1*J12)*ssig2/dn2}}if(outmask&g.AREA){B42=g.SinCosSeries(false,ssig2,csig2,this._C4a);if(this._calp0===0||this._salp0===0){salp12=salp2*this._calp1-calp2*this._salp1;calp12=calp2*this._calp1+salp2*this._salp1;if(salp12===0&&calp12<0){salp12=g.tiny_*this._calp1;calp12=-1}}else{salp12= -this._calp0*this._salp0*(csig12<=0?this._csig1*(1-csig12)+ssig12*this._ssig1:ssig12*(this._csig1*ssig12/(1+csig12)+this._ssig1));calp12=m.sq(this._salp0)+m.sq(this._calp0)*this._csig1*csig2}vals.S12=this._c2*Math.atan2(salp12,calp12)+this._A4*(B42-this._B41)}if(!arcmode)vals.a12=sig12/m.degree;return vals};l.GeodesicLine.prototype.Position=function(s12,outmask){return this.GenPosition(false,s12,outmask)};l.GeodesicLine.prototype.ArcPosition=function(a12,outmask){return this.GenPosition(true,a12,outmask)}})(GeographicLib.Geodesic, -GeographicLib.GeodesicLine,GeographicLib.Math); -(function(p,g,m,a){var transit,transitdirect;transit=function(lon1,lon2){var lon12,cross;lon1=m.AngNormalize(lon1);lon2=m.AngNormalize(lon2);lon12=m.AngDiff(lon1,lon2);cross=lon1<0&&lon2>=0&&lon12>0?1:lon2<0&&lon1>=0&&lon12<0?-1:0;return cross};transitdirect=function(lon1,lon2){lon1=lon1%720;lon2=lon2%720;return(lon2>=0&&lon2<360||lon2<-360?0:1)-(lon1>=0&&lon1<360||lon1<-360?0:1)};p.PolygonArea=function(geod,polyline){this._geod=geod;this.a=this._geod.a;this.f=this._geod.f;this._area0=4*Math.PI*geod._c2; -this.polyline=!polyline?false:polyline;this._mask=g.LATITUDE|g.LONGITUDE|g.DISTANCE|(this.polyline?g.NONE:g.AREA|g.LONG_UNROLL);if(!this.polyline)this._areasum=new a.Accumulator(0);this._perimetersum=new a.Accumulator(0);this.Clear()};p.PolygonArea.prototype.Clear=function(){this.num=0;this._crossings=0;if(!this.polyline)this._areasum.Set(0);this._perimetersum.Set(0);this._lat0=this._lon0=this.lat=this.lon=Number.NaN};p.PolygonArea.prototype.AddPoint=function(lat,lon){var t;if(this.num===0){this._lat0= -this.lat=lat;this._lon0=this.lon=lon}else{t=this._geod.Inverse(this.lat,this.lon,lat,lon,this._mask);this._perimetersum.Add(t.s12);if(!this.polyline){this._areasum.Add(t.S12);this._crossings+=transit(this.lon,lon)}this.lat=lat;this.lon=lon}++this.num};p.PolygonArea.prototype.AddEdge=function(azi,s){var t;if(this.num){t=this._geod.Direct(this.lat,this.lon,azi,s,this._mask);this._perimetersum.Add(s);if(!this.polyline){this._areasum.Add(t.S12);this._crossings+=transitdirect(this.lon,t.lon2)}this.lat= -t.lat2;this.lon=t.lon2}++this.num};p.PolygonArea.prototype.Compute=function(reverse,sign){var vals={number:this.num},t,tempsum,crossings;if(this.num<2){vals.perimeter=0;if(!this.polyline)vals.area=0;return vals}if(this.polyline){vals.perimeter=this._perimetersum.Sum();return vals}t=this._geod.Inverse(this.lat,this.lon,this._lat0,this._lon0,this._mask);vals.perimeter=this._perimetersum.Sum(t.s12);tempsum=new a.Accumulator(this._areasum);tempsum.Add(t.S12);crossings=this._crossings+transit(this.lon, -this._lon0);if(crossings&1)tempsum.Add((tempsum.Sum()<0?1:-1)*this._area0/2);if(!reverse)tempsum.Negate();if(sign)if(tempsum.Sum()>this._area0/2)tempsum.Add(-this._area0);else{if(tempsum.Sum()<=-this._area0/2)tempsum.Add(+this._area0)}else if(tempsum.Sum()>=this._area0)tempsum.Add(-this._area0);else if(tempsum<0)tempsum.Add(-this._area0);vals.area=tempsum.Sum();return vals};p.PolygonArea.prototype.TestPoint=function(lat,lon,reverse,sign){var vals={number:this.num+1},t,tempsum,crossings,i;if(this.num=== -0){vals.perimeter=0;if(!this.polyline)vals.area=0;return vals}vals.perimeter=this._perimetersum.Sum();tempsum=this.polyline?0:this._areasum.Sum();crossings=this._crossings;for(i=0;i<(this.polyline?1:2);++i){t=this._geod.Inverse(i===0?this.lat:lat,i===0?this.lon:lon,i!==0?this._lat0:lat,i!==0?this._lon0:lon,this._mask);vals.perimeter+=t.s12;if(!this.polyline){tempsum+=t.S12;crossings+=transit(i===0?this.lon:lon,i!==0?this._lon0:lon)}}if(this.polyline)return vals;if(crossings&1)tempsum+=(tempsum<0? -1:-1)*this._area0/2;if(!reverse)tempsum*=-1;if(sign)if(tempsum>this._area0/2)tempsum-=this._area0;else{if(tempsum<=-this._area0/2)tempsum+=this._area0}else if(tempsum>=this._area0)tempsum-=this._area0;else if(tempsum<0)tempsum+=this._area0;vals.area=tempsum;return vals};p.PolygonArea.prototype.TestEdge=function(azi,s,reverse,sign){var vals={number:this.num?this.num+1:0},t,tempsump,crossings;if(this.num===0)return vals;vals.perimeter=this._perimetersum.Sum()+s;if(this.polyline)return vals;tempsum= -this._areasum.Sum();crossings=this._crossings;t=this._geod.Direct(this.lat,this.lon,azi,s,this._mask);tempsum+=t.S12;crossings+=transitdirect(this.lon,t.lon2);t=this._geod(t.lat2,t.lon2,this._lat0,this._lon0,this._mask);perimeter+=t.s12;tempsum+=t.S12;crossings+=transit(t.lon2,this._lon0);if(crossings&1)tempsum+=(tempsum<0?1:-1)*this._area0/2;if(!reverse)tempsum*=-1;if(sign)if(tempsum>this._area0/2)tempsum-=this._area0;else{if(tempsum<=-this._area0/2)tempsum+=this._area0}else if(tempsum>=this._area0)tempsum-= -this._area0;else if(tempsum<0)tempsum+=this._area0;vals.area=tempsum;return vals}})(GeographicLib.PolygonArea,GeographicLib.Geodesic,GeographicLib.Math,GeographicLib.Accumulator);window["GeographicLib"]=GeographicLib;window["GeographicLib"]["Geodesic"]=GeographicLib.Geodesic;window["GeographicLib"]["Geodesic"]["Geodesic"]=GeographicLib.Geodesic.Geodesic; \ No newline at end of file diff --git a/src/core/utils/libs/proj4-src.js b/src/core/utils/libs/proj4-src.js deleted file mode 100755 index f95b62d4..00000000 --- a/src/core/utils/libs/proj4-src.js +++ /dev/null @@ -1,6321 +0,0 @@ -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global._mproj4_ = factory()); -}(this, (function () { 'use strict'; - - var globals = function(defs) { - defs('EPSG:4326', "+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"); - defs('EPSG:4269', "+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"); - defs('EPSG:3857', "+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"); - - defs.WGS84 = defs['EPSG:4326']; - defs['EPSG:3785'] = defs['EPSG:3857']; // maintain backward compat, official code is 3857 - defs.GOOGLE = defs['EPSG:3857']; - defs['EPSG:900913'] = defs['EPSG:3857']; - defs['EPSG:102113'] = defs['EPSG:3857']; - }; - - var PJD_3PARAM = 1; - var PJD_7PARAM = 2; - var PJD_WGS84 = 4; // WGS84 or equivalent - var PJD_NODATUM = 5; // WGS84 or equivalent - var SEC_TO_RAD = 4.84813681109535993589914102357e-6; - var HALF_PI = Math.PI/2; - // ellipoid pj_set_ell.c - var SIXTH = 0.1666666666666666667; - /* 1/6 */ - var RA4 = 0.04722222222222222222; - /* 17/360 */ - var RA6 = 0.02215608465608465608; - var EPSLN = (typeof Number.EPSILON === 'undefined') ? 1.0e-10 : Number.EPSILON; - var D2R = 0.01745329251994329577; - var R2D = 57.29577951308232088; - var FORTPI = Math.PI/4; - var TWO_PI = Math.PI * 2; - // SPI is slightly greater than Math.PI, so values that exceed the -180..180 - // degree range by a tiny amount don't get wrapped. This prevents points that - // have drifted from their original location along the 180th meridian (due to - // floating point error) from changing their sign. - var SPI = 3.14159265359; - - var exports$1 = {}; - exports$1.greenwich = 0.0; //"0dE", - exports$1.lisbon = -9.131906111111; //"9d07'54.862\"W", - exports$1.paris = 2.337229166667; //"2d20'14.025\"E", - exports$1.bogota = -74.080916666667; //"74d04'51.3\"W", - exports$1.madrid = -3.687938888889; //"3d41'16.58\"W", - exports$1.rome = 12.452333333333; //"12d27'8.4\"E", - exports$1.bern = 7.439583333333; //"7d26'22.5\"E", - exports$1.jakarta = 106.807719444444; //"106d48'27.79\"E", - exports$1.ferro = -17.666666666667; //"17d40'W", - exports$1.brussels = 4.367975; //"4d22'4.71\"E", - exports$1.stockholm = 18.058277777778; //"18d3'29.8\"E", - exports$1.athens = 23.7163375; //"23d42'58.815\"E", - exports$1.oslo = 10.722916666667; //"10d43'22.5\"E" - - var units = { - ft: {to_meter: 0.3048}, - 'us-ft': {to_meter: 1200 / 3937} - }; - - var ignoredChar = /[\s_\-\/\(\)]/g; - function match(obj, key) { - if (obj[key]) { - return obj[key]; - } - var keys = Object.keys(obj); - var lkey = key.toLowerCase().replace(ignoredChar, ''); - var i = -1; - var testkey, processedKey; - while (++i < keys.length) { - testkey = keys[i]; - processedKey = testkey.toLowerCase().replace(ignoredChar, ''); - if (processedKey === lkey) { - return obj[testkey]; - } - } - } - - var parseProj = function(defData) { - var self = {}; - var paramObj = defData.split('+').map(function(v) { - return v.trim(); - }).filter(function(a) { - return a; - }).reduce(function(p, a) { - var split = a.split('='); - split.push(true); - p[split[0].toLowerCase()] = split[1]; - return p; - }, {}); - var paramName, paramVal, paramOutname; - var params = { - proj: 'projName', - datum: 'datumCode', - rf: function(v) { - self.rf = parseFloat(v); - }, - lat_0: function(v) { - self.lat0 = v * D2R; - }, - lat_1: function(v) { - self.lat1 = v * D2R; - }, - lat_2: function(v) { - self.lat2 = v * D2R; - }, - lat_ts: function(v) { - self.lat_ts = v * D2R; - }, - lon_0: function(v) { - self.long0 = v * D2R; - }, - lon_1: function(v) { - self.long1 = v * D2R; - }, - lon_2: function(v) { - self.long2 = v * D2R; - }, - alpha: function(v) { - self.alpha = parseFloat(v) * D2R; - }, - lonc: function(v) { - self.longc = v * D2R; - }, - x_0: function(v) { - self.x0 = parseFloat(v); - }, - y_0: function(v) { - self.y0 = parseFloat(v); - }, - k_0: function(v) { - self.k0 = parseFloat(v); - }, - k: function(v) { - self.k0 = parseFloat(v); - }, - a: function(v) { - self.a = parseFloat(v); - }, - b: function(v) { - self.b = parseFloat(v); - }, - r_a: function() { - self.R_A = true; - }, - zone: function(v) { - self.zone = parseInt(v, 10); - }, - south: function() { - self.utmSouth = true; - }, - towgs84: function(v) { - self.datum_params = v.split(",").map(function(a) { - return parseFloat(a); - }); - }, - to_meter: function(v) { - self.to_meter = parseFloat(v); - }, - units: function(v) { - self.units = v; - var unit = match(units, v); - if (unit) { - self.to_meter = unit.to_meter; - } - }, - from_greenwich: function(v) { - self.from_greenwich = v * D2R; - }, - pm: function(v) { - var pm = match(exports$1, v); - self.from_greenwich = (pm ? pm : parseFloat(v)) * D2R; - }, - nadgrids: function(v) { - if (v === '@null') { - self.datumCode = 'none'; - } - else { - self.nadgrids = v; - } - }, - axis: function(v) { - var legalAxis = "ewnsud"; - if (v.length === 3 && legalAxis.indexOf(v.substr(0, 1)) !== -1 && legalAxis.indexOf(v.substr(1, 1)) !== -1 && legalAxis.indexOf(v.substr(2, 1)) !== -1) { - self.axis = v; - } - } - }; - for (paramName in paramObj) { - paramVal = paramObj[paramName]; - if (paramName in params) { - paramOutname = params[paramName]; - if (typeof paramOutname === 'function') { - paramOutname(paramVal); - } - else { - self[paramOutname] = paramVal; - } - } - else { - self[paramName] = paramVal; - } - } - if(typeof self.datumCode === 'string' && self.datumCode !== "WGS84"){ - self.datumCode = self.datumCode.toLowerCase(); - } - return self; - }; - - var NEUTRAL = 1; - var KEYWORD = 2; - var NUMBER = 3; - var QUOTED = 4; - var AFTERQUOTE = 5; - var ENDED = -1; - var whitespace = /\s/; - var latin = /[A-Za-z]/; - var keyword = /[A-Za-z84]/; - var endThings = /[,\]]/; - var digets = /[\d\.E\-\+]/; - // const ignoredChar = /[\s_\-\/\(\)]/g; - function Parser(text) { - if (typeof text !== 'string') { - throw new Error('not a string'); - } - this.text = text.trim(); - this.level = 0; - this.place = 0; - this.root = null; - this.stack = []; - this.currentObject = null; - this.state = NEUTRAL; - } - Parser.prototype.readCharicter = function() { - var char = this.text[this.place++]; - if (this.state !== QUOTED) { - while (whitespace.test(char)) { - if (this.place >= this.text.length) { - return; - } - char = this.text[this.place++]; - } - } - switch (this.state) { - case NEUTRAL: - return this.neutral(char); - case KEYWORD: - return this.keyword(char) - case QUOTED: - return this.quoted(char); - case AFTERQUOTE: - return this.afterquote(char); - case NUMBER: - return this.number(char); - case ENDED: - return; - } - }; - Parser.prototype.afterquote = function(char) { - if (char === '"') { - this.word += '"'; - this.state = QUOTED; - return; - } - if (endThings.test(char)) { - this.word = this.word.trim(); - this.afterItem(char); - return; - } - throw new Error('havn\'t handled "' +char + '" in afterquote yet, index ' + this.place); - }; - Parser.prototype.afterItem = function(char) { - if (char === ',') { - if (this.word !== null) { - this.currentObject.push(this.word); - } - this.word = null; - this.state = NEUTRAL; - return; - } - if (char === ']') { - this.level--; - if (this.word !== null) { - this.currentObject.push(this.word); - this.word = null; - } - this.state = NEUTRAL; - this.currentObject = this.stack.pop(); - if (!this.currentObject) { - this.state = ENDED; - } - - return; - } - }; - Parser.prototype.number = function(char) { - if (digets.test(char)) { - this.word += char; - return; - } - if (endThings.test(char)) { - this.word = parseFloat(this.word); - this.afterItem(char); - return; - } - throw new Error('havn\'t handled "' +char + '" in number yet, index ' + this.place); - }; - Parser.prototype.quoted = function(char) { - if (char === '"') { - this.state = AFTERQUOTE; - return; - } - this.word += char; - return; - }; - Parser.prototype.keyword = function(char) { - if (keyword.test(char)) { - this.word += char; - return; - } - if (char === '[') { - var newObjects = []; - newObjects.push(this.word); - this.level++; - if (this.root === null) { - this.root = newObjects; - } else { - this.currentObject.push(newObjects); - } - this.stack.push(this.currentObject); - this.currentObject = newObjects; - this.state = NEUTRAL; - return; - } - if (endThings.test(char)) { - this.afterItem(char); - return; - } - throw new Error('havn\'t handled "' +char + '" in keyword yet, index ' + this.place); - }; - Parser.prototype.neutral = function(char) { - if (latin.test(char)) { - this.word = char; - this.state = KEYWORD; - return; - } - if (char === '"') { - this.word = ''; - this.state = QUOTED; - return; - } - if (digets.test(char)) { - this.word = char; - this.state = NUMBER; - return; - } - if (endThings.test(char)) { - this.afterItem(char); - return; - } - throw new Error('havn\'t handled "' +char + '" in neutral yet, index ' + this.place); - }; - Parser.prototype.output = function() { - while (this.place < this.text.length) { - this.readCharicter(); - } - if (this.state === ENDED) { - return this.root; - } - throw new Error('unable to parse string "' +this.text + '". State is ' + this.state); - }; - - function parseString(txt) { - var parser = new Parser(txt); - return parser.output(); - } - - function mapit(obj, key, value) { - if (Array.isArray(key)) { - value.unshift(key); - key = null; - } - var thing = key ? {} : obj; - - var out = value.reduce(function(newObj, item) { - sExpr(item, newObj); - return newObj - }, thing); - if (key) { - obj[key] = out; - } - } - - function sExpr(v, obj) { - if (!Array.isArray(v)) { - obj[v] = true; - return; - } - var key = v.shift(); - if (key === 'PARAMETER') { - key = v.shift(); - } - if (v.length === 1) { - if (Array.isArray(v[0])) { - obj[key] = {}; - sExpr(v[0], obj[key]); - return; - } - obj[key] = v[0]; - return; - } - if (!v.length) { - obj[key] = true; - return; - } - if (key === 'TOWGS84') { - obj[key] = v; - return; - } - if (!Array.isArray(key)) { - obj[key] = {}; - } - - var i; - switch (key) { - case 'UNIT': - case 'PRIMEM': - case 'VERT_DATUM': - obj[key] = { - name: v[0].toLowerCase(), - convert: v[1] - }; - if (v.length === 3) { - sExpr(v[2], obj[key]); - } - return; - case 'SPHEROID': - case 'ELLIPSOID': - obj[key] = { - name: v[0], - a: v[1], - rf: v[2] - }; - if (v.length === 4) { - sExpr(v[3], obj[key]); - } - return; - case 'PROJECTEDCRS': - case 'PROJCRS': - case 'GEOGCS': - case 'GEOCCS': - case 'PROJCS': - case 'LOCAL_CS': - case 'GEODCRS': - case 'GEODETICCRS': - case 'GEODETICDATUM': - case 'EDATUM': - case 'ENGINEERINGDATUM': - case 'VERT_CS': - case 'VERTCRS': - case 'VERTICALCRS': - case 'COMPD_CS': - case 'COMPOUNDCRS': - case 'ENGINEERINGCRS': - case 'ENGCRS': - case 'FITTED_CS': - case 'LOCAL_DATUM': - case 'DATUM': - v[0] = ['name', v[0]]; - mapit(obj, key, v); - return; - default: - i = -1; - while (++i < v.length) { - if (!Array.isArray(v[i])) { - return sExpr(v, obj[key]); - } - } - return mapit(obj, key, v); - } - } - - var D2R$1 = 0.01745329251994329577; - function rename(obj, params) { - var outName = params[0]; - var inName = params[1]; - if (!(outName in obj) && (inName in obj)) { - obj[outName] = obj[inName]; - if (params.length === 3) { - obj[outName] = params[2](obj[outName]); - } - } - } - - function d2r(input) { - return input * D2R$1; - } - - function cleanWKT(wkt) { - if (wkt.type === 'GEOGCS') { - wkt.projName = 'longlat'; - } else if (wkt.type === 'LOCAL_CS') { - wkt.projName = 'identity'; - wkt.local = true; - } else { - if (typeof wkt.PROJECTION === 'object') { - wkt.projName = Object.keys(wkt.PROJECTION)[0]; - } else { - wkt.projName = wkt.PROJECTION; - } - } - if (wkt.UNIT) { - wkt.units = wkt.UNIT.name.toLowerCase(); - if (wkt.units === 'metre') { - wkt.units = 'meter'; - } - if (wkt.UNIT.convert) { - if (wkt.type === 'GEOGCS') { - if (wkt.DATUM && wkt.DATUM.SPHEROID) { - wkt.to_meter = wkt.UNIT.convert*wkt.DATUM.SPHEROID.a; - } - } else { - wkt.to_meter = wkt.UNIT.convert, 10; - } - } - } - var geogcs = wkt.GEOGCS; - if (wkt.type === 'GEOGCS') { - geogcs = wkt; - } - if (geogcs) { - //if(wkt.GEOGCS.PRIMEM&&wkt.GEOGCS.PRIMEM.convert){ - // wkt.from_greenwich=wkt.GEOGCS.PRIMEM.convert*D2R; - //} - if (geogcs.DATUM) { - wkt.datumCode = geogcs.DATUM.name.toLowerCase(); - } else { - wkt.datumCode = geogcs.name.toLowerCase(); - } - if (wkt.datumCode.slice(0, 2) === 'd_') { - wkt.datumCode = wkt.datumCode.slice(2); - } - if (wkt.datumCode === 'new_zealand_geodetic_datum_1949' || wkt.datumCode === 'new_zealand_1949') { - wkt.datumCode = 'nzgd49'; - } - if (wkt.datumCode === 'wgs_1984') { - if (wkt.PROJECTION === 'Mercator_Auxiliary_Sphere') { - wkt.sphere = true; - } - wkt.datumCode = 'wgs84'; - } - if (wkt.datumCode.slice(-6) === '_ferro') { - wkt.datumCode = wkt.datumCode.slice(0, - 6); - } - if (wkt.datumCode.slice(-8) === '_jakarta') { - wkt.datumCode = wkt.datumCode.slice(0, - 8); - } - if (~wkt.datumCode.indexOf('belge')) { - wkt.datumCode = 'rnb72'; - } - if (geogcs.DATUM && geogcs.DATUM.SPHEROID) { - wkt.ellps = geogcs.DATUM.SPHEROID.name.replace('_19', '').replace(/[Cc]larke\_18/, 'clrk'); - if (wkt.ellps.toLowerCase().slice(0, 13) === 'international') { - wkt.ellps = 'intl'; - } - - wkt.a = geogcs.DATUM.SPHEROID.a; - wkt.rf = parseFloat(geogcs.DATUM.SPHEROID.rf, 10); - } - if (~wkt.datumCode.indexOf('osgb_1936')) { - wkt.datumCode = 'osgb36'; - } - } - if (wkt.b && !isFinite(wkt.b)) { - wkt.b = wkt.a; - } - - function toMeter(input) { - var ratio = wkt.to_meter || 1; - return input * ratio; - } - var renamer = function(a) { - return rename(wkt, a); - }; - var list = [ - ['standard_parallel_1', 'Standard_Parallel_1'], - ['standard_parallel_2', 'Standard_Parallel_2'], - ['false_easting', 'False_Easting'], - ['false_northing', 'False_Northing'], - ['central_meridian', 'Central_Meridian'], - ['latitude_of_origin', 'Latitude_Of_Origin'], - ['latitude_of_origin', 'Central_Parallel'], - ['scale_factor', 'Scale_Factor'], - ['k0', 'scale_factor'], - ['latitude_of_center', 'Latitude_of_center'], - ['lat0', 'latitude_of_center', d2r], - ['longitude_of_center', 'Longitude_Of_Center'], - ['longc', 'longitude_of_center', d2r], - ['x0', 'false_easting', toMeter], - ['y0', 'false_northing', toMeter], - ['long0', 'central_meridian', d2r], - ['lat0', 'latitude_of_origin', d2r], - ['lat0', 'standard_parallel_1', d2r], - ['lat1', 'standard_parallel_1', d2r], - ['lat2', 'standard_parallel_2', d2r], - ['alpha', 'azimuth', d2r], - ['srsCode', 'name'] - ]; - list.forEach(renamer); - if (!wkt.long0 && wkt.longc && (wkt.projName === 'Albers_Conic_Equal_Area' || wkt.projName === 'Lambert_Azimuthal_Equal_Area')) { - wkt.long0 = wkt.longc; - } - if (!wkt.lat_ts && wkt.lat1 && (wkt.projName === 'Stereographic_South_Pole' || wkt.projName === 'Polar Stereographic (variant B)')) { - wkt.lat0 = d2r(wkt.lat1 > 0 ? 90 : -90); - wkt.lat_ts = wkt.lat1; - } - } - var wkt = function(wkt) { - var lisp = parseString(wkt); - var type = lisp.shift(); - var name = lisp.shift(); - lisp.unshift(['name', name]); - lisp.unshift(['type', type]); - var obj = {}; - sExpr(lisp, obj); - cleanWKT(obj); - return obj; - }; - - function defs(name) { - /*global console*/ - var that = this; - if (arguments.length === 2) { - var def = arguments[1]; - if (typeof def === 'string') { - if (def.charAt(0) === '+') { - defs[name] = parseProj(arguments[1]); - } - else { - defs[name] = wkt(arguments[1]); - } - } else { - defs[name] = def; - } - } - else if (arguments.length === 1) { - if (Array.isArray(name)) { - return name.map(function(v) { - if (Array.isArray(v)) { - defs.apply(that, v); - } - else { - defs(v); - } - }); - } - else if (typeof name === 'string') { - if (name in defs) { - return defs[name]; - } - } - else if ('EPSG' in name) { - defs['EPSG:' + name.EPSG] = name; - } - else if ('ESRI' in name) { - defs['ESRI:' + name.ESRI] = name; - } - else if ('IAU2000' in name) { - defs['IAU2000:' + name.IAU2000] = name; - } - else { - console.log(name); - } - return; - } - - - } - globals(defs); - - function testObj(code){ - return typeof code === 'string'; - } - function testDef(code){ - return code in defs; - } - var codeWords = ['PROJECTEDCRS', 'PROJCRS', 'GEOGCS','GEOCCS','PROJCS','LOCAL_CS', 'GEODCRS', 'GEODETICCRS', 'GEODETICDATUM', 'ENGCRS', 'ENGINEERINGCRS']; - function testWKT(code){ - return codeWords.some(function (word) { - return code.indexOf(word) > -1; - }); - } - function testProj(code){ - return code[0] === '+'; - } - function parse(code){ - if (testObj(code)) { - //check to see if this is a WKT string - if (testDef(code)) { - return defs[code]; - } - if (testWKT(code)) { - return wkt(code); - } - if (testProj(code)) { - return parseProj(code); - } - }else{ - return code; - } - } - - var extend = function(destination, source) { - destination = destination || {}; - var value, property; - if (!source) { - return destination; - } - for (property in source) { - value = source[property]; - if (value !== undefined) { - destination[property] = value; - } - } - return destination; - }; - - var msfnz = function(eccent, sinphi, cosphi) { - var con = eccent * sinphi; - return cosphi / (Math.sqrt(1 - con * con)); - }; - - var sign = function(x) { - return x<0 ? -1 : 1; - }; - - var adjust_lon = function(x) { - return (Math.abs(x) <= SPI) ? x : (x - (sign(x) * TWO_PI)); - }; - - var tsfnz = function(eccent, phi, sinphi) { - var con = eccent * sinphi; - var com = 0.5 * eccent; - con = Math.pow(((1 - con) / (1 + con)), com); - return (Math.tan(0.5 * (HALF_PI - phi)) / con); - }; - - var phi2z = function(eccent, ts) { - var eccnth = 0.5 * eccent; - var con, dphi; - var phi = HALF_PI - 2 * Math.atan(ts); - for (var i = 0; i <= 15; i++) { - con = eccent * Math.sin(phi); - dphi = HALF_PI - 2 * Math.atan(ts * (Math.pow(((1 - con) / (1 + con)), eccnth))) - phi; - phi += dphi; - if (Math.abs(dphi) <= 0.0000000001) { - return phi; - } - } - //console.log("phi2z has NoConvergence"); - return -9999; - }; - - function init() { - var con = this.b / this.a; - this.es = 1 - con * con; - if(!('x0' in this)){ - this.x0 = 0; - } - if(!('y0' in this)){ - this.y0 = 0; - } - this.e = Math.sqrt(this.es); - if (this.lat_ts) { - if (this.sphere) { - this.k0 = Math.cos(this.lat_ts); - } - else { - this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); - } - } - else { - if (!this.k0) { - if (this.k) { - this.k0 = this.k; - } - else { - this.k0 = 1; - } - } - } - } - - /* Mercator forward equations--mapping lat,long to x,y - --------------------------------------------------*/ - - function forward(p) { - var lon = p.x; - var lat = p.y; - // convert to radians - if (lat * R2D > 90 && lat * R2D < -90 && lon * R2D > 180 && lon * R2D < -180) { - return null; - } - - var x, y; - if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { - return null; - } - else { - if (this.sphere) { - x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); - y = this.y0 + this.a * this.k0 * Math.log(Math.tan(FORTPI + 0.5 * lat)); - } - else { - var sinphi = Math.sin(lat); - var ts = tsfnz(this.e, lat, sinphi); - x = this.x0 + this.a * this.k0 * adjust_lon(lon - this.long0); - y = this.y0 - this.a * this.k0 * Math.log(ts); - } - p.x = x; - p.y = y; - return p; - } - } - - /* Mercator inverse equations--mapping x,y to lat/long - --------------------------------------------------*/ - function inverse(p) { - - var x = p.x - this.x0; - var y = p.y - this.y0; - var lon, lat; - - if (this.sphere) { - lat = HALF_PI - 2 * Math.atan(Math.exp(-y / (this.a * this.k0))); - } - else { - var ts = Math.exp(-y / (this.a * this.k0)); - lat = phi2z(this.e, ts); - if (lat === -9999) { - return null; - } - } - lon = adjust_lon(this.long0 + x / (this.a * this.k0)); - - p.x = lon; - p.y = lat; - return p; - } - - var names$1 = ["Mercator", "Popular Visualisation Pseudo Mercator", "Mercator_1SP", "Mercator_Auxiliary_Sphere", "merc"]; - var merc = { - init: init, - forward: forward, - inverse: inverse, - names: names$1 - }; - - function init$1() { - //no-op for longlat - } - - function identity(pt) { - return pt; - } - var names$2 = ["longlat", "identity"]; - var longlat = { - init: init$1, - forward: identity, - inverse: identity, - names: names$2 - }; - - var projs = [merc, longlat]; - var names$$1 = {}; - var projStore = []; - - function add(proj, i) { - var len = projStore.length; - if (!proj.names) { - console.log(i); - return true; - } - projStore[len] = proj; - proj.names.forEach(function(n) { - names$$1[n.toLowerCase()] = len; - }); - return this; - } - - function get(name) { - if (!name) { - return false; - } - var n = name.toLowerCase(); - if (typeof names$$1[n] !== 'undefined' && projStore[names$$1[n]]) { - return projStore[names$$1[n]]; - } - } - - function start() { - projs.forEach(add); - } - var projections = { - start: start, - add: add, - get: get - }; - - var exports$2 = {}; - exports$2.MERIT = { - a: 6378137.0, - rf: 298.257, - ellipseName: "MERIT 1983" - }; - - exports$2.SGS85 = { - a: 6378136.0, - rf: 298.257, - ellipseName: "Soviet Geodetic System 85" - }; - - exports$2.GRS80 = { - a: 6378137.0, - rf: 298.257222101, - ellipseName: "GRS 1980(IUGG, 1980)" - }; - - exports$2.IAU76 = { - a: 6378140.0, - rf: 298.257, - ellipseName: "IAU 1976" - }; - - exports$2.airy = { - a: 6377563.396, - b: 6356256.910, - ellipseName: "Airy 1830" - }; - - exports$2.APL4 = { - a: 6378137, - rf: 298.25, - ellipseName: "Appl. Physics. 1965" - }; - - exports$2.NWL9D = { - a: 6378145.0, - rf: 298.25, - ellipseName: "Naval Weapons Lab., 1965" - }; - - exports$2.mod_airy = { - a: 6377340.189, - b: 6356034.446, - ellipseName: "Modified Airy" - }; - - exports$2.andrae = { - a: 6377104.43, - rf: 300.0, - ellipseName: "Andrae 1876 (Den., Iclnd.)" - }; - - exports$2.aust_SA = { - a: 6378160.0, - rf: 298.25, - ellipseName: "Australian Natl & S. Amer. 1969" - }; - - exports$2.GRS67 = { - a: 6378160.0, - rf: 298.2471674270, - ellipseName: "GRS 67(IUGG 1967)" - }; - - exports$2.bessel = { - a: 6377397.155, - rf: 299.1528128, - ellipseName: "Bessel 1841" - }; - - exports$2.bess_nam = { - a: 6377483.865, - rf: 299.1528128, - ellipseName: "Bessel 1841 (Namibia)" - }; - - exports$2.clrk66 = { - a: 6378206.4, - b: 6356583.8, - ellipseName: "Clarke 1866" - }; - - exports$2.clrk80 = { - a: 6378249.145, - rf: 293.4663, - ellipseName: "Clarke 1880 mod." - }; - - exports$2.clrk58 = { - a: 6378293.645208759, - rf: 294.2606763692654, - ellipseName: "Clarke 1858" - }; - - exports$2.CPM = { - a: 6375738.7, - rf: 334.29, - ellipseName: "Comm. des Poids et Mesures 1799" - }; - - exports$2.delmbr = { - a: 6376428.0, - rf: 311.5, - ellipseName: "Delambre 1810 (Belgium)" - }; - - exports$2.engelis = { - a: 6378136.05, - rf: 298.2566, - ellipseName: "Engelis 1985" - }; - - exports$2.evrst30 = { - a: 6377276.345, - rf: 300.8017, - ellipseName: "Everest 1830" - }; - - exports$2.evrst48 = { - a: 6377304.063, - rf: 300.8017, - ellipseName: "Everest 1948" - }; - - exports$2.evrst56 = { - a: 6377301.243, - rf: 300.8017, - ellipseName: "Everest 1956" - }; - - exports$2.evrst69 = { - a: 6377295.664, - rf: 300.8017, - ellipseName: "Everest 1969" - }; - - exports$2.evrstSS = { - a: 6377298.556, - rf: 300.8017, - ellipseName: "Everest (Sabah & Sarawak)" - }; - - exports$2.fschr60 = { - a: 6378166.0, - rf: 298.3, - ellipseName: "Fischer (Mercury Datum) 1960" - }; - - exports$2.fschr60m = { - a: 6378155.0, - rf: 298.3, - ellipseName: "Fischer 1960" - }; - - exports$2.fschr68 = { - a: 6378150.0, - rf: 298.3, - ellipseName: "Fischer 1968" - }; - - exports$2.helmert = { - a: 6378200.0, - rf: 298.3, - ellipseName: "Helmert 1906" - }; - - exports$2.hough = { - a: 6378270.0, - rf: 297.0, - ellipseName: "Hough" - }; - - exports$2.intl = { - a: 6378388.0, - rf: 297.0, - ellipseName: "International 1909 (Hayford)" - }; - - exports$2.kaula = { - a: 6378163.0, - rf: 298.24, - ellipseName: "Kaula 1961" - }; - - exports$2.lerch = { - a: 6378139.0, - rf: 298.257, - ellipseName: "Lerch 1979" - }; - - exports$2.mprts = { - a: 6397300.0, - rf: 191.0, - ellipseName: "Maupertius 1738" - }; - - exports$2.new_intl = { - a: 6378157.5, - b: 6356772.2, - ellipseName: "New International 1967" - }; - - exports$2.plessis = { - a: 6376523.0, - rf: 6355863.0, - ellipseName: "Plessis 1817 (France)" - }; - - exports$2.krass = { - a: 6378245.0, - rf: 298.3, - ellipseName: "Krassovsky, 1942" - }; - - exports$2.SEasia = { - a: 6378155.0, - b: 6356773.3205, - ellipseName: "Southeast Asia" - }; - - exports$2.walbeck = { - a: 6376896.0, - b: 6355834.8467, - ellipseName: "Walbeck" - }; - - exports$2.WGS60 = { - a: 6378165.0, - rf: 298.3, - ellipseName: "WGS 60" - }; - - exports$2.WGS66 = { - a: 6378145.0, - rf: 298.25, - ellipseName: "WGS 66" - }; - - exports$2.WGS7 = { - a: 6378135.0, - rf: 298.26, - ellipseName: "WGS 72" - }; - - var WGS84 = exports$2.WGS84 = { - a: 6378137.0, - rf: 298.257223563, - ellipseName: "WGS 84" - }; - - exports$2.sphere = { - a: 6370997.0, - b: 6370997.0, - ellipseName: "Normal Sphere (r=6370997)" - }; - - function eccentricity(a, b, rf, R_A) { - var a2 = a * a; // used in geocentric - var b2 = b * b; // used in geocentric - var es = (a2 - b2) / a2; // e ^ 2 - var e = 0; - if (R_A) { - a *= 1 - es * (SIXTH + es * (RA4 + es * RA6)); - a2 = a * a; - es = 0; - } else { - e = Math.sqrt(es); // eccentricity - } - var ep2 = (a2 - b2) / b2; // used in geocentric - return { - es: es, - e: e, - ep2: ep2 - }; - } - function sphere(a, b, rf, ellps, sphere) { - if (!a) { // do we have an ellipsoid? - var ellipse = match(exports$2, ellps); - if (!ellipse) { - ellipse = WGS84; - } - a = ellipse.a; - b = ellipse.b; - rf = ellipse.rf; - } - - if (rf && !b) { - b = (1.0 - 1.0 / rf) * a; - } - if (rf === 0 || Math.abs(a - b) < EPSLN) { - sphere = true; - b = a; - } - return { - a: a, - b: b, - rf: rf, - sphere: sphere - }; - } - - var exports$3 = {}; - exports$3.wgs84 = { - towgs84: "0,0,0", - ellipse: "WGS84", - datumName: "WGS84" - }; - - exports$3.ch1903 = { - towgs84: "674.374,15.056,405.346", - ellipse: "bessel", - datumName: "swiss" - }; - - exports$3.ggrs87 = { - towgs84: "-199.87,74.79,246.62", - ellipse: "GRS80", - datumName: "Greek_Geodetic_Reference_System_1987" - }; - - exports$3.nad83 = { - towgs84: "0,0,0", - ellipse: "GRS80", - datumName: "North_American_Datum_1983" - }; - - exports$3.nad27 = { - nadgrids: "@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat", - ellipse: "clrk66", - datumName: "North_American_Datum_1927" - }; - - exports$3.potsdam = { - towgs84: "606.0,23.0,413.0", - ellipse: "bessel", - datumName: "Potsdam Rauenberg 1950 DHDN" - }; - - exports$3.carthage = { - towgs84: "-263.0,6.0,431.0", - ellipse: "clark80", - datumName: "Carthage 1934 Tunisia" - }; - - exports$3.hermannskogel = { - towgs84: "653.0,-212.0,449.0", - ellipse: "bessel", - datumName: "Hermannskogel" - }; - - exports$3.ire65 = { - towgs84: "482.530,-130.596,564.557,-1.042,-0.214,-0.631,8.15", - ellipse: "mod_airy", - datumName: "Ireland 1965" - }; - - exports$3.rassadiran = { - towgs84: "-133.63,-157.5,-158.62", - ellipse: "intl", - datumName: "Rassadiran" - }; - - exports$3.nzgd49 = { - towgs84: "59.47,-5.04,187.44,0.47,-0.1,1.024,-4.5993", - ellipse: "intl", - datumName: "New Zealand Geodetic Datum 1949" - }; - - exports$3.osgb36 = { - towgs84: "446.448,-125.157,542.060,0.1502,0.2470,0.8421,-20.4894", - ellipse: "airy", - datumName: "Airy 1830" - }; - - exports$3.s_jtsk = { - towgs84: "589,76,480", - ellipse: 'bessel', - datumName: 'S-JTSK (Ferro)' - }; - - exports$3.beduaram = { - towgs84: '-106,-87,188', - ellipse: 'clrk80', - datumName: 'Beduaram' - }; - - exports$3.gunung_segara = { - towgs84: '-403,684,41', - ellipse: 'bessel', - datumName: 'Gunung Segara Jakarta' - }; - - exports$3.rnb72 = { - towgs84: "106.869,-52.2978,103.724,-0.33657,0.456955,-1.84218,1", - ellipse: "intl", - datumName: "Reseau National Belge 1972" - }; - - function datum(datumCode, datum_params, a, b, es, ep2) { - var out = {}; - - if (datumCode === undefined || datumCode === 'none') { - out.datum_type = PJD_NODATUM; - } else { - out.datum_type = PJD_WGS84; - } - - if (datum_params) { - out.datum_params = datum_params.map(parseFloat); - if (out.datum_params[0] !== 0 || out.datum_params[1] !== 0 || out.datum_params[2] !== 0) { - out.datum_type = PJD_3PARAM; - } - if (out.datum_params.length > 3) { - if (out.datum_params[3] !== 0 || out.datum_params[4] !== 0 || out.datum_params[5] !== 0 || out.datum_params[6] !== 0) { - out.datum_type = PJD_7PARAM; - out.datum_params[3] *= SEC_TO_RAD; - out.datum_params[4] *= SEC_TO_RAD; - out.datum_params[5] *= SEC_TO_RAD; - out.datum_params[6] = (out.datum_params[6] / 1000000.0) + 1.0; - } - } - } - - out.a = a; //datum object also uses these values - out.b = b; - out.es = es; - out.ep2 = ep2; - return out; - } - - function Projection$1(srsCode,callback) { - if (!(this instanceof Projection$1)) { - return new Projection$1(srsCode); - } - callback = callback || function(error){ - if(error){ - throw error; - } - }; - var json = parse(srsCode); - if(typeof json !== 'object'){ - callback(srsCode); - return; - } - var ourProj = Projection$1.projections.get(json.projName); - if(!ourProj){ - callback(srsCode); - return; - } - if (json.datumCode && json.datumCode !== 'none') { - var datumDef = match(exports$3, json.datumCode); - if (datumDef) { - json.datum_params = datumDef.towgs84 ? datumDef.towgs84.split(',') : null; - json.ellps = datumDef.ellipse; - json.datumName = datumDef.datumName ? datumDef.datumName : json.datumCode; - } - } - json.k0 = json.k0 || 1.0; - json.axis = json.axis || 'enu'; - json.ellps = json.ellps || 'wgs84'; - var sphere_ = sphere(json.a, json.b, json.rf, json.ellps, json.sphere); - var ecc = eccentricity(sphere_.a, sphere_.b, sphere_.rf, json.R_A); - var datumObj = json.datum || datum(json.datumCode, json.datum_params, sphere_.a, sphere_.b, ecc.es, ecc.ep2); - - extend(this, json); // transfer everything over from the projection because we don't know what we'll need - extend(this, ourProj); // transfer all the methods from the projection - - // copy the 4 things over we calulated in deriveConstants.sphere - this.a = sphere_.a; - this.b = sphere_.b; - this.rf = sphere_.rf; - this.sphere = sphere_.sphere; - - // copy the 3 things we calculated in deriveConstants.eccentricity - this.es = ecc.es; - this.e = ecc.e; - this.ep2 = ecc.ep2; - - // add in the datum object - this.datum = datumObj; - - // init the projection - this.init(); - - // legecy callback from back in the day when it went to spatialreference.org - callback(null, this); - - } - Projection$1.projections = projections; - Projection$1.projections.start(); - - function compareDatums(source, dest) { - if (source.datum_type !== dest.datum_type) { - return false; // false, datums are not equal - } else if (source.a !== dest.a || Math.abs(source.es - dest.es) > 0.000000000050) { - // the tolerance for es is to ensure that GRS80 and WGS84 - // are considered identical - return false; - } else if (source.datum_type === PJD_3PARAM) { - return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2]); - } else if (source.datum_type === PJD_7PARAM) { - return (source.datum_params[0] === dest.datum_params[0] && source.datum_params[1] === dest.datum_params[1] && source.datum_params[2] === dest.datum_params[2] && source.datum_params[3] === dest.datum_params[3] && source.datum_params[4] === dest.datum_params[4] && source.datum_params[5] === dest.datum_params[5] && source.datum_params[6] === dest.datum_params[6]); - } else { - return true; // datums are equal - } - } // cs_compare_datums() - - /* - * The function Convert_Geodetic_To_Geocentric converts geodetic coordinates - * (latitude, longitude, and height) to geocentric coordinates (X, Y, Z), - * according to the current ellipsoid parameters. - * - * Latitude : Geodetic latitude in radians (input) - * Longitude : Geodetic longitude in radians (input) - * Height : Geodetic height, in meters (input) - * X : Calculated Geocentric X coordinate, in meters (output) - * Y : Calculated Geocentric Y coordinate, in meters (output) - * Z : Calculated Geocentric Z coordinate, in meters (output) - * - */ - function geodeticToGeocentric(p, es, a) { - var Longitude = p.x; - var Latitude = p.y; - var Height = p.z ? p.z : 0; //Z value not always supplied - - var Rn; /* Earth radius at location */ - var Sin_Lat; /* Math.sin(Latitude) */ - var Sin2_Lat; /* Square of Math.sin(Latitude) */ - var Cos_Lat; /* Math.cos(Latitude) */ - - /* - ** Don't blow up if Latitude is just a little out of the value - ** range as it may just be a rounding issue. Also removed longitude - ** test, it should be wrapped by Math.cos() and Math.sin(). NFW for PROJ.4, Sep/2001. - */ - if (Latitude < -HALF_PI && Latitude > -1.001 * HALF_PI) { - Latitude = -HALF_PI; - } else if (Latitude > HALF_PI && Latitude < 1.001 * HALF_PI) { - Latitude = HALF_PI; - } else if ((Latitude < -HALF_PI) || (Latitude > HALF_PI)) { - /* Latitude out of range */ - //..reportError('geocent:lat out of range:' + Latitude); - return null; - } - - if (Longitude > Math.PI) { - Longitude -= (2 * Math.PI); - } - Sin_Lat = Math.sin(Latitude); - Cos_Lat = Math.cos(Latitude); - Sin2_Lat = Sin_Lat * Sin_Lat; - Rn = a / (Math.sqrt(1.0e0 - es * Sin2_Lat)); - return { - x: (Rn + Height) * Cos_Lat * Math.cos(Longitude), - y: (Rn + Height) * Cos_Lat * Math.sin(Longitude), - z: ((Rn * (1 - es)) + Height) * Sin_Lat - }; - } // cs_geodetic_to_geocentric() - - function geocentricToGeodetic(p, es, a, b) { - /* local defintions and variables */ - /* end-criterium of loop, accuracy of sin(Latitude) */ - var genau = 1e-12; - var genau2 = (genau * genau); - var maxiter = 30; - - var P; /* distance between semi-minor axis and location */ - var RR; /* distance between center and location */ - var CT; /* sin of geocentric latitude */ - var ST; /* cos of geocentric latitude */ - var RX; - var RK; - var RN; /* Earth radius at location */ - var CPHI0; /* cos of start or old geodetic latitude in iterations */ - var SPHI0; /* sin of start or old geodetic latitude in iterations */ - var CPHI; /* cos of searched geodetic latitude */ - var SPHI; /* sin of searched geodetic latitude */ - var SDPHI; /* end-criterium: addition-theorem of sin(Latitude(iter)-Latitude(iter-1)) */ - var iter; /* # of continous iteration, max. 30 is always enough (s.a.) */ - - var X = p.x; - var Y = p.y; - var Z = p.z ? p.z : 0.0; //Z value not always supplied - var Longitude; - var Latitude; - var Height; - - P = Math.sqrt(X * X + Y * Y); - RR = Math.sqrt(X * X + Y * Y + Z * Z); - - /* special cases for latitude and longitude */ - if (P / a < genau) { - - /* special case, if P=0. (X=0., Y=0.) */ - Longitude = 0.0; - - /* if (X,Y,Z)=(0.,0.,0.) then Height becomes semi-minor axis - * of ellipsoid (=center of mass), Latitude becomes PI/2 */ - if (RR / a < genau) { - Latitude = HALF_PI; - Height = -b; - return { - x: p.x, - y: p.y, - z: p.z - }; - } - } else { - /* ellipsoidal (geodetic) longitude - * interval: -PI < Longitude <= +PI */ - Longitude = Math.atan2(Y, X); - } - - /* -------------------------------------------------------------- - * Following iterative algorithm was developped by - * "Institut for Erdmessung", University of Hannover, July 1988. - * Internet: www.ife.uni-hannover.de - * Iterative computation of CPHI,SPHI and Height. - * Iteration of CPHI and SPHI to 10**-12 radian resp. - * 2*10**-7 arcsec. - * -------------------------------------------------------------- - */ - CT = Z / RR; - ST = P / RR; - RX = 1.0 / Math.sqrt(1.0 - es * (2.0 - es) * ST * ST); - CPHI0 = ST * (1.0 - es) * RX; - SPHI0 = CT * RX; - iter = 0; - - /* loop to find sin(Latitude) resp. Latitude - * until |sin(Latitude(iter)-Latitude(iter-1))| < genau */ - do { - iter++; - RN = a / Math.sqrt(1.0 - es * SPHI0 * SPHI0); - - /* ellipsoidal (geodetic) height */ - Height = P * CPHI0 + Z * SPHI0 - RN * (1.0 - es * SPHI0 * SPHI0); - - RK = es * RN / (RN + Height); - RX = 1.0 / Math.sqrt(1.0 - RK * (2.0 - RK) * ST * ST); - CPHI = ST * (1.0 - RK) * RX; - SPHI = CT * RX; - SDPHI = SPHI * CPHI0 - CPHI * SPHI0; - CPHI0 = CPHI; - SPHI0 = SPHI; - } - while (SDPHI * SDPHI > genau2 && iter < maxiter); - - /* ellipsoidal (geodetic) latitude */ - Latitude = Math.atan(SPHI / Math.abs(CPHI)); - return { - x: Longitude, - y: Latitude, - z: Height - }; - } // cs_geocentric_to_geodetic() - - /****************************************************************/ - // pj_geocentic_to_wgs84( p ) - // p = point to transform in geocentric coordinates (x,y,z) - - - /** point object, nothing fancy, just allows values to be - passed back and forth by reference rather than by value. - Other point classes may be used as long as they have - x and y properties, which will get modified in the transform method. - */ - function geocentricToWgs84(p, datum_type, datum_params) { - - if (datum_type === PJD_3PARAM) { - // if( x[io] === HUGE_VAL ) - // continue; - return { - x: p.x + datum_params[0], - y: p.y + datum_params[1], - z: p.z + datum_params[2], - }; - } else if (datum_type === PJD_7PARAM) { - var Dx_BF = datum_params[0]; - var Dy_BF = datum_params[1]; - var Dz_BF = datum_params[2]; - var Rx_BF = datum_params[3]; - var Ry_BF = datum_params[4]; - var Rz_BF = datum_params[5]; - var M_BF = datum_params[6]; - // if( x[io] === HUGE_VAL ) - // continue; - return { - x: M_BF * (p.x - Rz_BF * p.y + Ry_BF * p.z) + Dx_BF, - y: M_BF * (Rz_BF * p.x + p.y - Rx_BF * p.z) + Dy_BF, - z: M_BF * (-Ry_BF * p.x + Rx_BF * p.y + p.z) + Dz_BF - }; - } - } // cs_geocentric_to_wgs84 - - /****************************************************************/ - // pj_geocentic_from_wgs84() - // coordinate system definition, - // point to transform in geocentric coordinates (x,y,z) - function geocentricFromWgs84(p, datum_type, datum_params) { - - if (datum_type === PJD_3PARAM) { - //if( x[io] === HUGE_VAL ) - // continue; - return { - x: p.x - datum_params[0], - y: p.y - datum_params[1], - z: p.z - datum_params[2], - }; - - } else if (datum_type === PJD_7PARAM) { - var Dx_BF = datum_params[0]; - var Dy_BF = datum_params[1]; - var Dz_BF = datum_params[2]; - var Rx_BF = datum_params[3]; - var Ry_BF = datum_params[4]; - var Rz_BF = datum_params[5]; - var M_BF = datum_params[6]; - var x_tmp = (p.x - Dx_BF) / M_BF; - var y_tmp = (p.y - Dy_BF) / M_BF; - var z_tmp = (p.z - Dz_BF) / M_BF; - //if( x[io] === HUGE_VAL ) - // continue; - - return { - x: x_tmp + Rz_BF * y_tmp - Ry_BF * z_tmp, - y: -Rz_BF * x_tmp + y_tmp + Rx_BF * z_tmp, - z: Ry_BF * x_tmp - Rx_BF * y_tmp + z_tmp - }; - } //cs_geocentric_from_wgs84() - } - - function checkParams(type) { - return (type === PJD_3PARAM || type === PJD_7PARAM); - } - - var datum_transform = function(source, dest, point) { - // Short cut if the datums are identical. - if (compareDatums(source, dest)) { - return point; // in this case, zero is sucess, - // whereas cs_compare_datums returns 1 to indicate TRUE - // confusing, should fix this - } - - // Explicitly skip datum transform by setting 'datum=none' as parameter for either source or dest - if (source.datum_type === PJD_NODATUM || dest.datum_type === PJD_NODATUM) { - return point; - } - - // If this datum requires grid shifts, then apply it to geodetic coordinates. - - // Do we need to go through geocentric coordinates? - if (source.es === dest.es && source.a === dest.a && !checkParams(source.datum_type) && !checkParams(dest.datum_type)) { - return point; - } - - // Convert to geocentric coordinates. - point = geodeticToGeocentric(point, source.es, source.a); - // Convert between datums - if (checkParams(source.datum_type)) { - point = geocentricToWgs84(point, source.datum_type, source.datum_params); - } - if (checkParams(dest.datum_type)) { - point = geocentricFromWgs84(point, dest.datum_type, dest.datum_params); - } - return geocentricToGeodetic(point, dest.es, dest.a, dest.b); - - }; - - var adjust_axis = function(crs, denorm, point) { - var xin = point.x, - yin = point.y, - zin = point.z || 0.0; - var v, t, i; - var out = {}; - for (i = 0; i < 3; i++) { - if (denorm && i === 2 && point.z === undefined) { - continue; - } - if (i === 0) { - v = xin; - t = 'x'; - } - else if (i === 1) { - v = yin; - t = 'y'; - } - else { - v = zin; - t = 'z'; - } - switch (crs.axis[i]) { - case 'e': - out[t] = v; - break; - case 'w': - out[t] = -v; - break; - case 'n': - out[t] = v; - break; - case 's': - out[t] = -v; - break; - case 'u': - if (point[t] !== undefined) { - out.z = v; - } - break; - case 'd': - if (point[t] !== undefined) { - out.z = -v; - } - break; - default: - //console.log("ERROR: unknow axis ("+crs.axis[i]+") - check definition of "+crs.projName); - return null; - } - } - return out; - }; - - var toPoint = function (array){ - var out = { - x: array[0], - y: array[1] - }; - if (array.length>2) { - out.z = array[2]; - } - if (array.length>3) { - out.m = array[3]; - } - return out; - }; - - function checkNotWGS(source, dest) { - return ((source.datum.datum_type === PJD_3PARAM || source.datum.datum_type === PJD_7PARAM) && dest.datumCode !== 'WGS84') || ((dest.datum.datum_type === PJD_3PARAM || dest.datum.datum_type === PJD_7PARAM) && source.datumCode !== 'WGS84'); - } - - function transform(source, dest, point) { - var wgs84; - if (Array.isArray(point)) { - point = toPoint(point); - } - - // Workaround for datum shifts towgs84, if either source or destination projection is not wgs84 - if (source.datum && dest.datum && checkNotWGS(source, dest)) { - wgs84 = new Projection$1('WGS84'); - point = transform(source, wgs84, point); - source = wgs84; - } - // DGR, 2010/11/12 - if (source.axis !== 'enu') { - point = adjust_axis(source, false, point); - } - // Transform source points to long/lat, if they aren't already. - if (source.projName === 'longlat') { - point.x *= D2R; - point.y *= D2R; - } - else { - if (source.isGeocent) { - if (source.to_meter) { - point.x *= source.to_meter; - point.y *= source.to_meter; - point.z *= source.to_meter; - } - // originally dest.datum.geocentric_to_geodetic_noniter(point); - point = geocentricToGeodetic(point, dest.es, dest.a, dest.b); - } else { - if (source.to_meter) { - point.x *= source.to_meter; - point.y *= source.to_meter; - } - point = source.inverse(point); // Convert Cartesian to longlat - } - } - // Adjust for the prime meridian if necessary - if (source.from_greenwich) { - point.x += source.from_greenwich; - } - - // Convert datums if needed, and if possible. - point = datum_transform(source.datum, dest.datum, point); - - // Adjust for the prime meridian if necessary - if (dest.from_greenwich) { - point.x -= dest.from_greenwich; - } - - if (dest.projName === 'longlat') { - // convert radians to decimal degrees - point.x *= R2D; - point.y *= R2D; - } else { // else project - if (dest.isGeocent) { - point = geodeticToGeocentric(point, dest.es, dest.a); - if (dest.to_meter) { - point.x /= dest.to_meter; - point.y /= dest.to_meter; - point.z /= dest.to_meter; - } - } else { - dest.forward(point); - if (dest.to_meter) { - point.x /= dest.to_meter; - point.y /= dest.to_meter; - } - } - } - - // DGR, 2010/11/12 - if (dest.axis !== 'enu') { - return adjust_axis(dest, true, point); - } - - return point; - } - - var wgs84 = Projection$1('WGS84'); - - function transformer(from, to, coords) { - var transformedArray; - if (Array.isArray(coords)) { - transformedArray = transform(from, to, coords); - if (coords.length === 3) { - return [transformedArray.x, transformedArray.y, transformedArray.z]; - } - else { - return [transformedArray.x, transformedArray.y]; - } - } - else { - return transform(from, to, coords); - } - } - - function checkProj(item) { - if (item instanceof Projection$1) { - return item; - } - if (item.oProj) { - return item.oProj; - } - return Projection$1(item); - } - function _mproj4_$1(fromProj, toProj, coord, retProj) { - if(retProj) { - return fromProj; - } - fromProj = checkProj(fromProj); - var single = false; - var obj; - if (typeof toProj === 'undefined') { - toProj = fromProj; - fromProj = wgs84; - single = true; - } - else if (typeof toProj.x !== 'undefined' || Array.isArray(toProj)) { - coord = toProj; - toProj = fromProj; - fromProj = wgs84; - single = true; - } - toProj = checkProj(toProj); - if (coord) { - return transformer(fromProj, toProj, coord); - } - else { - obj = { - forward: function (coords) { - return transformer(fromProj, toProj, coords); - }, - inverse: function (coords) { - return transformer(toProj, fromProj, coords); - }, - info: function () { - return { - "a": toProj.a, - "b": toProj.b, - "ra": toProj.R_A, - "proj-name": toProj.projName - }; - } - }; - if (single) { - obj.oProj = toProj; - } - return obj; - } - } - - /** - * UTM zones are grouped, and assigned to one of a group of 6 - * sets. - * - * {int} @private - */ - var NUM_100K_SETS = 6; - - /** - * The column letters (for easting) of the lower left value, per - * set. - * - * {string} @private - */ - var SET_ORIGIN_COLUMN_LETTERS = 'AJSAJS'; - - /** - * The row letters (for northing) of the lower left value, per - * set. - * - * {string} @private - */ - var SET_ORIGIN_ROW_LETTERS = 'AFAFAF'; - - var A = 65; // A - var I = 73; // I - var O = 79; // O - var V = 86; // V - var Z = 90; // Z - var mgrs = { - forward: forward$1, - inverse: inverse$1, - toPoint: toPoint$1 - }; - /** - * Conversion of lat/lon to MGRS. - * - * @param {object} ll Object literal with lat and lon properties on a - * WGS84 ellipsoid. - * @param {int} accuracy Accuracy in digits (5 for 1 m, 4 for 10 m, 3 for - * 100 m, 2 for 1000 m or 1 for 10000 m). Optional, default is 5. - * @return {string} the MGRS string for the given location and accuracy. - */ - function forward$1(ll, accuracy) { - accuracy = accuracy || 5; // default accuracy 1m - return encode(LLtoUTM({ - lat: ll[1], - lon: ll[0] - }), accuracy); - } - - /** - * Conversion of MGRS to lat/lon. - * - * @param {string} mgrs MGRS string. - * @return {array} An array with left (longitude), bottom (latitude), right - * (longitude) and top (latitude) values in WGS84, representing the - * bounding box for the provided MGRS reference. - */ - function inverse$1(mgrs) { - var bbox = UTMtoLL(decode(mgrs.toUpperCase())); - if (bbox.lat && bbox.lon) { - return [bbox.lon, bbox.lat, bbox.lon, bbox.lat]; - } - return [bbox.left, bbox.bottom, bbox.right, bbox.top]; - } - - function toPoint$1(mgrs) { - var bbox = UTMtoLL(decode(mgrs.toUpperCase())); - if (bbox.lat && bbox.lon) { - return [bbox.lon, bbox.lat]; - } - return [(bbox.left + bbox.right) / 2, (bbox.top + bbox.bottom) / 2]; - } - /** - * Conversion from degrees to radians. - * - * @private - * @param {number} deg the angle in degrees. - * @return {number} the angle in radians. - */ - function degToRad(deg) { - return (deg * (Math.PI / 180.0)); - } - - /** - * Conversion from radians to degrees. - * - * @private - * @param {number} rad the angle in radians. - * @return {number} the angle in degrees. - */ - function radToDeg(rad) { - return (180.0 * (rad / Math.PI)); - } - - /** - * Converts a set of Longitude and Latitude co-ordinates to UTM - * using the WGS84 ellipsoid. - * - * @private - * @param {object} ll Object literal with lat and lon properties - * representing the WGS84 coordinate to be converted. - * @return {object} Object literal containing the UTM value with easting, - * northing, zoneNumber and zoneLetter properties, and an optional - * accuracy property in digits. Returns null if the conversion failed. - */ - function LLtoUTM(ll) { - var Lat = ll.lat; - var Long = ll.lon; - var a = 6378137.0; //ellip.radius; - var eccSquared = 0.00669438; //ellip.eccsq; - var k0 = 0.9996; - var LongOrigin; - var eccPrimeSquared; - var N, T, C, A, M; - var LatRad = degToRad(Lat); - var LongRad = degToRad(Long); - var LongOriginRad; - var ZoneNumber; - // (int) - ZoneNumber = Math.floor((Long + 180) / 6) + 1; - - //Make sure the longitude 180.00 is in Zone 60 - if (Long === 180) { - ZoneNumber = 60; - } - - // Special zone for Norway - if (Lat >= 56.0 && Lat < 64.0 && Long >= 3.0 && Long < 12.0) { - ZoneNumber = 32; - } - - // Special zones for Svalbard - if (Lat >= 72.0 && Lat < 84.0) { - if (Long >= 0.0 && Long < 9.0) { - ZoneNumber = 31; - } - else if (Long >= 9.0 && Long < 21.0) { - ZoneNumber = 33; - } - else if (Long >= 21.0 && Long < 33.0) { - ZoneNumber = 35; - } - else if (Long >= 33.0 && Long < 42.0) { - ZoneNumber = 37; - } - } - - LongOrigin = (ZoneNumber - 1) * 6 - 180 + 3; //+3 puts origin - // in middle of - // zone - LongOriginRad = degToRad(LongOrigin); - - eccPrimeSquared = (eccSquared) / (1 - eccSquared); - - N = a / Math.sqrt(1 - eccSquared * Math.sin(LatRad) * Math.sin(LatRad)); - T = Math.tan(LatRad) * Math.tan(LatRad); - C = eccPrimeSquared * Math.cos(LatRad) * Math.cos(LatRad); - A = Math.cos(LatRad) * (LongRad - LongOriginRad); - - M = a * ((1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256) * LatRad - (3 * eccSquared / 8 + 3 * eccSquared * eccSquared / 32 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(2 * LatRad) + (15 * eccSquared * eccSquared / 256 + 45 * eccSquared * eccSquared * eccSquared / 1024) * Math.sin(4 * LatRad) - (35 * eccSquared * eccSquared * eccSquared / 3072) * Math.sin(6 * LatRad)); - - var UTMEasting = (k0 * N * (A + (1 - T + C) * A * A * A / 6.0 + (5 - 18 * T + T * T + 72 * C - 58 * eccPrimeSquared) * A * A * A * A * A / 120.0) + 500000.0); - - var UTMNorthing = (k0 * (M + N * Math.tan(LatRad) * (A * A / 2 + (5 - T + 9 * C + 4 * C * C) * A * A * A * A / 24.0 + (61 - 58 * T + T * T + 600 * C - 330 * eccPrimeSquared) * A * A * A * A * A * A / 720.0))); - if (Lat < 0.0) { - UTMNorthing += 10000000.0; //10000000 meter offset for - // southern hemisphere - } - - return { - northing: Math.round(UTMNorthing), - easting: Math.round(UTMEasting), - zoneNumber: ZoneNumber, - zoneLetter: getLetterDesignator(Lat) - }; - } - - /** - * Converts UTM coords to lat/long, using the WGS84 ellipsoid. This is a convenience - * class where the Zone can be specified as a single string eg."60N" which - * is then broken down into the ZoneNumber and ZoneLetter. - * - * @private - * @param {object} utm An object literal with northing, easting, zoneNumber - * and zoneLetter properties. If an optional accuracy property is - * provided (in meters), a bounding box will be returned instead of - * latitude and longitude. - * @return {object} An object literal containing either lat and lon values - * (if no accuracy was provided), or top, right, bottom and left values - * for the bounding box calculated according to the provided accuracy. - * Returns null if the conversion failed. - */ - function UTMtoLL(utm) { - - var UTMNorthing = utm.northing; - var UTMEasting = utm.easting; - var zoneLetter = utm.zoneLetter; - var zoneNumber = utm.zoneNumber; - // check the ZoneNummber is valid - if (zoneNumber < 0 || zoneNumber > 60) { - return null; - } - - var k0 = 0.9996; - var a = 6378137.0; //ellip.radius; - var eccSquared = 0.00669438; //ellip.eccsq; - var eccPrimeSquared; - var e1 = (1 - Math.sqrt(1 - eccSquared)) / (1 + Math.sqrt(1 - eccSquared)); - var N1, T1, C1, R1, D, M; - var LongOrigin; - var mu, phi1Rad; - - // remove 500,000 meter offset for longitude - var x = UTMEasting - 500000.0; - var y = UTMNorthing; - - // We must know somehow if we are in the Northern or Southern - // hemisphere, this is the only time we use the letter So even - // if the Zone letter isn't exactly correct it should indicate - // the hemisphere correctly - if (zoneLetter < 'N') { - y -= 10000000.0; // remove 10,000,000 meter offset used - // for southern hemisphere - } - - // There are 60 zones with zone 1 being at West -180 to -174 - LongOrigin = (zoneNumber - 1) * 6 - 180 + 3; // +3 puts origin - // in middle of - // zone - - eccPrimeSquared = (eccSquared) / (1 - eccSquared); - - M = y / k0; - mu = M / (a * (1 - eccSquared / 4 - 3 * eccSquared * eccSquared / 64 - 5 * eccSquared * eccSquared * eccSquared / 256)); - - phi1Rad = mu + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * mu) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * mu) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * mu); - // double phi1 = ProjMath.radToDeg(phi1Rad); - - N1 = a / Math.sqrt(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad)); - T1 = Math.tan(phi1Rad) * Math.tan(phi1Rad); - C1 = eccPrimeSquared * Math.cos(phi1Rad) * Math.cos(phi1Rad); - R1 = a * (1 - eccSquared) / Math.pow(1 - eccSquared * Math.sin(phi1Rad) * Math.sin(phi1Rad), 1.5); - D = x / (N1 * k0); - - var lat = phi1Rad - (N1 * Math.tan(phi1Rad) / R1) * (D * D / 2 - (5 + 3 * T1 + 10 * C1 - 4 * C1 * C1 - 9 * eccPrimeSquared) * D * D * D * D / 24 + (61 + 90 * T1 + 298 * C1 + 45 * T1 * T1 - 252 * eccPrimeSquared - 3 * C1 * C1) * D * D * D * D * D * D / 720); - lat = radToDeg(lat); - - var lon = (D - (1 + 2 * T1 + C1) * D * D * D / 6 + (5 - 2 * C1 + 28 * T1 - 3 * C1 * C1 + 8 * eccPrimeSquared + 24 * T1 * T1) * D * D * D * D * D / 120) / Math.cos(phi1Rad); - lon = LongOrigin + radToDeg(lon); - - var result; - if (utm.accuracy) { - var topRight = UTMtoLL({ - northing: utm.northing + utm.accuracy, - easting: utm.easting + utm.accuracy, - zoneLetter: utm.zoneLetter, - zoneNumber: utm.zoneNumber - }); - result = { - top: topRight.lat, - right: topRight.lon, - bottom: lat, - left: lon - }; - } - else { - result = { - lat: lat, - lon: lon - }; - } - return result; - } - - /** - * Calculates the MGRS letter designator for the given latitude. - * - * @private - * @param {number} lat The latitude in WGS84 to get the letter designator - * for. - * @return {char} The letter designator. - */ - function getLetterDesignator(lat) { - //This is here as an error flag to show that the Latitude is - //outside MGRS limits - var LetterDesignator = 'Z'; - - if ((84 >= lat) && (lat >= 72)) { - LetterDesignator = 'X'; - } - else if ((72 > lat) && (lat >= 64)) { - LetterDesignator = 'W'; - } - else if ((64 > lat) && (lat >= 56)) { - LetterDesignator = 'V'; - } - else if ((56 > lat) && (lat >= 48)) { - LetterDesignator = 'U'; - } - else if ((48 > lat) && (lat >= 40)) { - LetterDesignator = 'T'; - } - else if ((40 > lat) && (lat >= 32)) { - LetterDesignator = 'S'; - } - else if ((32 > lat) && (lat >= 24)) { - LetterDesignator = 'R'; - } - else if ((24 > lat) && (lat >= 16)) { - LetterDesignator = 'Q'; - } - else if ((16 > lat) && (lat >= 8)) { - LetterDesignator = 'P'; - } - else if ((8 > lat) && (lat >= 0)) { - LetterDesignator = 'N'; - } - else if ((0 > lat) && (lat >= -8)) { - LetterDesignator = 'M'; - } - else if ((-8 > lat) && (lat >= -16)) { - LetterDesignator = 'L'; - } - else if ((-16 > lat) && (lat >= -24)) { - LetterDesignator = 'K'; - } - else if ((-24 > lat) && (lat >= -32)) { - LetterDesignator = 'J'; - } - else if ((-32 > lat) && (lat >= -40)) { - LetterDesignator = 'H'; - } - else if ((-40 > lat) && (lat >= -48)) { - LetterDesignator = 'G'; - } - else if ((-48 > lat) && (lat >= -56)) { - LetterDesignator = 'F'; - } - else if ((-56 > lat) && (lat >= -64)) { - LetterDesignator = 'E'; - } - else if ((-64 > lat) && (lat >= -72)) { - LetterDesignator = 'D'; - } - else if ((-72 > lat) && (lat >= -80)) { - LetterDesignator = 'C'; - } - return LetterDesignator; - } - - /** - * Encodes a UTM location as MGRS string. - * - * @private - * @param {object} utm An object literal with easting, northing, - * zoneLetter, zoneNumber - * @param {number} accuracy Accuracy in digits (1-5). - * @return {string} MGRS string for the given UTM location. - */ - function encode(utm, accuracy) { - // prepend with leading zeroes - var seasting = "00000" + utm.easting, - snorthing = "00000" + utm.northing; - - return utm.zoneNumber + utm.zoneLetter + get100kID(utm.easting, utm.northing, utm.zoneNumber) + seasting.substr(seasting.length - 5, accuracy) + snorthing.substr(snorthing.length - 5, accuracy); - } - - /** - * Get the two letter 100k designator for a given UTM easting, - * northing and zone number value. - * - * @private - * @param {number} easting - * @param {number} northing - * @param {number} zoneNumber - * @return the two letter 100k designator for the given UTM location. - */ - function get100kID(easting, northing, zoneNumber) { - var setParm = get100kSetForZone(zoneNumber); - var setColumn = Math.floor(easting / 100000); - var setRow = Math.floor(northing / 100000) % 20; - return getLetter100kID(setColumn, setRow, setParm); - } - - /** - * Given a UTM zone number, figure out the MGRS 100K set it is in. - * - * @private - * @param {number} i An UTM zone number. - * @return {number} the 100k set the UTM zone is in. - */ - function get100kSetForZone(i) { - var setParm = i % NUM_100K_SETS; - if (setParm === 0) { - setParm = NUM_100K_SETS; - } - - return setParm; - } - - /** - * Get the two-letter MGRS 100k designator given information - * translated from the UTM northing, easting and zone number. - * - * @private - * @param {number} column the column index as it relates to the MGRS - * 100k set spreadsheet, created from the UTM easting. - * Values are 1-8. - * @param {number} row the row index as it relates to the MGRS 100k set - * spreadsheet, created from the UTM northing value. Values - * are from 0-19. - * @param {number} parm the set block, as it relates to the MGRS 100k set - * spreadsheet, created from the UTM zone. Values are from - * 1-60. - * @return two letter MGRS 100k code. - */ - function getLetter100kID(column, row, parm) { - // colOrigin and rowOrigin are the letters at the origin of the set - var index = parm - 1; - var colOrigin = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(index); - var rowOrigin = SET_ORIGIN_ROW_LETTERS.charCodeAt(index); - - // colInt and rowInt are the letters to build to return - var colInt = colOrigin + column - 1; - var rowInt = rowOrigin + row; - var rollover = false; - - if (colInt > Z) { - colInt = colInt - Z + A - 1; - rollover = true; - } - - if (colInt === I || (colOrigin < I && colInt > I) || ((colInt > I || colOrigin < I) && rollover)) { - colInt++; - } - - if (colInt === O || (colOrigin < O && colInt > O) || ((colInt > O || colOrigin < O) && rollover)) { - colInt++; - - if (colInt === I) { - colInt++; - } - } - - if (colInt > Z) { - colInt = colInt - Z + A - 1; - } - - if (rowInt > V) { - rowInt = rowInt - V + A - 1; - rollover = true; - } - else { - rollover = false; - } - - if (((rowInt === I) || ((rowOrigin < I) && (rowInt > I))) || (((rowInt > I) || (rowOrigin < I)) && rollover)) { - rowInt++; - } - - if (((rowInt === O) || ((rowOrigin < O) && (rowInt > O))) || (((rowInt > O) || (rowOrigin < O)) && rollover)) { - rowInt++; - - if (rowInt === I) { - rowInt++; - } - } - - if (rowInt > V) { - rowInt = rowInt - V + A - 1; - } - - var twoLetter = String.fromCharCode(colInt) + String.fromCharCode(rowInt); - return twoLetter; - } - - /** - * Decode the UTM parameters from a MGRS string. - * - * @private - * @param {string} mgrsString an UPPERCASE coordinate string is expected. - * @return {object} An object literal with easting, northing, zoneLetter, - * zoneNumber and accuracy (in meters) properties. - */ - function decode(mgrsString) { - - if (mgrsString && mgrsString.length === 0) { - throw ("MGRSPoint coverting from nothing"); - } - - var length = mgrsString.length; - - var hunK = null; - var sb = ""; - var testChar; - var i = 0; - - // get Zone number - while (!(/[A-Z]/).test(testChar = mgrsString.charAt(i))) { - if (i >= 2) { - throw ("MGRSPoint bad conversion from: " + mgrsString); - } - sb += testChar; - i++; - } - - var zoneNumber = parseInt(sb, 10); - - if (i === 0 || i + 3 > length) { - // A good MGRS string has to be 4-5 digits long, - // ##AAA/#AAA at least. - throw ("MGRSPoint bad conversion from: " + mgrsString); - } - - var zoneLetter = mgrsString.charAt(i++); - - // Should we check the zone letter here? Why not. - if (zoneLetter <= 'A' || zoneLetter === 'B' || zoneLetter === 'Y' || zoneLetter >= 'Z' || zoneLetter === 'I' || zoneLetter === 'O') { - throw ("MGRSPoint zone letter " + zoneLetter + " not handled: " + mgrsString); - } - - hunK = mgrsString.substring(i, i += 2); - - var set = get100kSetForZone(zoneNumber); - - var east100k = getEastingFromChar(hunK.charAt(0), set); - var north100k = getNorthingFromChar(hunK.charAt(1), set); - - // We have a bug where the northing may be 2000000 too low. - // How - // do we know when to roll over? - - while (north100k < getMinNorthing(zoneLetter)) { - north100k += 2000000; - } - - // calculate the char index for easting/northing separator - var remainder = length - i; - - if (remainder % 2 !== 0) { - throw ("MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters" + mgrsString); - } - - var sep = remainder / 2; - - var sepEasting = 0.0; - var sepNorthing = 0.0; - var accuracyBonus, sepEastingString, sepNorthingString, easting, northing; - if (sep > 0) { - accuracyBonus = 100000.0 / Math.pow(10, sep); - sepEastingString = mgrsString.substring(i, i + sep); - sepEasting = parseFloat(sepEastingString) * accuracyBonus; - sepNorthingString = mgrsString.substring(i + sep); - sepNorthing = parseFloat(sepNorthingString) * accuracyBonus; - } - - easting = sepEasting + east100k; - northing = sepNorthing + north100k; - - return { - easting: easting, - northing: northing, - zoneLetter: zoneLetter, - zoneNumber: zoneNumber, - accuracy: accuracyBonus - }; - } - - /** - * Given the first letter from a two-letter MGRS 100k zone, and given the - * MGRS table set for the zone number, figure out the easting value that - * should be added to the other, secondary easting value. - * - * @private - * @param {char} e The first letter from a two-letter MGRS 100´k zone. - * @param {number} set The MGRS table set for the zone number. - * @return {number} The easting value for the given letter and set. - */ - function getEastingFromChar(e, set) { - // colOrigin is the letter at the origin of the set for the - // column - var curCol = SET_ORIGIN_COLUMN_LETTERS.charCodeAt(set - 1); - var eastingValue = 100000.0; - var rewindMarker = false; - - while (curCol !== e.charCodeAt(0)) { - curCol++; - if (curCol === I) { - curCol++; - } - if (curCol === O) { - curCol++; - } - if (curCol > Z) { - if (rewindMarker) { - throw ("Bad character: " + e); - } - curCol = A; - rewindMarker = true; - } - eastingValue += 100000.0; - } - - return eastingValue; - } - - /** - * Given the second letter from a two-letter MGRS 100k zone, and given the - * MGRS table set for the zone number, figure out the northing value that - * should be added to the other, secondary northing value. You have to - * remember that Northings are determined from the equator, and the vertical - * cycle of letters mean a 2000000 additional northing meters. This happens - * approx. every 18 degrees of latitude. This method does *NOT* count any - * additional northings. You have to figure out how many 2000000 meters need - * to be added for the zone letter of the MGRS coordinate. - * - * @private - * @param {char} n Second letter of the MGRS 100k zone - * @param {number} set The MGRS table set number, which is dependent on the - * UTM zone number. - * @return {number} The northing value for the given letter and set. - */ - function getNorthingFromChar(n, set) { - - if (n > 'V') { - throw ("MGRSPoint given invalid Northing " + n); - } - - // rowOrigin is the letter at the origin of the set for the - // column - var curRow = SET_ORIGIN_ROW_LETTERS.charCodeAt(set - 1); - var northingValue = 0.0; - var rewindMarker = false; - - while (curRow !== n.charCodeAt(0)) { - curRow++; - if (curRow === I) { - curRow++; - } - if (curRow === O) { - curRow++; - } - // fixing a bug making whole application hang in this loop - // when 'n' is a wrong character - if (curRow > V) { - if (rewindMarker) { // making sure that this loop ends - throw ("Bad character: " + n); - } - curRow = A; - rewindMarker = true; - } - northingValue += 100000.0; - } - - return northingValue; - } - - /** - * The function getMinNorthing returns the minimum northing value of a MGRS - * zone. - * - * Ported from Geotrans' c Lattitude_Band_Value structure table. - * - * @private - * @param {char} zoneLetter The MGRS zone to get the min northing for. - * @return {number} - */ - function getMinNorthing(zoneLetter) { - var northing; - switch (zoneLetter) { - case 'C': - northing = 1100000.0; - break; - case 'D': - northing = 2000000.0; - break; - case 'E': - northing = 2800000.0; - break; - case 'F': - northing = 3700000.0; - break; - case 'G': - northing = 4600000.0; - break; - case 'H': - northing = 5500000.0; - break; - case 'J': - northing = 6400000.0; - break; - case 'K': - northing = 7300000.0; - break; - case 'L': - northing = 8200000.0; - break; - case 'M': - northing = 9100000.0; - break; - case 'N': - northing = 0.0; - break; - case 'P': - northing = 800000.0; - break; - case 'Q': - northing = 1700000.0; - break; - case 'R': - northing = 2600000.0; - break; - case 'S': - northing = 3500000.0; - break; - case 'T': - northing = 4400000.0; - break; - case 'U': - northing = 5300000.0; - break; - case 'V': - northing = 6200000.0; - break; - case 'W': - northing = 7000000.0; - break; - case 'X': - northing = 7900000.0; - break; - default: - northing = -1.0; - } - if (northing >= 0.0) { - return northing; - } - else { - throw ("Invalid zone letter: " + zoneLetter); - } - - } - - function Point(x, y, z) { - if (!(this instanceof Point)) { - return new Point(x, y, z); - } - if (Array.isArray(x)) { - this.x = x[0]; - this.y = x[1]; - this.z = x[2] || 0.0; - } else if(typeof x === 'object') { - this.x = x.x; - this.y = x.y; - this.z = x.z || 0.0; - } else if (typeof x === 'string' && typeof y === 'undefined') { - var coords = x.split(','); - this.x = parseFloat(coords[0], 10); - this.y = parseFloat(coords[1], 10); - this.z = parseFloat(coords[2], 10) || 0.0; - } else { - this.x = x; - this.y = y; - this.z = z || 0.0; - } - console.warn('proj4.Point will be removed in version 3, use proj4.toPoint'); - } - - Point.fromMGRS = function(mgrsStr) { - return new Point(toPoint$1(mgrsStr)); - }; - Point.prototype.toMGRS = function(accuracy) { - return forward$1([this.x, this.y], accuracy); - }; - - var version = "2.4.4-alpha"; - - var C00 = 1; - var C02 = 0.25; - var C04 = 0.046875; - var C06 = 0.01953125; - var C08 = 0.01068115234375; - var C22 = 0.75; - var C44 = 0.46875; - var C46 = 0.01302083333333333333; - var C48 = 0.00712076822916666666; - var C66 = 0.36458333333333333333; - var C68 = 0.00569661458333333333; - var C88 = 0.3076171875; - - var pj_enfn = function(es) { - var en = []; - en[0] = C00 - es * (C02 + es * (C04 + es * (C06 + es * C08))); - en[1] = es * (C22 - es * (C04 + es * (C06 + es * C08))); - var t = es * es; - en[2] = t * (C44 - es * (C46 + es * C48)); - t *= es; - en[3] = t * (C66 - es * C68); - en[4] = t * es * C88; - return en; - }; - - var pj_mlfn = function(phi, sphi, cphi, en) { - cphi *= sphi; - sphi *= sphi; - return (en[0] * phi - cphi * (en[1] + sphi * (en[2] + sphi * (en[3] + sphi * en[4])))); - }; - - var MAX_ITER = 20; - - var pj_inv_mlfn = function(arg, es, en) { - var k = 1 / (1 - es); - var phi = arg; - for (var i = MAX_ITER; i; --i) { /* rarely goes over 2 iterations */ - var s = Math.sin(phi); - var t = 1 - es * s * s; - //t = this.pj_mlfn(phi, s, Math.cos(phi), en) - arg; - //phi -= t * (t * Math.sqrt(t)) * k; - t = (pj_mlfn(phi, s, Math.cos(phi), en) - arg) * (t * Math.sqrt(t)) * k; - phi -= t; - if (Math.abs(t) < EPSLN) { - return phi; - } - } - //..reportError("cass:pj_inv_mlfn: Convergence error"); - return phi; - }; - - // Heavily based on this tmerc projection implementation - // https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/tmerc.js - - function init$2() { - this.x0 = this.x0 !== undefined ? this.x0 : 0; - this.y0 = this.y0 !== undefined ? this.y0 : 0; - this.long0 = this.long0 !== undefined ? this.long0 : 0; - this.lat0 = this.lat0 !== undefined ? this.lat0 : 0; - - if (this.es) { - this.en = pj_enfn(this.es); - this.ml0 = pj_mlfn(this.lat0, Math.sin(this.lat0), Math.cos(this.lat0), this.en); - } - } - - /** - Transverse Mercator Forward - long/lat to x/y - long/lat in radians - */ - function forward$2(p) { - var lon = p.x; - var lat = p.y; - - var delta_lon = adjust_lon(lon - this.long0); - var con; - var x, y; - var sin_phi = Math.sin(lat); - var cos_phi = Math.cos(lat); - - if (!this.es) { - var b = cos_phi * Math.sin(delta_lon); - - if ((Math.abs(Math.abs(b) - 1)) < EPSLN) { - return (93); - } - else { - x = 0.5 * this.a * this.k0 * Math.log((1 + b) / (1 - b)) + this.x0; - y = cos_phi * Math.cos(delta_lon) / Math.sqrt(1 - Math.pow(b, 2)); - b = Math.abs(y); - - if (b >= 1) { - if ((b - 1) > EPSLN) { - return (93); - } - else { - y = 0; - } - } - else { - y = Math.acos(y); - } - - if (lat < 0) { - y = -y; - } - - y = this.a * this.k0 * (y - this.lat0) + this.y0; - } - } - else { - var al = cos_phi * delta_lon; - var als = Math.pow(al, 2); - var c = this.ep2 * Math.pow(cos_phi, 2); - var cs = Math.pow(c, 2); - var tq = Math.abs(cos_phi) > EPSLN ? Math.tan(lat) : 0; - var t = Math.pow(tq, 2); - var ts = Math.pow(t, 2); - con = 1 - this.es * Math.pow(sin_phi, 2); - al = al / Math.sqrt(con); - var ml = pj_mlfn(lat, sin_phi, cos_phi, this.en); - - x = this.a * (this.k0 * al * (1 + - als / 6 * (1 - t + c + - als / 20 * (5 - 18 * t + ts + 14 * c - 58 * t * c + - als / 42 * (61 + 179 * ts - ts * t - 479 * t))))) + - this.x0; - - y = this.a * (this.k0 * (ml - this.ml0 + - sin_phi * delta_lon * al / 2 * (1 + - als / 12 * (5 - t + 9 * c + 4 * cs + - als / 30 * (61 + ts - 58 * t + 270 * c - 330 * t * c + - als / 56 * (1385 + 543 * ts - ts * t - 3111 * t)))))) + - this.y0; - } - - p.x = x; - p.y = y; - - return p; - } - - /** - Transverse Mercator Inverse - x/y to long/lat - */ - function inverse$2(p) { - var con, phi; - var lat, lon; - var x = (p.x - this.x0) * (1 / this.a); - var y = (p.y - this.y0) * (1 / this.a); - - if (!this.es) { - var f = Math.exp(x / this.k0); - var g = 0.5 * (f - 1 / f); - var temp = this.lat0 + y / this.k0; - var h = Math.cos(temp); - con = Math.sqrt((1 - Math.pow(h, 2)) / (1 + Math.pow(g, 2))); - lat = Math.asin(con); - - if (y < 0) { - lat = -lat; - } - - if ((g === 0) && (h === 0)) { - lon = 0; - } - else { - lon = adjust_lon(Math.atan2(g, h) + this.long0); - } - } - else { // ellipsoidal form - con = this.ml0 + y / this.k0; - phi = pj_inv_mlfn(con, this.es, this.en); - - if (Math.abs(phi) < HALF_PI) { - var sin_phi = Math.sin(phi); - var cos_phi = Math.cos(phi); - var tan_phi = Math.abs(cos_phi) > EPSLN ? Math.tan(phi) : 0; - var c = this.ep2 * Math.pow(cos_phi, 2); - var cs = Math.pow(c, 2); - var t = Math.pow(tan_phi, 2); - var ts = Math.pow(t, 2); - con = 1 - this.es * Math.pow(sin_phi, 2); - var d = x * Math.sqrt(con) / this.k0; - var ds = Math.pow(d, 2); - con = con * tan_phi; - - lat = phi - (con * ds / (1 - this.es)) * 0.5 * (1 - - ds / 12 * (5 + 3 * t - 9 * c * t + c - 4 * cs - - ds / 30 * (61 + 90 * t - 252 * c * t + 45 * ts + 46 * c - - ds / 56 * (1385 + 3633 * t + 4095 * ts + 1574 * ts * t)))); - - lon = adjust_lon(this.long0 + (d * (1 - - ds / 6 * (1 + 2 * t + c - - ds / 20 * (5 + 28 * t + 24 * ts + 8 * c * t + 6 * c - - ds / 42 * (61 + 662 * t + 1320 * ts + 720 * ts * t)))) / cos_phi)); - } - else { - lat = HALF_PI * sign(y); - lon = 0; - } - } - - p.x = lon; - p.y = lat; - - return p; - } - - var names$3 = ["Transverse_Mercator", "Transverse Mercator", "tmerc"]; - var tmerc = { - init: init$2, - forward: forward$2, - inverse: inverse$2, - names: names$3 - }; - - var sinh = function(x) { - var r = Math.exp(x); - r = (r - 1 / r) / 2; - return r; - }; - - var hypot = function(x, y) { - x = Math.abs(x); - y = Math.abs(y); - var a = Math.max(x, y); - var b = Math.min(x, y) / (a ? a : 1); - - return a * Math.sqrt(1 + Math.pow(b, 2)); - }; - - var log1py = function(x) { - var y = 1 + x; - var z = y - 1; - - return z === 0 ? x : x * Math.log(y) / z; - }; - - var asinhy = function(x) { - var y = Math.abs(x); - y = log1py(y * (1 + y / (hypot(1, y) + 1))); - - return x < 0 ? -y : y; - }; - - var gatg = function(pp, B) { - var cos_2B = 2 * Math.cos(2 * B); - var i = pp.length - 1; - var h1 = pp[i]; - var h2 = 0; - var h; - - while (--i >= 0) { - h = -h2 + cos_2B * h1 + pp[i]; - h2 = h1; - h1 = h; - } - - return (B + h * Math.sin(2 * B)); - }; - - var clens = function(pp, arg_r) { - var r = 2 * Math.cos(arg_r); - var i = pp.length - 1; - var hr1 = pp[i]; - var hr2 = 0; - var hr; - - while (--i >= 0) { - hr = -hr2 + r * hr1 + pp[i]; - hr2 = hr1; - hr1 = hr; - } - - return Math.sin(arg_r) * hr; - }; - - var cosh = function(x) { - var r = Math.exp(x); - r = (r + 1 / r) / 2; - return r; - }; - - var clens_cmplx = function(pp, arg_r, arg_i) { - var sin_arg_r = Math.sin(arg_r); - var cos_arg_r = Math.cos(arg_r); - var sinh_arg_i = sinh(arg_i); - var cosh_arg_i = cosh(arg_i); - var r = 2 * cos_arg_r * cosh_arg_i; - var i = -2 * sin_arg_r * sinh_arg_i; - var j = pp.length - 1; - var hr = pp[j]; - var hi1 = 0; - var hr1 = 0; - var hi = 0; - var hr2; - var hi2; - - while (--j >= 0) { - hr2 = hr1; - hi2 = hi1; - hr1 = hr; - hi1 = hi; - hr = -hr2 + r * hr1 - i * hi1 + pp[j]; - hi = -hi2 + i * hr1 + r * hi1; - } - - r = sin_arg_r * cosh_arg_i; - i = cos_arg_r * sinh_arg_i; - - return [r * hr - i * hi, r * hi + i * hr]; - }; - - // Heavily based on this etmerc projection implementation - // https://github.com/mbloch/mapshaper-proj/blob/master/src/projections/etmerc.js - - function init$3() { - if (this.es === undefined || this.es <= 0) { - throw new Error('incorrect elliptical usage'); - } - - this.x0 = this.x0 !== undefined ? this.x0 : 0; - this.y0 = this.y0 !== undefined ? this.y0 : 0; - this.long0 = this.long0 !== undefined ? this.long0 : 0; - this.lat0 = this.lat0 !== undefined ? this.lat0 : 0; - - this.cgb = []; - this.cbg = []; - this.utg = []; - this.gtu = []; - - var f = this.es / (1 + Math.sqrt(1 - this.es)); - var n = f / (2 - f); - var np = n; - - this.cgb[0] = n * (2 + n * (-2 / 3 + n * (-2 + n * (116 / 45 + n * (26 / 45 + n * (-2854 / 675 )))))); - this.cbg[0] = n * (-2 + n * ( 2 / 3 + n * ( 4 / 3 + n * (-82 / 45 + n * (32 / 45 + n * (4642 / 4725)))))); - - np = np * n; - this.cgb[1] = np * (7 / 3 + n * (-8 / 5 + n * (-227 / 45 + n * (2704 / 315 + n * (2323 / 945))))); - this.cbg[1] = np * (5 / 3 + n * (-16 / 15 + n * ( -13 / 9 + n * (904 / 315 + n * (-1522 / 945))))); - - np = np * n; - this.cgb[2] = np * (56 / 15 + n * (-136 / 35 + n * (-1262 / 105 + n * (73814 / 2835)))); - this.cbg[2] = np * (-26 / 15 + n * (34 / 21 + n * (8 / 5 + n * (-12686 / 2835)))); - - np = np * n; - this.cgb[3] = np * (4279 / 630 + n * (-332 / 35 + n * (-399572 / 14175))); - this.cbg[3] = np * (1237 / 630 + n * (-12 / 5 + n * ( -24832 / 14175))); - - np = np * n; - this.cgb[4] = np * (4174 / 315 + n * (-144838 / 6237)); - this.cbg[4] = np * (-734 / 315 + n * (109598 / 31185)); - - np = np * n; - this.cgb[5] = np * (601676 / 22275); - this.cbg[5] = np * (444337 / 155925); - - np = Math.pow(n, 2); - this.Qn = this.k0 / (1 + n) * (1 + np * (1 / 4 + np * (1 / 64 + np / 256))); - - this.utg[0] = n * (-0.5 + n * ( 2 / 3 + n * (-37 / 96 + n * ( 1 / 360 + n * (81 / 512 + n * (-96199 / 604800)))))); - this.gtu[0] = n * (0.5 + n * (-2 / 3 + n * (5 / 16 + n * (41 / 180 + n * (-127 / 288 + n * (7891 / 37800)))))); - - this.utg[1] = np * (-1 / 48 + n * (-1 / 15 + n * (437 / 1440 + n * (-46 / 105 + n * (1118711 / 3870720))))); - this.gtu[1] = np * (13 / 48 + n * (-3 / 5 + n * (557 / 1440 + n * (281 / 630 + n * (-1983433 / 1935360))))); - - np = np * n; - this.utg[2] = np * (-17 / 480 + n * (37 / 840 + n * (209 / 4480 + n * (-5569 / 90720 )))); - this.gtu[2] = np * (61 / 240 + n * (-103 / 140 + n * (15061 / 26880 + n * (167603 / 181440)))); - - np = np * n; - this.utg[3] = np * (-4397 / 161280 + n * (11 / 504 + n * (830251 / 7257600))); - this.gtu[3] = np * (49561 / 161280 + n * (-179 / 168 + n * (6601661 / 7257600))); - - np = np * n; - this.utg[4] = np * (-4583 / 161280 + n * (108847 / 3991680)); - this.gtu[4] = np * (34729 / 80640 + n * (-3418889 / 1995840)); - - np = np * n; - this.utg[5] = np * (-20648693 / 638668800); - this.gtu[5] = np * (212378941 / 319334400); - - var Z = gatg(this.cbg, this.lat0); - this.Zb = -this.Qn * (Z + clens(this.gtu, 2 * Z)); - } - - function forward$3(p) { - var Ce = adjust_lon(p.x - this.long0); - var Cn = p.y; - - Cn = gatg(this.cbg, Cn); - var sin_Cn = Math.sin(Cn); - var cos_Cn = Math.cos(Cn); - var sin_Ce = Math.sin(Ce); - var cos_Ce = Math.cos(Ce); - - Cn = Math.atan2(sin_Cn, cos_Ce * cos_Cn); - Ce = Math.atan2(sin_Ce * cos_Cn, hypot(sin_Cn, cos_Cn * cos_Ce)); - Ce = asinhy(Math.tan(Ce)); - - var tmp = clens_cmplx(this.gtu, 2 * Cn, 2 * Ce); - - Cn = Cn + tmp[0]; - Ce = Ce + tmp[1]; - - var x; - var y; - - if (Math.abs(Ce) <= 2.623395162778) { - x = this.a * (this.Qn * Ce) + this.x0; - y = this.a * (this.Qn * Cn + this.Zb) + this.y0; - } - else { - x = Infinity; - y = Infinity; - } - - p.x = x; - p.y = y; - - return p; - } - - function inverse$3(p) { - var Ce = (p.x - this.x0) * (1 / this.a); - var Cn = (p.y - this.y0) * (1 / this.a); - - Cn = (Cn - this.Zb) / this.Qn; - Ce = Ce / this.Qn; - - var lon; - var lat; - - if (Math.abs(Ce) <= 2.623395162778) { - var tmp = clens_cmplx(this.utg, 2 * Cn, 2 * Ce); - - Cn = Cn + tmp[0]; - Ce = Ce + tmp[1]; - Ce = Math.atan(sinh(Ce)); - - var sin_Cn = Math.sin(Cn); - var cos_Cn = Math.cos(Cn); - var sin_Ce = Math.sin(Ce); - var cos_Ce = Math.cos(Ce); - - Cn = Math.atan2(sin_Cn * cos_Ce, hypot(sin_Ce, cos_Ce * cos_Cn)); - Ce = Math.atan2(sin_Ce, cos_Ce * cos_Cn); - - lon = adjust_lon(Ce + this.long0); - lat = gatg(this.cgb, Cn); - } - else { - lon = Infinity; - lat = Infinity; - } - - p.x = lon; - p.y = lat; - - return p; - } - - var names$4 = ["Extended_Transverse_Mercator", "Extended Transverse Mercator", "etmerc"]; - var etmerc = { - init: init$3, - forward: forward$3, - inverse: inverse$3, - names: names$4 - }; - - var adjust_zone = function(zone, lon) { - if (zone === undefined) { - zone = Math.floor((adjust_lon(lon) + Math.PI) * 30 / Math.PI) + 1; - - if (zone < 0) { - return 0; - } else if (zone > 60) { - return 60; - } - } - return zone; - }; - - var dependsOn = 'etmerc'; - function init$4() { - var zone = adjust_zone(this.zone, this.long0); - if (zone === undefined) { - throw new Error('unknown utm zone'); - } - this.lat0 = 0; - this.long0 = ((6 * Math.abs(zone)) - 183) * D2R; - this.x0 = 500000; - this.y0 = this.utmSouth ? 10000000 : 0; - this.k0 = 0.9996; - - etmerc.init.apply(this); - this.forward = etmerc.forward; - this.inverse = etmerc.inverse; - } - - var names$5 = ["Universal Transverse Mercator System", "utm"]; - var utm = { - init: init$4, - names: names$5, - dependsOn: dependsOn - }; - - var srat = function(esinp, exp) { - return (Math.pow((1 - esinp) / (1 + esinp), exp)); - }; - - var MAX_ITER$1 = 20; - function init$6() { - var sphi = Math.sin(this.lat0); - var cphi = Math.cos(this.lat0); - cphi *= cphi; - this.rc = Math.sqrt(1 - this.es) / (1 - this.es * sphi * sphi); - this.C = Math.sqrt(1 + this.es * cphi * cphi / (1 - this.es)); - this.phic0 = Math.asin(sphi / this.C); - this.ratexp = 0.5 * this.C * this.e; - this.K = Math.tan(0.5 * this.phic0 + FORTPI) / (Math.pow(Math.tan(0.5 * this.lat0 + FORTPI), this.C) * srat(this.e * sphi, this.ratexp)); - } - - function forward$5(p) { - var lon = p.x; - var lat = p.y; - - p.y = 2 * Math.atan(this.K * Math.pow(Math.tan(0.5 * lat + FORTPI), this.C) * srat(this.e * Math.sin(lat), this.ratexp)) - HALF_PI; - p.x = this.C * lon; - return p; - } - - function inverse$5(p) { - var DEL_TOL = 1e-14; - var lon = p.x / this.C; - var lat = p.y; - var num = Math.pow(Math.tan(0.5 * lat + FORTPI) / this.K, 1 / this.C); - for (var i = MAX_ITER$1; i > 0; --i) { - lat = 2 * Math.atan(num * srat(this.e * Math.sin(p.y), - 0.5 * this.e)) - HALF_PI; - if (Math.abs(lat - p.y) < DEL_TOL) { - break; - } - p.y = lat; - } - /* convergence failed */ - if (!i) { - return null; - } - p.x = lon; - p.y = lat; - return p; - } - - var names$7 = ["gauss"]; - var gauss = { - init: init$6, - forward: forward$5, - inverse: inverse$5, - names: names$7 - }; - - function init$5() { - gauss.init.apply(this); - if (!this.rc) { - return; - } - this.sinc0 = Math.sin(this.phic0); - this.cosc0 = Math.cos(this.phic0); - this.R2 = 2 * this.rc; - if (!this.title) { - this.title = "Oblique Stereographic Alternative"; - } - } - - function forward$4(p) { - var sinc, cosc, cosl, k; - p.x = adjust_lon(p.x - this.long0); - gauss.forward.apply(this, [p]); - sinc = Math.sin(p.y); - cosc = Math.cos(p.y); - cosl = Math.cos(p.x); - k = this.k0 * this.R2 / (1 + this.sinc0 * sinc + this.cosc0 * cosc * cosl); - p.x = k * cosc * Math.sin(p.x); - p.y = k * (this.cosc0 * sinc - this.sinc0 * cosc * cosl); - p.x = this.a * p.x + this.x0; - p.y = this.a * p.y + this.y0; - return p; - } - - function inverse$4(p) { - var sinc, cosc, lon, lat, rho; - p.x = (p.x - this.x0) / this.a; - p.y = (p.y - this.y0) / this.a; - - p.x /= this.k0; - p.y /= this.k0; - if ((rho = Math.sqrt(p.x * p.x + p.y * p.y))) { - var c = 2 * Math.atan2(rho, this.R2); - sinc = Math.sin(c); - cosc = Math.cos(c); - lat = Math.asin(cosc * this.sinc0 + p.y * sinc * this.cosc0 / rho); - lon = Math.atan2(p.x * sinc, rho * this.cosc0 * cosc - p.y * this.sinc0 * sinc); - } - else { - lat = this.phic0; - lon = 0; - } - - p.x = lon; - p.y = lat; - gauss.inverse.apply(this, [p]); - p.x = adjust_lon(p.x + this.long0); - return p; - } - - var names$6 = ["Stereographic_North_Pole", "Oblique_Stereographic", "Polar_Stereographic", "sterea","Oblique Stereographic Alternative"]; - var sterea = { - init: init$5, - forward: forward$4, - inverse: inverse$4, - names: names$6 - }; - - function ssfn_(phit, sinphi, eccen) { - sinphi *= eccen; - return (Math.tan(0.5 * (HALF_PI + phit)) * Math.pow((1 - sinphi) / (1 + sinphi), 0.5 * eccen)); - } - - function init$7() { - this.coslat0 = Math.cos(this.lat0); - this.sinlat0 = Math.sin(this.lat0); - if (this.sphere) { - if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { - this.k0 = 0.5 * (1 + sign(this.lat0) * Math.sin(this.lat_ts)); - } - } - else { - if (Math.abs(this.coslat0) <= EPSLN) { - if (this.lat0 > 0) { - //North pole - //trace('stere:north pole'); - this.con = 1; - } - else { - //South pole - //trace('stere:south pole'); - this.con = -1; - } - } - this.cons = Math.sqrt(Math.pow(1 + this.e, 1 + this.e) * Math.pow(1 - this.e, 1 - this.e)); - if (this.k0 === 1 && !isNaN(this.lat_ts) && Math.abs(this.coslat0) <= EPSLN) { - this.k0 = 0.5 * this.cons * msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)) / tsfnz(this.e, this.con * this.lat_ts, this.con * Math.sin(this.lat_ts)); - } - this.ms1 = msfnz(this.e, this.sinlat0, this.coslat0); - this.X0 = 2 * Math.atan(this.ssfn_(this.lat0, this.sinlat0, this.e)) - HALF_PI; - this.cosX0 = Math.cos(this.X0); - this.sinX0 = Math.sin(this.X0); - } - } - - // Stereographic forward equations--mapping lat,long to x,y - function forward$6(p) { - var lon = p.x; - var lat = p.y; - var sinlat = Math.sin(lat); - var coslat = Math.cos(lat); - var A, X, sinX, cosX, ts, rh; - var dlon = adjust_lon(lon - this.long0); - - if (Math.abs(Math.abs(lon - this.long0) - Math.PI) <= EPSLN && Math.abs(lat + this.lat0) <= EPSLN) { - //case of the origine point - //trace('stere:this is the origin point'); - p.x = NaN; - p.y = NaN; - return p; - } - if (this.sphere) { - //trace('stere:sphere case'); - A = 2 * this.k0 / (1 + this.sinlat0 * sinlat + this.coslat0 * coslat * Math.cos(dlon)); - p.x = this.a * A * coslat * Math.sin(dlon) + this.x0; - p.y = this.a * A * (this.coslat0 * sinlat - this.sinlat0 * coslat * Math.cos(dlon)) + this.y0; - return p; - } - else { - X = 2 * Math.atan(this.ssfn_(lat, sinlat, this.e)) - HALF_PI; - cosX = Math.cos(X); - sinX = Math.sin(X); - if (Math.abs(this.coslat0) <= EPSLN) { - ts = tsfnz(this.e, lat * this.con, this.con * sinlat); - rh = 2 * this.a * this.k0 * ts / this.cons; - p.x = this.x0 + rh * Math.sin(lon - this.long0); - p.y = this.y0 - this.con * rh * Math.cos(lon - this.long0); - //trace(p.toString()); - return p; - } - else if (Math.abs(this.sinlat0) < EPSLN) { - //Eq - //trace('stere:equateur'); - A = 2 * this.a * this.k0 / (1 + cosX * Math.cos(dlon)); - p.y = A * sinX; - } - else { - //other case - //trace('stere:normal case'); - A = 2 * this.a * this.k0 * this.ms1 / (this.cosX0 * (1 + this.sinX0 * sinX + this.cosX0 * cosX * Math.cos(dlon))); - p.y = A * (this.cosX0 * sinX - this.sinX0 * cosX * Math.cos(dlon)) + this.y0; - } - p.x = A * cosX * Math.sin(dlon) + this.x0; - } - //trace(p.toString()); - return p; - } - - //* Stereographic inverse equations--mapping x,y to lat/long - function inverse$6(p) { - p.x -= this.x0; - p.y -= this.y0; - var lon, lat, ts, ce, Chi; - var rh = Math.sqrt(p.x * p.x + p.y * p.y); - if (this.sphere) { - var c = 2 * Math.atan(rh / (0.5 * this.a * this.k0)); - lon = this.long0; - lat = this.lat0; - if (rh <= EPSLN) { - p.x = lon; - p.y = lat; - return p; - } - lat = Math.asin(Math.cos(c) * this.sinlat0 + p.y * Math.sin(c) * this.coslat0 / rh); - if (Math.abs(this.coslat0) < EPSLN) { - if (this.lat0 > 0) { - lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y)); - } - else { - lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); - } - } - else { - lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(c), rh * this.coslat0 * Math.cos(c) - p.y * this.sinlat0 * Math.sin(c))); - } - p.x = lon; - p.y = lat; - return p; - } - else { - if (Math.abs(this.coslat0) <= EPSLN) { - if (rh <= EPSLN) { - lat = this.lat0; - lon = this.long0; - p.x = lon; - p.y = lat; - //trace(p.toString()); - return p; - } - p.x *= this.con; - p.y *= this.con; - ts = rh * this.cons / (2 * this.a * this.k0); - lat = this.con * phi2z(this.e, ts); - lon = this.con * adjust_lon(this.con * this.long0 + Math.atan2(p.x, - 1 * p.y)); - } - else { - ce = 2 * Math.atan(rh * this.cosX0 / (2 * this.a * this.k0 * this.ms1)); - lon = this.long0; - if (rh <= EPSLN) { - Chi = this.X0; - } - else { - Chi = Math.asin(Math.cos(ce) * this.sinX0 + p.y * Math.sin(ce) * this.cosX0 / rh); - lon = adjust_lon(this.long0 + Math.atan2(p.x * Math.sin(ce), rh * this.cosX0 * Math.cos(ce) - p.y * this.sinX0 * Math.sin(ce))); - } - lat = -1 * phi2z(this.e, Math.tan(0.5 * (HALF_PI + Chi))); - } - } - p.x = lon; - p.y = lat; - - //trace(p.toString()); - return p; - - } - - var names$8 = ["stere", "Stereographic_South_Pole", "Polar Stereographic (variant B)"]; - var stere = { - init: init$7, - forward: forward$6, - inverse: inverse$6, - names: names$8, - ssfn_: ssfn_ - }; - - /* - references: - Formules et constantes pour le Calcul pour la - projection cylindrique conforme à axe oblique et pour la transformation entre - des systèmes de référence. - http://www.swisstopo.admin.ch/internet/swisstopo/fr/home/topics/survey/sys/refsys/switzerland.parsysrelated1.31216.downloadList.77004.DownloadFile.tmp/swissprojectionfr.pdf - */ - - function init$8() { - var phy0 = this.lat0; - this.lambda0 = this.long0; - var sinPhy0 = Math.sin(phy0); - var semiMajorAxis = this.a; - var invF = this.rf; - var flattening = 1 / invF; - var e2 = 2 * flattening - Math.pow(flattening, 2); - var e = this.e = Math.sqrt(e2); - this.R = this.k0 * semiMajorAxis * Math.sqrt(1 - e2) / (1 - e2 * Math.pow(sinPhy0, 2)); - this.alpha = Math.sqrt(1 + e2 / (1 - e2) * Math.pow(Math.cos(phy0), 4)); - this.b0 = Math.asin(sinPhy0 / this.alpha); - var k1 = Math.log(Math.tan(Math.PI / 4 + this.b0 / 2)); - var k2 = Math.log(Math.tan(Math.PI / 4 + phy0 / 2)); - var k3 = Math.log((1 + e * sinPhy0) / (1 - e * sinPhy0)); - this.K = k1 - this.alpha * k2 + this.alpha * e / 2 * k3; - } - - function forward$7(p) { - var Sa1 = Math.log(Math.tan(Math.PI / 4 - p.y / 2)); - var Sa2 = this.e / 2 * Math.log((1 + this.e * Math.sin(p.y)) / (1 - this.e * Math.sin(p.y))); - var S = -this.alpha * (Sa1 + Sa2) + this.K; - - // spheric latitude - var b = 2 * (Math.atan(Math.exp(S)) - Math.PI / 4); - - // spheric longitude - var I = this.alpha * (p.x - this.lambda0); - - // psoeudo equatorial rotation - var rotI = Math.atan(Math.sin(I) / (Math.sin(this.b0) * Math.tan(b) + Math.cos(this.b0) * Math.cos(I))); - - var rotB = Math.asin(Math.cos(this.b0) * Math.sin(b) - Math.sin(this.b0) * Math.cos(b) * Math.cos(I)); - - p.y = this.R / 2 * Math.log((1 + Math.sin(rotB)) / (1 - Math.sin(rotB))) + this.y0; - p.x = this.R * rotI + this.x0; - return p; - } - - function inverse$7(p) { - var Y = p.x - this.x0; - var X = p.y - this.y0; - - var rotI = Y / this.R; - var rotB = 2 * (Math.atan(Math.exp(X / this.R)) - Math.PI / 4); - - var b = Math.asin(Math.cos(this.b0) * Math.sin(rotB) + Math.sin(this.b0) * Math.cos(rotB) * Math.cos(rotI)); - var I = Math.atan(Math.sin(rotI) / (Math.cos(this.b0) * Math.cos(rotI) - Math.sin(this.b0) * Math.tan(rotB))); - - var lambda = this.lambda0 + I / this.alpha; - - var S = 0; - var phy = b; - var prevPhy = -1000; - var iteration = 0; - while (Math.abs(phy - prevPhy) > 0.0000001) { - if (++iteration > 20) { - //...reportError("omercFwdInfinity"); - return; - } - //S = Math.log(Math.tan(Math.PI / 4 + phy / 2)); - S = 1 / this.alpha * (Math.log(Math.tan(Math.PI / 4 + b / 2)) - this.K) + this.e * Math.log(Math.tan(Math.PI / 4 + Math.asin(this.e * Math.sin(phy)) / 2)); - prevPhy = phy; - phy = 2 * Math.atan(Math.exp(S)) - Math.PI / 2; - } - - p.x = lambda; - p.y = phy; - return p; - } - - var names$9 = ["somerc"]; - var somerc = { - init: init$8, - forward: forward$7, - inverse: inverse$7, - names: names$9 - }; - - /* Initialize the Oblique Mercator projection - ------------------------------------------*/ - function init$9() { - this.no_off = this.no_off || false; - this.no_rot = this.no_rot || false; - - if (isNaN(this.k0)) { - this.k0 = 1; - } - var sinlat = Math.sin(this.lat0); - var coslat = Math.cos(this.lat0); - var con = this.e * sinlat; - - this.bl = Math.sqrt(1 + this.es / (1 - this.es) * Math.pow(coslat, 4)); - this.al = this.a * this.bl * this.k0 * Math.sqrt(1 - this.es) / (1 - con * con); - var t0 = tsfnz(this.e, this.lat0, sinlat); - var dl = this.bl / coslat * Math.sqrt((1 - this.es) / (1 - con * con)); - if (dl * dl < 1) { - dl = 1; - } - var fl; - var gl; - if (!isNaN(this.longc)) { - //Central point and azimuth method - - if (this.lat0 >= 0) { - fl = dl + Math.sqrt(dl * dl - 1); - } - else { - fl = dl - Math.sqrt(dl * dl - 1); - } - this.el = fl * Math.pow(t0, this.bl); - gl = 0.5 * (fl - 1 / fl); - this.gamma0 = Math.asin(Math.sin(this.alpha) / dl); - this.long0 = this.longc - Math.asin(gl * Math.tan(this.gamma0)) / this.bl; - - } - else { - //2 points method - var t1 = tsfnz(this.e, this.lat1, Math.sin(this.lat1)); - var t2 = tsfnz(this.e, this.lat2, Math.sin(this.lat2)); - if (this.lat0 >= 0) { - this.el = (dl + Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl); - } - else { - this.el = (dl - Math.sqrt(dl * dl - 1)) * Math.pow(t0, this.bl); - } - var hl = Math.pow(t1, this.bl); - var ll = Math.pow(t2, this.bl); - fl = this.el / hl; - gl = 0.5 * (fl - 1 / fl); - var jl = (this.el * this.el - ll * hl) / (this.el * this.el + ll * hl); - var pl = (ll - hl) / (ll + hl); - var dlon12 = adjust_lon(this.long1 - this.long2); - this.long0 = 0.5 * (this.long1 + this.long2) - Math.atan(jl * Math.tan(0.5 * this.bl * (dlon12)) / pl) / this.bl; - this.long0 = adjust_lon(this.long0); - var dlon10 = adjust_lon(this.long1 - this.long0); - this.gamma0 = Math.atan(Math.sin(this.bl * (dlon10)) / gl); - this.alpha = Math.asin(dl * Math.sin(this.gamma0)); - } - - if (this.no_off) { - this.uc = 0; - } - else { - if (this.lat0 >= 0) { - this.uc = this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha)); - } - else { - this.uc = -1 * this.al / this.bl * Math.atan2(Math.sqrt(dl * dl - 1), Math.cos(this.alpha)); - } - } - - } - - /* Oblique Mercator forward equations--mapping lat,long to x,y - ----------------------------------------------------------*/ - function forward$8(p) { - var lon = p.x; - var lat = p.y; - var dlon = adjust_lon(lon - this.long0); - var us, vs; - var con; - if (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN) { - if (lat > 0) { - con = -1; - } - else { - con = 1; - } - vs = this.al / this.bl * Math.log(Math.tan(FORTPI + con * this.gamma0 * 0.5)); - us = -1 * con * HALF_PI * this.al / this.bl; - } - else { - var t = tsfnz(this.e, lat, Math.sin(lat)); - var ql = this.el / Math.pow(t, this.bl); - var sl = 0.5 * (ql - 1 / ql); - var tl = 0.5 * (ql + 1 / ql); - var vl = Math.sin(this.bl * (dlon)); - var ul = (sl * Math.sin(this.gamma0) - vl * Math.cos(this.gamma0)) / tl; - if (Math.abs(Math.abs(ul) - 1) <= EPSLN) { - vs = Number.POSITIVE_INFINITY; - } - else { - vs = 0.5 * this.al * Math.log((1 - ul) / (1 + ul)) / this.bl; - } - if (Math.abs(Math.cos(this.bl * (dlon))) <= EPSLN) { - us = this.al * this.bl * (dlon); - } - else { - us = this.al * Math.atan2(sl * Math.cos(this.gamma0) + vl * Math.sin(this.gamma0), Math.cos(this.bl * dlon)) / this.bl; - } - } - - if (this.no_rot) { - p.x = this.x0 + us; - p.y = this.y0 + vs; - } - else { - - us -= this.uc; - p.x = this.x0 + vs * Math.cos(this.alpha) + us * Math.sin(this.alpha); - p.y = this.y0 + us * Math.cos(this.alpha) - vs * Math.sin(this.alpha); - } - return p; - } - - function inverse$8(p) { - var us, vs; - if (this.no_rot) { - vs = p.y - this.y0; - us = p.x - this.x0; - } - else { - vs = (p.x - this.x0) * Math.cos(this.alpha) - (p.y - this.y0) * Math.sin(this.alpha); - us = (p.y - this.y0) * Math.cos(this.alpha) + (p.x - this.x0) * Math.sin(this.alpha); - us += this.uc; - } - var qp = Math.exp(-1 * this.bl * vs / this.al); - var sp = 0.5 * (qp - 1 / qp); - var tp = 0.5 * (qp + 1 / qp); - var vp = Math.sin(this.bl * us / this.al); - var up = (vp * Math.cos(this.gamma0) + sp * Math.sin(this.gamma0)) / tp; - var ts = Math.pow(this.el / Math.sqrt((1 + up) / (1 - up)), 1 / this.bl); - if (Math.abs(up - 1) < EPSLN) { - p.x = this.long0; - p.y = HALF_PI; - } - else if (Math.abs(up + 1) < EPSLN) { - p.x = this.long0; - p.y = -1 * HALF_PI; - } - else { - p.y = phi2z(this.e, ts); - p.x = adjust_lon(this.long0 - Math.atan2(sp * Math.cos(this.gamma0) - vp * Math.sin(this.gamma0), Math.cos(this.bl * us / this.al)) / this.bl); - } - return p; - } - - var names$10 = ["Hotine_Oblique_Mercator", "Hotine Oblique Mercator", "Hotine_Oblique_Mercator_Azimuth_Natural_Origin", "Hotine_Oblique_Mercator_Azimuth_Center", "omerc"]; - var omerc = { - init: init$9, - forward: forward$8, - inverse: inverse$8, - names: names$10 - }; - - function init$10() { - - // array of: r_maj,r_min,lat1,lat2,c_lon,c_lat,false_east,false_north - //double c_lat; /* center latitude */ - //double c_lon; /* center longitude */ - //double lat1; /* first standard parallel */ - //double lat2; /* second standard parallel */ - //double r_maj; /* major axis */ - //double r_min; /* minor axis */ - //double false_east; /* x offset in meters */ - //double false_north; /* y offset in meters */ - - if (!this.lat2) { - this.lat2 = this.lat1; - } //if lat2 is not defined - if (!this.k0) { - this.k0 = 1; - } - this.x0 = this.x0 || 0; - this.y0 = this.y0 || 0; - // Standard Parallels cannot be equal and on opposite sides of the equator - if (Math.abs(this.lat1 + this.lat2) < EPSLN) { - return; - } - - var temp = this.b / this.a; - this.e = Math.sqrt(1 - temp * temp); - - var sin1 = Math.sin(this.lat1); - var cos1 = Math.cos(this.lat1); - var ms1 = msfnz(this.e, sin1, cos1); - var ts1 = tsfnz(this.e, this.lat1, sin1); - - var sin2 = Math.sin(this.lat2); - var cos2 = Math.cos(this.lat2); - var ms2 = msfnz(this.e, sin2, cos2); - var ts2 = tsfnz(this.e, this.lat2, sin2); - - var ts0 = tsfnz(this.e, this.lat0, Math.sin(this.lat0)); - - if (Math.abs(this.lat1 - this.lat2) > EPSLN) { - this.ns = Math.log(ms1 / ms2) / Math.log(ts1 / ts2); - } - else { - this.ns = sin1; - } - if (isNaN(this.ns)) { - this.ns = sin1; - } - this.f0 = ms1 / (this.ns * Math.pow(ts1, this.ns)); - this.rh = this.a * this.f0 * Math.pow(ts0, this.ns); - if (!this.title) { - this.title = "Lambert Conformal Conic"; - } - } - - // Lambert Conformal conic forward equations--mapping lat,long to x,y - // ----------------------------------------------------------------- - function forward$9(p) { - - var lon = p.x; - var lat = p.y; - - // singular cases : - if (Math.abs(2 * Math.abs(lat) - Math.PI) <= EPSLN) { - lat = sign(lat) * (HALF_PI - 2 * EPSLN); - } - - var con = Math.abs(Math.abs(lat) - HALF_PI); - var ts, rh1; - if (con > EPSLN) { - ts = tsfnz(this.e, lat, Math.sin(lat)); - rh1 = this.a * this.f0 * Math.pow(ts, this.ns); - } - else { - con = lat * this.ns; - if (con <= 0) { - return null; - } - rh1 = 0; - } - var theta = this.ns * adjust_lon(lon - this.long0); - p.x = this.k0 * (rh1 * Math.sin(theta)) + this.x0; - p.y = this.k0 * (this.rh - rh1 * Math.cos(theta)) + this.y0; - - return p; - } - - // Lambert Conformal Conic inverse equations--mapping x,y to lat/long - // ----------------------------------------------------------------- - function inverse$9(p) { - - var rh1, con, ts; - var lat, lon; - var x = (p.x - this.x0) / this.k0; - var y = (this.rh - (p.y - this.y0) / this.k0); - if (this.ns > 0) { - rh1 = Math.sqrt(x * x + y * y); - con = 1; - } - else { - rh1 = -Math.sqrt(x * x + y * y); - con = -1; - } - var theta = 0; - if (rh1 !== 0) { - theta = Math.atan2((con * x), (con * y)); - } - if ((rh1 !== 0) || (this.ns > 0)) { - con = 1 / this.ns; - ts = Math.pow((rh1 / (this.a * this.f0)), con); - lat = phi2z(this.e, ts); - if (lat === -9999) { - return null; - } - } - else { - lat = -HALF_PI; - } - lon = adjust_lon(theta / this.ns + this.long0); - - p.x = lon; - p.y = lat; - return p; - } - - var names$11 = ["Lambert Tangential Conformal Conic Projection", "Lambert_Conformal_Conic", "Lambert_Conformal_Conic_2SP", "lcc"]; - var lcc = { - init: init$10, - forward: forward$9, - inverse: inverse$9, - names: names$11 - }; - - function init$11() { - this.a = 6377397.155; - this.es = 0.006674372230614; - this.e = Math.sqrt(this.es); - if (!this.lat0) { - this.lat0 = 0.863937979737193; - } - if (!this.long0) { - this.long0 = 0.7417649320975901 - 0.308341501185665; - } - /* if scale not set default to 0.9999 */ - if (!this.k0) { - this.k0 = 0.9999; - } - this.s45 = 0.785398163397448; /* 45 */ - 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; - } - - /* ellipsoid */ - /* calculate xy from lat/lon */ - /* Constants, identical to inverse transform function */ - function forward$10(p) { - var gfi, u, deltav, s, d, eps, ro; - var lon = p.x; - var lat = p.y; - var delta_lon = adjust_lon(lon - this.long0); - /* Transformation */ - gfi = Math.pow(((1 + this.e * Math.sin(lat)) / (1 - this.e * Math.sin(lat))), (this.alfa * this.e / 2)); - u = 2 * (Math.atan(this.k * Math.pow(Math.tan(lat / 2 + this.s45), this.alfa) / gfi) - this.s45); - deltav = -delta_lon * this.alfa; - s = Math.asin(Math.cos(this.ad) * Math.sin(u) + Math.sin(this.ad) * Math.cos(u) * Math.cos(deltav)); - d = Math.asin(Math.cos(u) * Math.sin(deltav) / Math.cos(s)); - eps = this.n * d; - ro = this.ro0 * Math.pow(Math.tan(this.s0 / 2 + this.s45), this.n) / Math.pow(Math.tan(s / 2 + this.s45), this.n); - p.y = ro * Math.cos(eps) / 1; - p.x = ro * Math.sin(eps) / 1; - - if (!this.czech) { - p.y *= -1; - p.x *= -1; - } - return (p); - } - - /* calculate lat/lon from xy */ - function inverse$10(p) { - var u, deltav, s, d, eps, ro, fi1; - var ok; - - /* Transformation */ - /* revert y, x*/ - var tmp = p.x; - p.x = p.y; - p.y = tmp; - if (!this.czech) { - p.y *= -1; - p.x *= -1; - } - ro = Math.sqrt(p.x * p.x + p.y * p.y); - eps = Math.atan2(p.y, p.x); - d = eps / Math.sin(this.s0); - s = 2 * (Math.atan(Math.pow(this.ro0 / ro, 1 / this.n) * Math.tan(this.s0 / 2 + this.s45)) - this.s45); - u = Math.asin(Math.cos(this.ad) * Math.sin(s) - Math.sin(this.ad) * Math.cos(s) * Math.cos(d)); - deltav = Math.asin(Math.cos(s) * Math.sin(d) / Math.cos(u)); - p.x = this.long0 - deltav / this.alfa; - fi1 = u; - ok = 0; - var iter = 0; - do { - p.y = 2 * (Math.atan(Math.pow(this.k, - 1 / this.alfa) * Math.pow(Math.tan(u / 2 + this.s45), 1 / this.alfa) * Math.pow((1 + this.e * Math.sin(fi1)) / (1 - this.e * Math.sin(fi1)), this.e / 2)) - this.s45); - if (Math.abs(fi1 - p.y) < 0.0000000001) { - ok = 1; - } - fi1 = p.y; - iter += 1; - } while (ok === 0 && iter < 15); - if (iter >= 15) { - return null; - } - - return (p); - } - - var names$12 = ["Krovak", "krovak"]; - var krovak = { - init: init$11, - forward: forward$10, - inverse: inverse$10, - names: names$12 - }; - - var mlfn = function(e0, e1, e2, e3, phi) { - return (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi)); - }; - - var e0fn = function(x) { - return (1 - 0.25 * x * (1 + x / 16 * (3 + 1.25 * x))); - }; - - var e1fn = function(x) { - return (0.375 * x * (1 + 0.25 * x * (1 + 0.46875 * x))); - }; - - var e2fn = function(x) { - return (0.05859375 * x * x * (1 + 0.75 * x)); - }; - - var e3fn = function(x) { - return (x * x * x * (35 / 3072)); - }; - - var gN = function(a, e, sinphi) { - var temp = e * sinphi; - return a / Math.sqrt(1 - temp * temp); - }; - - var adjust_lat = function(x) { - return (Math.abs(x) < HALF_PI) ? x : (x - (sign(x) * Math.PI)); - }; - - var imlfn = function(ml, e0, e1, e2, e3) { - var phi; - var dphi; - - phi = ml / e0; - for (var i = 0; i < 15; i++) { - dphi = (ml - (e0 * phi - e1 * Math.sin(2 * phi) + e2 * Math.sin(4 * phi) - e3 * Math.sin(6 * phi))) / (e0 - 2 * e1 * Math.cos(2 * phi) + 4 * e2 * Math.cos(4 * phi) - 6 * e3 * Math.cos(6 * phi)); - phi += dphi; - if (Math.abs(dphi) <= 0.0000000001) { - return phi; - } - } - - //..reportError("IMLFN-CONV:Latitude failed to converge after 15 iterations"); - return NaN; - }; - - function init$12() { - if (!this.sphere) { - this.e0 = e0fn(this.es); - this.e1 = e1fn(this.es); - this.e2 = e2fn(this.es); - this.e3 = e3fn(this.es); - this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); - } - } - - /* Cassini forward equations--mapping lat,long to x,y - -----------------------------------------------------------------------*/ - function forward$11(p) { - - /* Forward equations - -----------------*/ - var x, y; - var lam = p.x; - var phi = p.y; - lam = adjust_lon(lam - this.long0); - - if (this.sphere) { - x = this.a * Math.asin(Math.cos(phi) * Math.sin(lam)); - y = this.a * (Math.atan2(Math.tan(phi), Math.cos(lam)) - this.lat0); - } - else { - //ellipsoid - var sinphi = Math.sin(phi); - var cosphi = Math.cos(phi); - var nl = gN(this.a, this.e, sinphi); - var tl = Math.tan(phi) * Math.tan(phi); - var al = lam * Math.cos(phi); - var asq = al * al; - var cl = this.es * cosphi * cosphi / (1 - this.es); - var ml = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); - - x = nl * al * (1 - asq * tl * (1 / 6 - (8 - tl + 8 * cl) * asq / 120)); - y = ml - this.ml0 + nl * sinphi / cosphi * asq * (0.5 + (5 - tl + 6 * cl) * asq / 24); - - - } - - p.x = x + this.x0; - p.y = y + this.y0; - return p; - } - - /* Inverse equations - -----------------*/ - function inverse$11(p) { - p.x -= this.x0; - p.y -= this.y0; - var x = p.x / this.a; - var y = p.y / this.a; - var phi, lam; - - if (this.sphere) { - var dd = y + this.lat0; - phi = Math.asin(Math.sin(dd) * Math.cos(x)); - lam = Math.atan2(Math.tan(x), Math.cos(dd)); - } - else { - /* ellipsoid */ - var ml1 = this.ml0 / this.a + y; - var phi1 = imlfn(ml1, this.e0, this.e1, this.e2, this.e3); - if (Math.abs(Math.abs(phi1) - HALF_PI) <= EPSLN) { - p.x = this.long0; - p.y = HALF_PI; - if (y < 0) { - p.y *= -1; - } - return p; - } - var nl1 = gN(this.a, this.e, Math.sin(phi1)); - - var rl1 = nl1 * nl1 * nl1 / this.a / this.a * (1 - this.es); - var tl1 = Math.pow(Math.tan(phi1), 2); - var dl = x * this.a / nl1; - var dsq = dl * dl; - phi = phi1 - nl1 * Math.tan(phi1) / rl1 * dl * dl * (0.5 - (1 + 3 * tl1) * dl * dl / 24); - lam = dl * (1 - dsq * (tl1 / 3 + (1 + 3 * tl1) * tl1 * dsq / 15)) / Math.cos(phi1); - - } - - p.x = adjust_lon(lam + this.long0); - p.y = adjust_lat(phi); - return p; - - } - - var names$13 = ["Cassini", "Cassini_Soldner", "cass"]; - var cass = { - init: init$12, - forward: forward$11, - inverse: inverse$11, - names: names$13 - }; - - var qsfnz = function(eccent, sinphi) { - var con; - if (eccent > 1.0e-7) { - con = eccent * sinphi; - return ((1 - eccent * eccent) * (sinphi / (1 - con * con) - (0.5 / eccent) * Math.log((1 - con) / (1 + con)))); - } - else { - return (2 * sinphi); - } - }; - - /* - reference - "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, - The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. - */ - - var S_POLE = 1; - - var N_POLE = 2; - var EQUIT = 3; - var OBLIQ = 4; - - /* Initialize the Lambert Azimuthal Equal Area projection - ------------------------------------------------------*/ - function init$13() { - var t = Math.abs(this.lat0); - if (Math.abs(t - HALF_PI) < EPSLN) { - this.mode = this.lat0 < 0 ? this.S_POLE : this.N_POLE; - } - else if (Math.abs(t) < EPSLN) { - this.mode = this.EQUIT; - } - else { - this.mode = this.OBLIQ; - } - if (this.es > 0) { - var sinphi; - - this.qp = qsfnz(this.e, 1); - this.mmf = 0.5 / (1 - this.es); - this.apa = authset(this.es); - switch (this.mode) { - case this.N_POLE: - this.dd = 1; - break; - case this.S_POLE: - this.dd = 1; - break; - case this.EQUIT: - this.rq = Math.sqrt(0.5 * this.qp); - this.dd = 1 / this.rq; - this.xmf = 1; - this.ymf = 0.5 * this.qp; - break; - case this.OBLIQ: - this.rq = Math.sqrt(0.5 * this.qp); - sinphi = Math.sin(this.lat0); - this.sinb1 = qsfnz(this.e, sinphi) / this.qp; - this.cosb1 = Math.sqrt(1 - this.sinb1 * this.sinb1); - this.dd = Math.cos(this.lat0) / (Math.sqrt(1 - this.es * sinphi * sinphi) * this.rq * this.cosb1); - this.ymf = (this.xmf = this.rq) / this.dd; - this.xmf *= this.dd; - break; - } - } - else { - if (this.mode === this.OBLIQ) { - this.sinph0 = Math.sin(this.lat0); - this.cosph0 = Math.cos(this.lat0); - } - } - } - - /* Lambert Azimuthal Equal Area forward equations--mapping lat,long to x,y - -----------------------------------------------------------------------*/ - function forward$12(p) { - - /* Forward equations - -----------------*/ - var x, y, coslam, sinlam, sinphi, q, sinb, cosb, b, cosphi; - var lam = p.x; - var phi = p.y; - - lam = adjust_lon(lam - this.long0); - if (this.sphere) { - sinphi = Math.sin(phi); - cosphi = Math.cos(phi); - coslam = Math.cos(lam); - if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { - y = (this.mode === this.EQUIT) ? 1 + cosphi * coslam : 1 + this.sinph0 * sinphi + this.cosph0 * cosphi * coslam; - if (y <= EPSLN) { - return null; - } - y = Math.sqrt(2 / y); - x = y * cosphi * Math.sin(lam); - y *= (this.mode === this.EQUIT) ? sinphi : this.cosph0 * sinphi - this.sinph0 * cosphi * coslam; - } - else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { - if (this.mode === this.N_POLE) { - coslam = -coslam; - } - if (Math.abs(phi + this.phi0) < EPSLN) { - return null; - } - y = FORTPI - phi * 0.5; - y = 2 * ((this.mode === this.S_POLE) ? Math.cos(y) : Math.sin(y)); - x = y * Math.sin(lam); - y *= coslam; - } - } - else { - sinb = 0; - cosb = 0; - b = 0; - coslam = Math.cos(lam); - sinlam = Math.sin(lam); - sinphi = Math.sin(phi); - q = qsfnz(this.e, sinphi); - if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { - sinb = q / this.qp; - cosb = Math.sqrt(1 - sinb * sinb); - } - switch (this.mode) { - case this.OBLIQ: - b = 1 + this.sinb1 * sinb + this.cosb1 * cosb * coslam; - break; - case this.EQUIT: - b = 1 + cosb * coslam; - break; - case this.N_POLE: - b = HALF_PI + phi; - q = this.qp - q; - break; - case this.S_POLE: - b = phi - HALF_PI; - q = this.qp + q; - break; - } - if (Math.abs(b) < EPSLN) { - return null; - } - switch (this.mode) { - case this.OBLIQ: - case this.EQUIT: - b = Math.sqrt(2 / b); - if (this.mode === this.OBLIQ) { - y = this.ymf * b * (this.cosb1 * sinb - this.sinb1 * cosb * coslam); - } - else { - y = (b = Math.sqrt(2 / (1 + cosb * coslam))) * sinb * this.ymf; - } - x = this.xmf * b * cosb * sinlam; - break; - case this.N_POLE: - case this.S_POLE: - if (q >= 0) { - x = (b = Math.sqrt(q)) * sinlam; - y = coslam * ((this.mode === this.S_POLE) ? b : -b); - } - else { - x = y = 0; - } - break; - } - } - - p.x = this.a * x + this.x0; - p.y = this.a * y + this.y0; - return p; - } - - /* Inverse equations - -----------------*/ - function inverse$12(p) { - p.x -= this.x0; - p.y -= this.y0; - var x = p.x / this.a; - var y = p.y / this.a; - var lam, phi, cCe, sCe, q, rho, ab; - if (this.sphere) { - var cosz = 0, - rh, sinz = 0; - - rh = Math.sqrt(x * x + y * y); - phi = rh * 0.5; - if (phi > 1) { - return null; - } - phi = 2 * Math.asin(phi); - if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { - sinz = Math.sin(phi); - cosz = Math.cos(phi); - } - switch (this.mode) { - case this.EQUIT: - phi = (Math.abs(rh) <= EPSLN) ? 0 : Math.asin(y * sinz / rh); - x *= sinz; - y = cosz * rh; - break; - case this.OBLIQ: - phi = (Math.abs(rh) <= EPSLN) ? this.phi0 : Math.asin(cosz * this.sinph0 + y * sinz * this.cosph0 / rh); - x *= sinz * this.cosph0; - y = (cosz - Math.sin(phi) * this.sinph0) * rh; - break; - case this.N_POLE: - y = -y; - phi = HALF_PI - phi; - break; - case this.S_POLE: - phi -= HALF_PI; - break; - } - lam = (y === 0 && (this.mode === this.EQUIT || this.mode === this.OBLIQ)) ? 0 : Math.atan2(x, y); - } - else { - ab = 0; - if (this.mode === this.OBLIQ || this.mode === this.EQUIT) { - x /= this.dd; - y *= this.dd; - rho = Math.sqrt(x * x + y * y); - if (rho < EPSLN) { - p.x = 0; - p.y = this.phi0; - return p; - } - sCe = 2 * Math.asin(0.5 * rho / this.rq); - cCe = Math.cos(sCe); - x *= (sCe = Math.sin(sCe)); - if (this.mode === this.OBLIQ) { - ab = cCe * this.sinb1 + y * sCe * this.cosb1 / rho; - q = this.qp * ab; - y = rho * this.cosb1 * cCe - y * this.sinb1 * sCe; - } - else { - ab = y * sCe / rho; - q = this.qp * ab; - y = rho * cCe; - } - } - else if (this.mode === this.N_POLE || this.mode === this.S_POLE) { - if (this.mode === this.N_POLE) { - y = -y; - } - q = (x * x + y * y); - if (!q) { - p.x = 0; - p.y = this.phi0; - return p; - } - ab = 1 - q / this.qp; - if (this.mode === this.S_POLE) { - ab = -ab; - } - } - lam = Math.atan2(x, y); - phi = authlat(Math.asin(ab), this.apa); - } - - p.x = adjust_lon(this.long0 + lam); - p.y = phi; - return p; - } - - /* determine latitude from authalic latitude */ - var P00 = 0.33333333333333333333; - - var P01 = 0.17222222222222222222; - var P02 = 0.10257936507936507936; - var P10 = 0.06388888888888888888; - var P11 = 0.06640211640211640211; - var P20 = 0.01641501294219154443; - - function authset(es) { - var t; - var APA = []; - APA[0] = es * P00; - t = es * es; - APA[0] += t * P01; - APA[1] = t * P10; - t *= es; - APA[0] += t * P02; - APA[1] += t * P11; - APA[2] = t * P20; - return APA; - } - - function authlat(beta, APA) { - var t = beta + beta; - return (beta + APA[0] * Math.sin(t) + APA[1] * Math.sin(t + t) + APA[2] * Math.sin(t + t + t)); - } - - var names$14 = ["Lambert Azimuthal Equal Area", "Lambert_Azimuthal_Equal_Area", "laea"]; - var laea = { - init: init$13, - forward: forward$12, - inverse: inverse$12, - names: names$14, - S_POLE: S_POLE, - N_POLE: N_POLE, - EQUIT: EQUIT, - OBLIQ: OBLIQ - }; - - var asinz = function(x) { - if (Math.abs(x) > 1) { - x = (x > 1) ? 1 : -1; - } - return Math.asin(x); - }; - - function init$14() { - - if (Math.abs(this.lat1 + this.lat2) < EPSLN) { - return; - } - this.temp = this.b / this.a; - this.es = 1 - Math.pow(this.temp, 2); - this.e3 = Math.sqrt(this.es); - - this.sin_po = Math.sin(this.lat1); - this.cos_po = Math.cos(this.lat1); - this.t1 = this.sin_po; - this.con = this.sin_po; - this.ms1 = msfnz(this.e3, this.sin_po, this.cos_po); - this.qs1 = qsfnz(this.e3, this.sin_po, this.cos_po); - - this.sin_po = Math.sin(this.lat2); - this.cos_po = Math.cos(this.lat2); - this.t2 = this.sin_po; - this.ms2 = msfnz(this.e3, this.sin_po, this.cos_po); - this.qs2 = qsfnz(this.e3, this.sin_po, this.cos_po); - - this.sin_po = Math.sin(this.lat0); - this.cos_po = Math.cos(this.lat0); - this.t3 = this.sin_po; - this.qs0 = qsfnz(this.e3, this.sin_po, this.cos_po); - - if (Math.abs(this.lat1 - this.lat2) > EPSLN) { - this.ns0 = (this.ms1 * this.ms1 - this.ms2 * this.ms2) / (this.qs2 - this.qs1); - } - else { - 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; - } - - /* Albers Conical Equal Area forward equations--mapping lat,long to x,y - -------------------------------------------------------------------*/ - function forward$13(p) { - - var lon = p.x; - var lat = p.y; - - this.sin_phi = Math.sin(lat); - this.cos_phi = Math.cos(lat); - - var qs = qsfnz(this.e3, this.sin_phi, this.cos_phi); - var rh1 = this.a * Math.sqrt(this.c - this.ns0 * qs) / this.ns0; - var theta = this.ns0 * adjust_lon(lon - this.long0); - var x = rh1 * Math.sin(theta) + this.x0; - var y = this.rh - rh1 * Math.cos(theta) + this.y0; - - p.x = x; - p.y = y; - return p; - } - - function inverse$13(p) { - var rh1, qs, con, theta, lon, lat; - - p.x -= this.x0; - p.y = this.rh - p.y + this.y0; - if (this.ns0 >= 0) { - rh1 = Math.sqrt(p.x * p.x + p.y * p.y); - con = 1; - } - else { - rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); - con = -1; - } - theta = 0; - if (rh1 !== 0) { - theta = Math.atan2(con * p.x, con * p.y); - } - con = rh1 * this.ns0 / this.a; - if (this.sphere) { - lat = Math.asin((this.c - con * con) / (2 * this.ns0)); - } - else { - qs = (this.c - con * con) / this.ns0; - lat = this.phi1z(this.e3, qs); - } - - lon = adjust_lon(theta / this.ns0 + this.long0); - p.x = lon; - p.y = lat; - return p; - } - - /* Function to compute phi1, the latitude for the inverse of the - Albers Conical Equal-Area projection. - -------------------------------------------*/ - function phi1z(eccent, qs) { - var sinphi, cosphi, con, com, dphi; - var phi = asinz(0.5 * qs); - if (eccent < EPSLN) { - return phi; - } - - var eccnts = eccent * eccent; - for (var i = 1; i <= 25; i++) { - sinphi = Math.sin(phi); - cosphi = Math.cos(phi); - con = eccent * sinphi; - com = 1 - con * con; - dphi = 0.5 * com * com / cosphi * (qs / (1 - eccnts) - sinphi / com + 0.5 / eccent * Math.log((1 - con) / (1 + con))); - phi = phi + dphi; - if (Math.abs(dphi) <= 1e-7) { - return phi; - } - } - return null; - } - - var names$15 = ["Albers_Conic_Equal_Area", "Albers", "aea"]; - var aea = { - init: init$14, - forward: forward$13, - inverse: inverse$13, - names: names$15, - phi1z: phi1z - }; - - /* - reference: - Wolfram Mathworld "Gnomonic Projection" - http://mathworld.wolfram.com/GnomonicProjection.html - Accessed: 12th November 2009 - */ - function init$15() { - - /* Place parameters in static storage for common use - -------------------------------------------------*/ - this.sin_p14 = Math.sin(this.lat0); - this.cos_p14 = Math.cos(this.lat0); - // Approximation for projecting points to the horizon (infinity) - this.infinity_dist = 1000 * this.a; - this.rc = 1; - } - - /* Gnomonic forward equations--mapping lat,long to x,y - ---------------------------------------------------*/ - function forward$14(p) { - var sinphi, cosphi; /* sin and cos value */ - var dlon; /* delta longitude value */ - var coslon; /* cos of longitude */ - var ksp; /* scale factor */ - var g; - var x, y; - var lon = p.x; - var lat = p.y; - /* Forward equations - -----------------*/ - dlon = adjust_lon(lon - this.long0); - - sinphi = Math.sin(lat); - cosphi = Math.cos(lat); - - coslon = Math.cos(dlon); - g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; - ksp = 1; - if ((g > 0) || (Math.abs(g) <= EPSLN)) { - x = this.x0 + this.a * ksp * cosphi * Math.sin(dlon) / g; - y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon) / g; - } - else { - - // Point is in the opposing hemisphere and is unprojectable - // We still need to return a reasonable point, so we project - // to infinity, on a bearing - // equivalent to the northern hemisphere equivalent - // This is a reasonable approximation for short shapes and lines that - // straddle the horizon. - - x = this.x0 + this.infinity_dist * cosphi * Math.sin(dlon); - y = this.y0 + this.infinity_dist * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); - - } - p.x = x; - p.y = y; - return p; - } - - function inverse$14(p) { - var rh; /* Rho */ - var sinc, cosc; - var c; - var lon, lat; - - /* Inverse equations - -----------------*/ - p.x = (p.x - this.x0) / this.a; - p.y = (p.y - this.y0) / this.a; - - p.x /= this.k0; - p.y /= this.k0; - - if ((rh = Math.sqrt(p.x * p.x + p.y * p.y))) { - c = Math.atan2(rh, this.rc); - sinc = Math.sin(c); - cosc = Math.cos(c); - - lat = asinz(cosc * this.sin_p14 + (p.y * sinc * this.cos_p14) / rh); - lon = Math.atan2(p.x * sinc, rh * this.cos_p14 * cosc - p.y * this.sin_p14 * sinc); - lon = adjust_lon(this.long0 + lon); - } - else { - lat = this.phic0; - lon = 0; - } - - p.x = lon; - p.y = lat; - return p; - } - - var names$16 = ["gnom"]; - var gnom = { - init: init$15, - forward: forward$14, - inverse: inverse$14, - names: names$16 - }; - - var iqsfnz = function(eccent, q) { - var temp = 1 - (1 - eccent * eccent) / (2 * eccent) * Math.log((1 - eccent) / (1 + eccent)); - if (Math.abs(Math.abs(q) - temp) < 1.0E-6) { - if (q < 0) { - return (-1 * HALF_PI); - } - else { - return HALF_PI; - } - } - //var phi = 0.5* q/(1-eccent*eccent); - var phi = Math.asin(0.5 * q); - var dphi; - var sin_phi; - var cos_phi; - var con; - for (var i = 0; i < 30; i++) { - sin_phi = Math.sin(phi); - cos_phi = Math.cos(phi); - con = eccent * sin_phi; - dphi = Math.pow(1 - con * con, 2) / (2 * cos_phi) * (q / (1 - eccent * eccent) - sin_phi / (1 - con * con) + 0.5 / eccent * Math.log((1 - con) / (1 + con))); - phi += dphi; - if (Math.abs(dphi) <= 0.0000000001) { - return phi; - } - } - - //console.log("IQSFN-CONV:Latitude failed to converge after 30 iterations"); - return NaN; - }; - - /* - reference: - "Cartographic Projection Procedures for the UNIX Environment- - A User's Manual" by Gerald I. Evenden, - USGS Open File Report 90-284and Release 4 Interim Reports (2003) - */ - function init$16() { - //no-op - if (!this.sphere) { - this.k0 = msfnz(this.e, Math.sin(this.lat_ts), Math.cos(this.lat_ts)); - } - } - - /* Cylindrical Equal Area forward equations--mapping lat,long to x,y - ------------------------------------------------------------*/ - function forward$15(p) { - var lon = p.x; - var lat = p.y; - var x, y; - /* Forward equations - -----------------*/ - var dlon = adjust_lon(lon - this.long0); - if (this.sphere) { - x = this.x0 + this.a * dlon * Math.cos(this.lat_ts); - y = this.y0 + this.a * Math.sin(lat) / Math.cos(this.lat_ts); - } - else { - var qs = qsfnz(this.e, Math.sin(lat)); - x = this.x0 + this.a * this.k0 * dlon; - y = this.y0 + this.a * qs * 0.5 / this.k0; - } - - p.x = x; - p.y = y; - return p; - } - - /* Cylindrical Equal Area inverse equations--mapping x,y to lat/long - ------------------------------------------------------------*/ - function inverse$15(p) { - p.x -= this.x0; - p.y -= this.y0; - var lon, lat; - - if (this.sphere) { - lon = adjust_lon(this.long0 + (p.x / this.a) / Math.cos(this.lat_ts)); - lat = Math.asin((p.y / this.a) * Math.cos(this.lat_ts)); - } - else { - lat = iqsfnz(this.e, 2 * p.y * this.k0 / this.a); - lon = adjust_lon(this.long0 + p.x / (this.a * this.k0)); - } - - p.x = lon; - p.y = lat; - return p; - } - - var names$17 = ["cea"]; - var cea = { - init: init$16, - forward: forward$15, - inverse: inverse$15, - names: names$17 - }; - - function init$17() { - - 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 equations--mapping lat,long to x,y - // ----------------------------------------------------------------- - function forward$16(p) { - - var lon = p.x; - var lat = p.y; - - var dlon = adjust_lon(lon - this.long0); - var dlat = adjust_lat(lat - this.lat0); - p.x = this.x0 + (this.a * dlon * this.rc); - p.y = this.y0 + (this.a * dlat); - return p; - } - - // inverse equations--mapping x,y to lat/long - // ----------------------------------------------------------------- - function inverse$16(p) { - - var x = p.x; - var y = p.y; - - p.x = adjust_lon(this.long0 + ((x - this.x0) / (this.a * this.rc))); - p.y = adjust_lat(this.lat0 + ((y - this.y0) / (this.a))); - return p; - } - - var names$18 = ["Equirectangular", "Equidistant_Cylindrical", "eqc"]; - var eqc = { - init: init$17, - forward: forward$16, - inverse: inverse$16, - names: names$18 - }; - - var MAX_ITER$2 = 20; - - function init$18() { - /* Place parameters in static storage for common use - -------------------------------------------------*/ - this.temp = this.b / this.a; - this.es = 1 - Math.pow(this.temp, 2); // devait etre dans tmerc.js mais n y est pas donc je commente sinon retour de valeurs nulles - this.e = Math.sqrt(this.es); - this.e0 = e0fn(this.es); - this.e1 = e1fn(this.es); - this.e2 = e2fn(this.es); - this.e3 = e3fn(this.es); - this.ml0 = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); //si que des zeros le calcul ne se fait pas - } - - /* Polyconic forward equations--mapping lat,long to x,y - ---------------------------------------------------*/ - function forward$17(p) { - var lon = p.x; - var lat = p.y; - var x, y, el; - var dlon = adjust_lon(lon - this.long0); - el = dlon * Math.sin(lat); - if (this.sphere) { - if (Math.abs(lat) <= EPSLN) { - x = this.a * dlon; - y = -1 * this.a * this.lat0; - } - else { - x = this.a * Math.sin(el) / Math.tan(lat); - y = this.a * (adjust_lat(lat - this.lat0) + (1 - Math.cos(el)) / Math.tan(lat)); - } - } - else { - if (Math.abs(lat) <= EPSLN) { - x = this.a * dlon; - y = -1 * this.ml0; - } - else { - var nl = gN(this.a, this.e, Math.sin(lat)) / Math.tan(lat); - x = nl * Math.sin(el); - y = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, lat) - this.ml0 + nl * (1 - Math.cos(el)); - } - - } - p.x = x + this.x0; - p.y = y + this.y0; - return p; - } - - /* Inverse equations - -----------------*/ - function inverse$17(p) { - var lon, lat, x, y, i; - var al, bl; - var phi, dphi; - x = p.x - this.x0; - y = p.y - this.y0; - - if (this.sphere) { - if (Math.abs(y + this.a * this.lat0) <= EPSLN) { - lon = adjust_lon(x / this.a + this.long0); - lat = 0; - } - else { - al = this.lat0 + y / this.a; - bl = x * x / this.a / this.a + al * al; - phi = al; - var tanphi; - for (i = MAX_ITER$2; i; --i) { - tanphi = Math.tan(phi); - dphi = -1 * (al * (phi * tanphi + 1) - phi - 0.5 * (phi * phi + bl) * tanphi) / ((phi - al) / tanphi - 1); - phi += dphi; - if (Math.abs(dphi) <= EPSLN) { - lat = phi; - break; - } - } - lon = adjust_lon(this.long0 + (Math.asin(x * Math.tan(phi) / this.a)) / Math.sin(lat)); - } - } - else { - if (Math.abs(y + this.ml0) <= EPSLN) { - lat = 0; - lon = adjust_lon(this.long0 + x / this.a); - } - else { - - al = (this.ml0 + y) / this.a; - bl = x * x / this.a / this.a + al * al; - phi = al; - var cl, mln, mlnp, ma; - var con; - for (i = MAX_ITER$2; i; --i) { - con = this.e * Math.sin(phi); - cl = Math.sqrt(1 - con * con) * Math.tan(phi); - mln = this.a * mlfn(this.e0, this.e1, this.e2, this.e3, phi); - mlnp = this.e0 - 2 * this.e1 * Math.cos(2 * phi) + 4 * this.e2 * Math.cos(4 * phi) - 6 * this.e3 * Math.cos(6 * phi); - ma = mln / this.a; - dphi = (al * (cl * ma + 1) - ma - 0.5 * cl * (ma * ma + bl)) / (this.es * Math.sin(2 * phi) * (ma * ma + bl - 2 * al * ma) / (4 * cl) + (al - ma) * (cl * mlnp - 2 / Math.sin(2 * phi)) - mlnp); - phi -= dphi; - if (Math.abs(dphi) <= EPSLN) { - lat = phi; - break; - } - } - - //lat=phi4z(this.e,this.e0,this.e1,this.e2,this.e3,al,bl,0,0); - cl = Math.sqrt(1 - this.es * Math.pow(Math.sin(lat), 2)) * Math.tan(lat); - lon = adjust_lon(this.long0 + Math.asin(x * cl / this.a) / Math.sin(lat)); - } - } - - p.x = lon; - p.y = lat; - return p; - } - - var names$19 = ["Polyconic", "poly"]; - var poly = { - init: init$18, - forward: forward$17, - inverse: inverse$17, - names: names$19 - }; - - /* - reference - Department of Land and Survey Technical Circular 1973/32 - http://www.linz.govt.nz/docs/miscellaneous/nz-map-definition.pdf - OSG Technical Report 4.1 - http://www.linz.govt.nz/docs/miscellaneous/nzmg.pdf - */ - - /** - * iterations: Number of iterations to refine inverse transform. - * 0 -> km accuracy - * 1 -> m accuracy -- suitable for most mapping applications - * 2 -> mm accuracy - */ - - - function init$19() { - this.A = []; - this.A[1] = 0.6399175073; - this.A[2] = -0.1358797613; - this.A[3] = 0.063294409; - this.A[4] = -0.02526853; - this.A[5] = 0.0117879; - this.A[6] = -0.0055161; - this.A[7] = 0.0026906; - this.A[8] = -0.001333; - this.A[9] = 0.00067; - this.A[10] = -0.00034; - - this.B_re = []; - this.B_im = []; - this.B_re[1] = 0.7557853228; - this.B_im[1] = 0; - this.B_re[2] = 0.249204646; - this.B_im[2] = 0.003371507; - this.B_re[3] = -0.001541739; - this.B_im[3] = 0.041058560; - this.B_re[4] = -0.10162907; - this.B_im[4] = 0.01727609; - this.B_re[5] = -0.26623489; - this.B_im[5] = -0.36249218; - this.B_re[6] = -0.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] = -0.577245789; - this.C_im[2] = -0.007809598; - this.C_re[3] = 0.508307513; - this.C_im[3] = -0.112208952; - this.C_re[4] = -0.15094762; - this.C_im[4] = 0.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] = 0.5185406398; - this.D[3] = -0.03333098; - this.D[4] = -0.1052906; - this.D[5] = -0.0368594; - this.D[6] = 0.007317; - this.D[7] = 0.01220; - this.D[8] = 0.00394; - this.D[9] = -0.0013; - } - - /** - New Zealand Map Grid Forward - long/lat to x/y - long/lat in radians - */ - function forward$18(p) { - var n; - var lon = p.x; - var lat = p.y; - - var delta_lat = lat - this.lat0; - var delta_lon = lon - this.long0; - - // 1. Calculate d_phi and d_psi ... // and d_lambda - // For this algorithm, delta_latitude is in seconds of arc x 10-5, so we need to scale to those units. Longitude is radians. - var d_phi = delta_lat / SEC_TO_RAD * 1E-5; - var d_lambda = delta_lon; - var d_phi_n = 1; // d_phi^0 - - var d_psi = 0; - for (n = 1; n <= 10; n++) { - d_phi_n = d_phi_n * d_phi; - d_psi = d_psi + this.A[n] * d_phi_n; - } - - // 2. Calculate theta - var th_re = d_psi; - var th_im = d_lambda; - - // 3. Calculate z - var th_n_re = 1; - var th_n_im = 0; // theta^0 - var th_n_re1; - var th_n_im1; - - var z_re = 0; - var z_im = 0; - for (n = 1; n <= 6; n++) { - th_n_re1 = th_n_re * th_re - th_n_im * th_im; - th_n_im1 = th_n_im * th_re + th_n_re * th_im; - th_n_re = th_n_re1; - th_n_im = th_n_im1; - z_re = z_re + this.B_re[n] * th_n_re - this.B_im[n] * th_n_im; - z_im = z_im + this.B_im[n] * th_n_re + this.B_re[n] * th_n_im; - } - - // 4. Calculate easting and northing - p.x = (z_im * this.a) + this.x0; - p.y = (z_re * this.a) + this.y0; - - return p; - } - - /** - New Zealand Map Grid Inverse - x/y to long/lat - */ - function inverse$18(p) { - var n; - var x = p.x; - var y = p.y; - - var delta_x = x - this.x0; - var delta_y = y - this.y0; - - // 1. Calculate z - var z_re = delta_y / this.a; - var z_im = delta_x / this.a; - - // 2a. Calculate theta - first approximation gives km accuracy - var z_n_re = 1; - var z_n_im = 0; // z^0 - var z_n_re1; - var z_n_im1; - - var th_re = 0; - var th_im = 0; - for (n = 1; n <= 6; n++) { - z_n_re1 = z_n_re * z_re - z_n_im * z_im; - z_n_im1 = z_n_im * z_re + z_n_re * z_im; - z_n_re = z_n_re1; - z_n_im = z_n_im1; - th_re = th_re + this.C_re[n] * z_n_re - this.C_im[n] * z_n_im; - th_im = th_im + this.C_im[n] * z_n_re + this.C_re[n] * z_n_im; - } - - // 2b. Iterate to refine the accuracy of the calculation - // 0 iterations gives km accuracy - // 1 iteration gives m accuracy -- good enough for most mapping applications - // 2 iterations bives mm accuracy - for (var i = 0; i < this.iterations; i++) { - var th_n_re = th_re; - var th_n_im = th_im; - var th_n_re1; - var th_n_im1; - - var num_re = z_re; - var num_im = z_im; - for (n = 2; n <= 6; n++) { - th_n_re1 = th_n_re * th_re - th_n_im * th_im; - th_n_im1 = th_n_im * th_re + th_n_re * th_im; - th_n_re = th_n_re1; - th_n_im = th_n_im1; - num_re = num_re + (n - 1) * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); - num_im = num_im + (n - 1) * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); - } - - th_n_re = 1; - th_n_im = 0; - var den_re = this.B_re[1]; - var den_im = this.B_im[1]; - for (n = 2; n <= 6; n++) { - th_n_re1 = th_n_re * th_re - th_n_im * th_im; - th_n_im1 = th_n_im * th_re + th_n_re * th_im; - th_n_re = th_n_re1; - th_n_im = th_n_im1; - den_re = den_re + n * (this.B_re[n] * th_n_re - this.B_im[n] * th_n_im); - den_im = den_im + n * (this.B_im[n] * th_n_re + this.B_re[n] * th_n_im); - } - - // Complex division - var den2 = den_re * den_re + den_im * den_im; - th_re = (num_re * den_re + num_im * den_im) / den2; - th_im = (num_im * den_re - num_re * den_im) / den2; - } - - // 3. Calculate d_phi ... // and d_lambda - var d_psi = th_re; - var d_lambda = th_im; - var d_psi_n = 1; // d_psi^0 - - var d_phi = 0; - for (n = 1; n <= 9; n++) { - d_psi_n = d_psi_n * d_psi; - d_phi = d_phi + this.D[n] * d_psi_n; - } - - // 4. Calculate latitude and longitude - // d_phi is calcuated in second of arc * 10^-5, so we need to scale back to radians. d_lambda is in radians. - var lat = this.lat0 + (d_phi * SEC_TO_RAD * 1E5); - var lon = this.long0 + d_lambda; - - p.x = lon; - p.y = lat; - - return p; - } - - var names$20 = ["New_Zealand_Map_Grid", "nzmg"]; - var nzmg = { - init: init$19, - forward: forward$18, - inverse: inverse$18, - names: names$20 - }; - - /* - reference - "New Equal-Area Map Projections for Noncircular Regions", John P. Snyder, - The American Cartographer, Vol 15, No. 4, October 1988, pp. 341-355. - */ - - - /* Initialize the Miller Cylindrical projection - -------------------------------------------*/ - function init$20() { - //no-op - } - - /* Miller Cylindrical forward equations--mapping lat,long to x,y - ------------------------------------------------------------*/ - function forward$19(p) { - var lon = p.x; - var lat = p.y; - /* Forward equations - -----------------*/ - var dlon = adjust_lon(lon - this.long0); - var x = this.x0 + this.a * dlon; - var y = this.y0 + this.a * Math.log(Math.tan((Math.PI / 4) + (lat / 2.5))) * 1.25; - - p.x = x; - p.y = y; - return p; - } - - /* Miller Cylindrical inverse equations--mapping x,y to lat/long - ------------------------------------------------------------*/ - function inverse$19(p) { - p.x -= this.x0; - p.y -= this.y0; - - var lon = adjust_lon(this.long0 + p.x / this.a); - var lat = 2.5 * (Math.atan(Math.exp(0.8 * p.y / this.a)) - Math.PI / 4); - - p.x = lon; - p.y = lat; - return p; - } - - var names$21 = ["Miller_Cylindrical", "mill"]; - var mill = { - init: init$20, - forward: forward$19, - inverse: inverse$19, - names: names$21 - }; - - var MAX_ITER$3 = 20; - function init$21() { - /* Place parameters in static storage for common use - -------------------------------------------------*/ - - - if (!this.sphere) { - this.en = pj_enfn(this.es); - } - else { - this.n = 1; - this.m = 0; - this.es = 0; - this.C_y = Math.sqrt((this.m + 1) / this.n); - this.C_x = this.C_y / (this.m + 1); - } - - } - - /* Sinusoidal forward equations--mapping lat,long to x,y - -----------------------------------------------------*/ - function forward$20(p) { - var x, y; - var lon = p.x; - var lat = p.y; - /* Forward equations - -----------------*/ - lon = adjust_lon(lon - this.long0); - - if (this.sphere) { - if (!this.m) { - lat = this.n !== 1 ? Math.asin(this.n * Math.sin(lat)) : lat; - } - else { - var k = this.n * Math.sin(lat); - for (var i = MAX_ITER$3; i; --i) { - var V = (this.m * lat + Math.sin(lat) - k) / (this.m + Math.cos(lat)); - lat -= V; - if (Math.abs(V) < EPSLN) { - break; - } - } - } - x = this.a * this.C_x * lon * (this.m + Math.cos(lat)); - y = this.a * this.C_y * lat; - - } - else { - - var s = Math.sin(lat); - var c = Math.cos(lat); - y = this.a * pj_mlfn(lat, s, c, this.en); - x = this.a * lon * c / Math.sqrt(1 - this.es * s * s); - } - - p.x = x; - p.y = y; - return p; - } - - function inverse$20(p) { - var lat, temp, lon, s; - - p.x -= this.x0; - lon = p.x / this.a; - p.y -= this.y0; - lat = p.y / this.a; - - if (this.sphere) { - lat /= this.C_y; - lon = lon / (this.C_x * (this.m + Math.cos(lat))); - if (this.m) { - lat = asinz((this.m * lat + Math.sin(lat)) / this.n); - } - else if (this.n !== 1) { - lat = asinz(Math.sin(lat) / this.n); - } - lon = adjust_lon(lon + this.long0); - lat = adjust_lat(lat); - } - else { - lat = pj_inv_mlfn(p.y / this.a, this.es, this.en); - s = Math.abs(lat); - if (s < HALF_PI) { - s = Math.sin(lat); - temp = this.long0 + p.x * Math.sqrt(1 - this.es * s * s) / (this.a * Math.cos(lat)); - //temp = this.long0 + p.x / (this.a * Math.cos(lat)); - lon = adjust_lon(temp); - } - else if ((s - EPSLN) < HALF_PI) { - lon = this.long0; - } - } - p.x = lon; - p.y = lat; - return p; - } - - var names$22 = ["Sinusoidal", "sinu"]; - var sinu = { - init: init$21, - forward: forward$20, - inverse: inverse$20, - names: names$22 - }; - - function init$22() {} - /* Mollweide forward equations--mapping lat,long to x,y - ----------------------------------------------------*/ - function forward$21(p) { - - /* Forward equations - -----------------*/ - var lon = p.x; - var lat = p.y; - - var delta_lon = adjust_lon(lon - this.long0); - var theta = lat; - var con = Math.PI * Math.sin(lat); - - /* Iterate using the Newton-Raphson method to find theta - -----------------------------------------------------*/ - for (var i = 0; true; i++) { - var delta_theta = -(theta + Math.sin(theta) - con) / (1 + Math.cos(theta)); - theta += delta_theta; - if (Math.abs(delta_theta) < EPSLN) { - break; - } - } - theta /= 2; - - /* If the latitude is 90 deg, force the x coordinate to be "0 + false easting" - this is done here because of precision problems with "cos(theta)" - --------------------------------------------------------------------------*/ - if (Math.PI / 2 - Math.abs(lat) < EPSLN) { - delta_lon = 0; - } - var x = 0.900316316158 * this.a * delta_lon * Math.cos(theta) + this.x0; - var y = 1.4142135623731 * this.a * Math.sin(theta) + this.y0; - - p.x = x; - p.y = y; - return p; - } - - function inverse$21(p) { - var theta; - var arg; - - /* Inverse equations - -----------------*/ - p.x -= this.x0; - p.y -= this.y0; - arg = p.y / (1.4142135623731 * this.a); - - /* Because of division by zero problems, 'arg' can not be 1. Therefore - a number very close to one is used instead. - -------------------------------------------------------------------*/ - if (Math.abs(arg) > 0.999999999999) { - arg = 0.999999999999; - } - theta = Math.asin(arg); - var lon = adjust_lon(this.long0 + (p.x / (0.900316316158 * this.a * Math.cos(theta)))); - if (lon < (-Math.PI)) { - lon = -Math.PI; - } - if (lon > Math.PI) { - lon = Math.PI; - } - arg = (2 * theta + Math.sin(2 * theta)) / Math.PI; - if (Math.abs(arg) > 1) { - arg = 1; - } - var lat = Math.asin(arg); - - p.x = lon; - p.y = lat; - return p; - } - - var names$23 = ["Mollweide", "moll"]; - var moll = { - init: init$22, - forward: forward$21, - inverse: inverse$21, - names: names$23 - }; - - function init$23() { - - /* Place parameters in static storage for common use - -------------------------------------------------*/ - // Standard Parallels cannot be equal and on opposite sides of the equator - if (Math.abs(this.lat1 + this.lat2) < EPSLN) { - return; - } - this.lat2 = this.lat2 || this.lat1; - this.temp = this.b / this.a; - this.es = 1 - Math.pow(this.temp, 2); - this.e = Math.sqrt(this.es); - this.e0 = e0fn(this.es); - this.e1 = e1fn(this.es); - this.e2 = e2fn(this.es); - this.e3 = e3fn(this.es); - - this.sinphi = Math.sin(this.lat1); - this.cosphi = Math.cos(this.lat1); - - this.ms1 = msfnz(this.e, this.sinphi, this.cosphi); - this.ml1 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat1); - - if (Math.abs(this.lat1 - this.lat2) < EPSLN) { - this.ns = this.sinphi; - } - else { - this.sinphi = Math.sin(this.lat2); - this.cosphi = Math.cos(this.lat2); - this.ms2 = msfnz(this.e, this.sinphi, this.cosphi); - this.ml2 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat2); - this.ns = (this.ms1 - this.ms2) / (this.ml2 - this.ml1); - } - this.g = this.ml1 + this.ms1 / this.ns; - this.ml0 = mlfn(this.e0, this.e1, this.e2, this.e3, this.lat0); - this.rh = this.a * (this.g - this.ml0); - } - - /* Equidistant Conic forward equations--mapping lat,long to x,y - -----------------------------------------------------------*/ - function forward$22(p) { - var lon = p.x; - var lat = p.y; - var rh1; - - /* Forward equations - -----------------*/ - if (this.sphere) { - rh1 = this.a * (this.g - lat); - } - else { - var ml = mlfn(this.e0, this.e1, this.e2, this.e3, lat); - rh1 = this.a * (this.g - ml); - } - var theta = this.ns * adjust_lon(lon - this.long0); - var x = this.x0 + rh1 * Math.sin(theta); - var y = this.y0 + this.rh - rh1 * Math.cos(theta); - p.x = x; - p.y = y; - return p; - } - - /* Inverse equations - -----------------*/ - function inverse$22(p) { - p.x -= this.x0; - p.y = this.rh - p.y + this.y0; - var con, rh1, lat, lon; - if (this.ns >= 0) { - rh1 = Math.sqrt(p.x * p.x + p.y * p.y); - con = 1; - } - else { - rh1 = -Math.sqrt(p.x * p.x + p.y * p.y); - con = -1; - } - var theta = 0; - if (rh1 !== 0) { - theta = Math.atan2(con * p.x, con * p.y); - } - - if (this.sphere) { - lon = adjust_lon(this.long0 + theta / this.ns); - lat = adjust_lat(this.g - rh1 / this.a); - p.x = lon; - p.y = lat; - return p; - } - else { - var ml = this.g - rh1 / this.a; - lat = imlfn(ml, this.e0, this.e1, this.e2, this.e3); - lon = adjust_lon(this.long0 + theta / this.ns); - p.x = lon; - p.y = lat; - return p; - } - - } - - var names$24 = ["Equidistant_Conic", "eqdc"]; - var eqdc = { - init: init$23, - forward: forward$22, - inverse: inverse$22, - names: names$24 - }; - - /* Initialize the Van Der Grinten projection - ----------------------------------------*/ - function init$24() { - //this.R = 6370997; //Radius of earth - this.R = this.a; - } - - function forward$23(p) { - - var lon = p.x; - var lat = p.y; - - /* Forward equations - -----------------*/ - var dlon = adjust_lon(lon - this.long0); - var x, y; - - if (Math.abs(lat) <= EPSLN) { - x = this.x0 + this.R * dlon; - y = this.y0; - } - var theta = asinz(2 * Math.abs(lat / Math.PI)); - if ((Math.abs(dlon) <= EPSLN) || (Math.abs(Math.abs(lat) - HALF_PI) <= EPSLN)) { - x = this.x0; - if (lat >= 0) { - y = this.y0 + Math.PI * this.R * Math.tan(0.5 * theta); - } - else { - y = this.y0 + Math.PI * this.R * -Math.tan(0.5 * theta); - } - // return(OK); - } - var al = 0.5 * Math.abs((Math.PI / dlon) - (dlon / Math.PI)); - var asq = al * al; - var sinth = Math.sin(theta); - var costh = Math.cos(theta); - - var g = costh / (sinth + costh - 1); - var gsq = g * g; - var m = g * (2 / sinth - 1); - var msq = m * m; - var con = Math.PI * this.R * (al * (g - msq) + Math.sqrt(asq * (g - msq) * (g - msq) - (msq + asq) * (gsq - msq))) / (msq + asq); - if (dlon < 0) { - con = -con; - } - x = this.x0 + con; - //con = Math.abs(con / (Math.PI * this.R)); - var q = asq + g; - con = Math.PI * this.R * (m * q - al * Math.sqrt((msq + asq) * (asq + 1) - q * q)) / (msq + asq); - if (lat >= 0) { - //y = this.y0 + Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); - y = this.y0 + con; - } - else { - //y = this.y0 - Math.PI * this.R * Math.sqrt(1 - con * con - 2 * al * con); - y = this.y0 - con; - } - p.x = x; - p.y = y; - return p; - } - - /* Van Der Grinten inverse equations--mapping x,y to lat/long - ---------------------------------------------------------*/ - function inverse$23(p) { - var lon, lat; - var xx, yy, xys, c1, c2, c3; - var a1; - var m1; - var con; - var th1; - var d; - - /* inverse equations - -----------------*/ - p.x -= this.x0; - p.y -= this.y0; - con = Math.PI * this.R; - xx = p.x / con; - yy = p.y / con; - xys = xx * xx + yy * yy; - c1 = -Math.abs(yy) * (1 + xys); - c2 = c1 - 2 * yy * yy + xx * xx; - c3 = -2 * c1 + 1 + 2 * yy * yy + xys * xys; - d = yy * yy / c3 + (2 * c2 * c2 * c2 / c3 / c3 / c3 - 9 * c1 * c2 / c3 / c3) / 27; - a1 = (c1 - c2 * c2 / 3 / c3) / c3; - m1 = 2 * Math.sqrt(-a1 / 3); - con = ((3 * d) / a1) / m1; - if (Math.abs(con) > 1) { - if (con >= 0) { - con = 1; - } - else { - con = -1; - } - } - th1 = Math.acos(con) / 3; - if (p.y >= 0) { - lat = (-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; - } - else { - lat = -(-m1 * Math.cos(th1 + Math.PI / 3) - c2 / 3 / c3) * Math.PI; - } - - if (Math.abs(xx) < EPSLN) { - lon = this.long0; - } - else { - lon = adjust_lon(this.long0 + Math.PI * (xys - 1 + Math.sqrt(1 + 2 * (xx * xx - yy * yy) + xys * xys)) / 2 / xx); - } - - p.x = lon; - p.y = lat; - return p; - } - - var names$25 = ["Van_der_Grinten_I", "VanDerGrinten", "vandg"]; - var vandg = { - init: init$24, - forward: forward$23, - inverse: inverse$23, - names: names$25 - }; - - function init$25() { - this.sin_p12 = Math.sin(this.lat0); - this.cos_p12 = Math.cos(this.lat0); - } - - function forward$24(p) { - var lon = p.x; - var lat = p.y; - var sinphi = Math.sin(p.y); - var cosphi = Math.cos(p.y); - var dlon = adjust_lon(lon - this.long0); - var e0, e1, e2, e3, Mlp, Ml, tanphi, Nl1, Nl, psi, Az, G, H, GH, Hs, c, kp, cos_c, s, s2, s3, s4, s5; - if (this.sphere) { - if (Math.abs(this.sin_p12 - 1) <= EPSLN) { - //North Pole case - p.x = this.x0 + this.a * (HALF_PI - lat) * Math.sin(dlon); - p.y = this.y0 - this.a * (HALF_PI - lat) * Math.cos(dlon); - return p; - } - else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { - //South Pole case - p.x = this.x0 + this.a * (HALF_PI + lat) * Math.sin(dlon); - p.y = this.y0 + this.a * (HALF_PI + lat) * Math.cos(dlon); - return p; - } - else { - //default case - cos_c = this.sin_p12 * sinphi + this.cos_p12 * cosphi * Math.cos(dlon); - c = Math.acos(cos_c); - kp = c / Math.sin(c); - p.x = this.x0 + this.a * kp * cosphi * Math.sin(dlon); - p.y = this.y0 + this.a * kp * (this.cos_p12 * sinphi - this.sin_p12 * cosphi * Math.cos(dlon)); - return p; - } - } - else { - e0 = e0fn(this.es); - e1 = e1fn(this.es); - e2 = e2fn(this.es); - e3 = e3fn(this.es); - if (Math.abs(this.sin_p12 - 1) <= EPSLN) { - //North Pole case - Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); - Ml = this.a * mlfn(e0, e1, e2, e3, lat); - p.x = this.x0 + (Mlp - Ml) * Math.sin(dlon); - p.y = this.y0 - (Mlp - Ml) * Math.cos(dlon); - return p; - } - else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { - //South Pole case - Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); - Ml = this.a * mlfn(e0, e1, e2, e3, lat); - p.x = this.x0 + (Mlp + Ml) * Math.sin(dlon); - p.y = this.y0 + (Mlp + Ml) * Math.cos(dlon); - return p; - } - else { - //Default case - tanphi = sinphi / cosphi; - Nl1 = gN(this.a, this.e, this.sin_p12); - Nl = gN(this.a, this.e, sinphi); - psi = Math.atan((1 - this.es) * tanphi + this.es * Nl1 * this.sin_p12 / (Nl * cosphi)); - Az = Math.atan2(Math.sin(dlon), this.cos_p12 * Math.tan(psi) - this.sin_p12 * Math.cos(dlon)); - if (Az === 0) { - s = Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); - } - else if (Math.abs(Math.abs(Az) - Math.PI) <= EPSLN) { - s = -Math.asin(this.cos_p12 * Math.sin(psi) - this.sin_p12 * Math.cos(psi)); - } - else { - s = Math.asin(Math.sin(dlon) * Math.cos(psi) / Math.sin(Az)); - } - G = this.e * this.sin_p12 / Math.sqrt(1 - this.es); - H = this.e * this.cos_p12 * Math.cos(Az) / Math.sqrt(1 - this.es); - GH = G * H; - Hs = H * H; - s2 = s * s; - s3 = s2 * s; - s4 = s3 * s; - s5 = s4 * s; - c = Nl1 * s * (1 - s2 * Hs * (1 - Hs) / 6 + s3 / 8 * GH * (1 - 2 * Hs) + s4 / 120 * (Hs * (4 - 7 * Hs) - 3 * G * G * (1 - 7 * Hs)) - s5 / 48 * GH); - p.x = this.x0 + c * Math.sin(Az); - p.y = this.y0 + c * Math.cos(Az); - return p; - } - } - - - } - - function inverse$24(p) { - p.x -= this.x0; - p.y -= this.y0; - var rh, z, sinz, cosz, lon, lat, con, e0, e1, e2, e3, Mlp, M, N1, psi, Az, cosAz, tmp, A, B, D, Ee, F; - if (this.sphere) { - rh = Math.sqrt(p.x * p.x + p.y * p.y); - if (rh > (2 * HALF_PI * this.a)) { - return; - } - z = rh / this.a; - - sinz = Math.sin(z); - cosz = Math.cos(z); - - lon = this.long0; - if (Math.abs(rh) <= EPSLN) { - lat = this.lat0; - } - else { - lat = asinz(cosz * this.sin_p12 + (p.y * sinz * this.cos_p12) / rh); - con = Math.abs(this.lat0) - HALF_PI; - if (Math.abs(con) <= EPSLN) { - if (this.lat0 >= 0) { - lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y)); - } - else { - lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); - } - } - else { - /*con = cosz - this.sin_p12 * Math.sin(lat); - if ((Math.abs(con) < EPSLN) && (Math.abs(p.x) < EPSLN)) { - //no-op, just keep the lon value as is - } else { - var temp = Math.atan2((p.x * sinz * this.cos_p12), (con * rh)); - lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz * this.cos_p12), (con * rh))); - }*/ - lon = adjust_lon(this.long0 + Math.atan2(p.x * sinz, rh * this.cos_p12 * cosz - p.y * this.sin_p12 * sinz)); - } - } - - p.x = lon; - p.y = lat; - return p; - } - else { - e0 = e0fn(this.es); - e1 = e1fn(this.es); - e2 = e2fn(this.es); - e3 = e3fn(this.es); - if (Math.abs(this.sin_p12 - 1) <= EPSLN) { - //North pole case - Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); - rh = Math.sqrt(p.x * p.x + p.y * p.y); - M = Mlp - rh; - lat = imlfn(M / this.a, e0, e1, e2, e3); - lon = adjust_lon(this.long0 + Math.atan2(p.x, - 1 * p.y)); - p.x = lon; - p.y = lat; - return p; - } - else if (Math.abs(this.sin_p12 + 1) <= EPSLN) { - //South pole case - Mlp = this.a * mlfn(e0, e1, e2, e3, HALF_PI); - rh = Math.sqrt(p.x * p.x + p.y * p.y); - M = rh - Mlp; - - lat = imlfn(M / this.a, e0, e1, e2, e3); - lon = adjust_lon(this.long0 + Math.atan2(p.x, p.y)); - p.x = lon; - p.y = lat; - return p; - } - else { - //default case - rh = Math.sqrt(p.x * p.x + p.y * p.y); - Az = Math.atan2(p.x, p.y); - N1 = gN(this.a, this.e, this.sin_p12); - cosAz = Math.cos(Az); - tmp = this.e * this.cos_p12 * cosAz; - A = -tmp * tmp / (1 - this.es); - B = 3 * this.es * (1 - A) * this.sin_p12 * this.cos_p12 * cosAz / (1 - this.es); - D = rh / N1; - Ee = D - A * (1 + A) * Math.pow(D, 3) / 6 - B * (1 + 3 * A) * Math.pow(D, 4) / 24; - F = 1 - A * Ee * Ee / 2 - D * Ee * Ee * Ee / 6; - psi = Math.asin(this.sin_p12 * Math.cos(Ee) + this.cos_p12 * Math.sin(Ee) * cosAz); - lon = adjust_lon(this.long0 + Math.asin(Math.sin(Az) * Math.sin(Ee) / Math.cos(psi))); - lat = Math.atan((1 - this.es * F * this.sin_p12 / Math.sin(psi)) * Math.tan(psi) / (1 - this.es)); - p.x = lon; - p.y = lat; - return p; - } - } - - } - - var names$26 = ["Azimuthal_Equidistant", "aeqd"]; - var aeqd = { - init: init$25, - forward: forward$24, - inverse: inverse$24, - names: names$26 - }; - - function init$26() { - //double temp; /* temporary variable */ - - /* Place parameters in static storage for common use - -------------------------------------------------*/ - this.sin_p14 = Math.sin(this.lat0); - this.cos_p14 = Math.cos(this.lat0); - } - - /* Orthographic forward equations--mapping lat,long to x,y - ---------------------------------------------------*/ - function forward$25(p) { - var sinphi, cosphi; /* sin and cos value */ - var dlon; /* delta longitude value */ - var coslon; /* cos of longitude */ - var ksp; /* scale factor */ - var g, x, y; - var lon = p.x; - var lat = p.y; - /* Forward equations - -----------------*/ - dlon = adjust_lon(lon - this.long0); - - sinphi = Math.sin(lat); - cosphi = Math.cos(lat); - - coslon = Math.cos(dlon); - g = this.sin_p14 * sinphi + this.cos_p14 * cosphi * coslon; - ksp = 1; - if ((g > 0) || (Math.abs(g) <= EPSLN)) { - x = this.a * ksp * cosphi * Math.sin(dlon); - y = this.y0 + this.a * ksp * (this.cos_p14 * sinphi - this.sin_p14 * cosphi * coslon); - } - p.x = x; - p.y = y; - return p; - } - - function inverse$25(p) { - var rh; /* height above ellipsoid */ - var z; /* angle */ - var sinz, cosz; /* sin of z and cos of z */ - var con; - var lon, lat; - /* Inverse equations - -----------------*/ - p.x -= this.x0; - p.y -= this.y0; - rh = Math.sqrt(p.x * p.x + p.y * p.y); - z = asinz(rh / this.a); - - sinz = Math.sin(z); - cosz = Math.cos(z); - - lon = this.long0; - if (Math.abs(rh) <= EPSLN) { - lat = this.lat0; - p.x = lon; - p.y = lat; - return p; - } - lat = asinz(cosz * this.sin_p14 + (p.y * sinz * this.cos_p14) / rh); - con = Math.abs(this.lat0) - HALF_PI; - if (Math.abs(con) <= EPSLN) { - if (this.lat0 >= 0) { - lon = adjust_lon(this.long0 + Math.atan2(p.x, - p.y)); - } - else { - lon = adjust_lon(this.long0 - Math.atan2(-p.x, p.y)); - } - p.x = lon; - p.y = lat; - return p; - } - lon = adjust_lon(this.long0 + Math.atan2((p.x * sinz), rh * this.cos_p14 * cosz - p.y * this.sin_p14 * sinz)); - p.x = lon; - p.y = lat; - return p; - } - - var names$27 = ["ortho"]; - var ortho = { - init: init$26, - forward: forward$25, - inverse: inverse$25, - names: names$27 - }; - - function init$27() { - this.isGeocent = true; - } - - function identity$1(pt) { - return pt; - } - var names$28 = ["geocent"]; - var geocent = { - init: init$27, - forward: identity$1, - inverse: identity$1, - names: names$28 - }; - - function init$28() { - - 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.face_enum = { - FRONT: 1, - RIGHT: 2, - BACK: 3, - LEFT: 4, - TOP: 5, - BOTTOM: 6 - }; - - this.area_enum = { - AREA_0: 1, - AREA_1: 2, - AREA_2: 3, - AREA_3: 4 - }; - - /* Determine the cube face from the center of projection. */ - if (this.lat0 >= HALF_PI - FORTPI / 2.0) { - this.face = this.face_enum.TOP; - } else if (this.lat0 <= -(HALF_PI - FORTPI / 2.0)) { - this.face = this.face_enum.BOTTOM; - } else if (Math.abs(this.long0) <= FORTPI) { - this.face = this.face_enum.FRONT; - } else if (Math.abs(this.long0) <= HALF_PI + FORTPI) { - this.face = this.long0 > 0.0 ? this.face_enum.RIGHT : this.face_enum.LEFT; - } else { - this.face = this.face_enum.BACK; - } - - //this.es = 1 - (this.b * this.b) / (this.a * this.a); - - /* Fill in useful values for the ellipsoid <-> sphere shift - * described in [LK12]. */ - if (this.es !== 0.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; - } - } - - // QSC forward equations--mapping lat,long to x,y - // ----------------------------------------------------------------- - function forward$26(p) { - var xy = {x: 0, y: 0.0}; - var lat, lon; - var theta, phi; - var t, mu; - /* nu; */ - var area = {value: 0}; - - // move lon according to projection's lon - p.x -= this.long0; - - /* Convert the geodetic latitude to a geocentric latitude. - * This corresponds to the shift from the ellipsoid to the sphere - * described in [LK12]. */ - if (this.es !== 0) {//if (P->es != 0.0) { - lat = Math.atan(this.one_minus_f_squared * Math.tan(p.y)); - } else { - lat = p.y; - } - - /* Convert the input lat, lon into theta, phi as used by QSC. - * This depends on the cube face and the area on it. - * For the top and bottom face, we can compute theta and phi - * directly from phi, lam. For the other faces, we must use - * unit sphere cartesian coordinates as an intermediate step. */ - lon = p.x; //lon = lp.lam; - if (this.face === this.face_enum.TOP) { - phi = HALF_PI - lat; - if (lon >= FORTPI && lon <= HALF_PI + FORTPI) { - area.value = this.area_enum.AREA_0; - theta = lon - HALF_PI; - } else if (lon > HALF_PI + FORTPI || lon <= -(HALF_PI + FORTPI)) { - area.value = this.area_enum.AREA_1; - theta = (lon > 0.0 ? lon - SPI : lon + SPI); - } else if (lon > -(HALF_PI + FORTPI) && lon <= -FORTPI) { - area.value = this.area_enum.AREA_2; - theta = lon + HALF_PI; - } else { - area.value = this.area_enum.AREA_3; - theta = lon; - } - } else if (this.face === this.face_enum.BOTTOM) { - phi = HALF_PI + lat; - if (lon >= FORTPI && lon <= HALF_PI + FORTPI) { - area.value = this.area_enum.AREA_0; - theta = -lon + HALF_PI; - } else if (lon < FORTPI && lon >= -FORTPI) { - area.value = this.area_enum.AREA_1; - theta = -lon; - } else if (lon < -FORTPI && lon >= -(HALF_PI + FORTPI)) { - area.value = this.area_enum.AREA_2; - theta = -lon - HALF_PI; - } else { - area.value = this.area_enum.AREA_3; - theta = (lon > 0.0 ? -lon + SPI : -lon - SPI); - } - } else { - var q, r, s; - var sinlat, coslat; - var sinlon, coslon; - - if (this.face === this.face_enum.RIGHT) { - lon = this.qsc_shift_lon_origin(lon, +HALF_PI); - } else if (this.face === this.face_enum.BACK) { - lon = this.qsc_shift_lon_origin(lon, +SPI); - } else if (this.face === this.face_enum.LEFT) { - lon = this.qsc_shift_lon_origin(lon, -HALF_PI); - } - sinlat = Math.sin(lat); - coslat = Math.cos(lat); - sinlon = Math.sin(lon); - coslon = Math.cos(lon); - q = coslat * coslon; - r = coslat * sinlon; - s = sinlat; - - if (this.face === this.face_enum.FRONT) { - phi = Math.acos(q); - theta = this.qsc_fwd_equat_face_theta(phi, s, r, area); - } else if (this.face === this.face_enum.RIGHT) { - phi = Math.acos(r); - theta = this.qsc_fwd_equat_face_theta(phi, s, -q, area); - } else if (this.face === this.face_enum.BACK) { - phi = Math.acos(-q); - theta = this.qsc_fwd_equat_face_theta(phi, s, -r, area); - } else if (this.face === this.face_enum.LEFT) { - phi = Math.acos(-r); - theta = this.qsc_fwd_equat_face_theta(phi, s, q, area); - } else { - /* Impossible */ - phi = theta = 0.0; - area.value = this.area_enum.AREA_0; - } - } - - /* Compute mu and nu for the area of definition. - * For mu, see Eq. (3-21) in [OL76], but note the typos: - * compare with Eq. (3-14). For nu, see Eq. (3-38). */ - mu = Math.atan((12.0 / SPI) * (theta + Math.acos(Math.sin(theta) * Math.cos(FORTPI)) - HALF_PI)); - t = Math.sqrt((1.0 - Math.cos(phi)) / (Math.cos(mu) * Math.cos(mu)) / (1.0 - Math.cos(Math.atan(1.0 / Math.cos(theta))))); - - /* Apply the result to the real area. */ - if (area.value === this.area_enum.AREA_1) { - mu += HALF_PI; - } else if (area.value === this.area_enum.AREA_2) { - mu += SPI; - } else if (area.value === this.area_enum.AREA_3) { - mu += 1.5 * SPI; - } - - /* Now compute x, y from mu and nu */ - /* t = Math.tan(nu); */ - xy.x = t * Math.cos(mu); - xy.y = t * Math.sin(mu); - xy.x = xy.x * this.a + this.x0; - xy.y = xy.y * this.a + this.y0; - - p.x = xy.x; - p.y = xy.y; - return p; - } - - // QSC inverse equations--mapping x,y to lat/long - // ----------------------------------------------------------------- - function inverse$26(p) { - var lp = {lam: 0, phi: 0.0}; - //struct pj_opaque *Q = P->opaque; - var mu, nu, cosmu, tannu; - var tantheta, theta, cosphi, phi; - var t; - var area = {value: 0}; - - /* de-offset */ - p.x = (p.x - this.x0) / this.a; - p.y = (p.y - this.y0) / this.a; - - /* Convert the input x, y to the mu and nu angles as used by QSC. - * This depends on the area of the cube face. */ - nu = Math.atan(Math.sqrt(p.x * p.x + p.y * p.y)); - mu = Math.atan2(p.y, p.x); - if (p.x >= 0.0 && p.x >= Math.abs(p.y)) { - area.value = this.area_enum.AREA_0; - } else if (p.y >= 0.0 && p.y >= Math.abs(p.x)) { - area.value = this.area_enum.AREA_1; - mu -= HALF_PI; - } else if (p.x < 0.0 && -p.x >= Math.abs(p.y)) { - area.value = this.area_enum.AREA_2; - mu = (mu < 0.0 ? mu + SPI : mu - SPI); - } else { - area.value = this.area_enum.AREA_3; - mu += HALF_PI; - } - - /* Compute phi and theta for the area of definition. - * The inverse projection is not described in the original paper, but some - * good hints can be found here (as of 2011-12-14): - * http://fits.gsfc.nasa.gov/fitsbits/saf.93/saf.9302 - * (search for "Message-Id: <9302181759.AA25477 at fits.cv.nrao.edu>") */ - t = (SPI / 12.0) * Math.tan(mu); - tantheta = Math.sin(t) / (Math.cos(t) - (1.0 / Math.sqrt(2.0))); - theta = Math.atan(tantheta); - cosmu = Math.cos(mu); - tannu = Math.tan(nu); - cosphi = 1.0 - cosmu * cosmu * tannu * tannu * (1.0 - Math.cos(Math.atan(1.0 / Math.cos(theta)))); - if (cosphi < -1.0) { - cosphi = -1.0; - } else if (cosphi > +1.0) { - cosphi = +1.0; - } - - /* Apply the result to the real area on the cube face. - * For the top and bottom face, we can compute phi and lam directly. - * For the other faces, we must use unit sphere cartesian coordinates - * as an intermediate step. */ - if (this.face === this.face_enum.TOP) { - phi = Math.acos(cosphi); - lp.phi = HALF_PI - phi; - if (area.value === this.area_enum.AREA_0) { - lp.lam = theta + HALF_PI; - } else if (area.value === this.area_enum.AREA_1) { - lp.lam = (theta < 0.0 ? theta + SPI : theta - SPI); - } else if (area.value === this.area_enum.AREA_2) { - lp.lam = theta - HALF_PI; - } else /* area.value == this.area_enum.AREA_3 */ { - lp.lam = theta; - } - } else if (this.face === this.face_enum.BOTTOM) { - phi = Math.acos(cosphi); - lp.phi = phi - HALF_PI; - if (area.value === this.area_enum.AREA_0) { - lp.lam = -theta + HALF_PI; - } else if (area.value === this.area_enum.AREA_1) { - lp.lam = -theta; - } else if (area.value === this.area_enum.AREA_2) { - lp.lam = -theta - HALF_PI; - } else /* area.value == this.area_enum.AREA_3 */ { - lp.lam = (theta < 0.0 ? -theta - SPI : -theta + SPI); - } - } else { - /* Compute phi and lam via cartesian unit sphere coordinates. */ - var q, r, s; - q = cosphi; - t = q * q; - if (t >= 1.0) { - s = 0.0; - } else { - s = Math.sqrt(1.0 - t) * Math.sin(theta); - } - t += s * s; - if (t >= 1.0) { - r = 0.0; - } else { - r = Math.sqrt(1.0 - t); - } - /* Rotate q,r,s into the correct area. */ - if (area.value === this.area_enum.AREA_1) { - t = r; - r = -s; - s = t; - } else if (area.value === this.area_enum.AREA_2) { - r = -r; - s = -s; - } else if (area.value === this.area_enum.AREA_3) { - t = r; - r = s; - s = -t; - } - /* Rotate q,r,s into the correct cube face. */ - if (this.face === this.face_enum.RIGHT) { - t = q; - q = -r; - r = t; - } else if (this.face === this.face_enum.BACK) { - q = -q; - r = -r; - } else if (this.face === this.face_enum.LEFT) { - t = q; - q = r; - r = -t; - } - /* Now compute phi and lam from the unit sphere coordinates. */ - lp.phi = Math.acos(-s) - HALF_PI; - lp.lam = Math.atan2(r, q); - if (this.face === this.face_enum.RIGHT) { - lp.lam = this.qsc_shift_lon_origin(lp.lam, -HALF_PI); - } else if (this.face === this.face_enum.BACK) { - lp.lam = this.qsc_shift_lon_origin(lp.lam, -SPI); - } else if (this.face === this.face_enum.LEFT) { - lp.lam = this.qsc_shift_lon_origin(lp.lam, +HALF_PI); - } - } - - /* Apply the shift from the sphere to the ellipsoid as described - * in [LK12]. */ - if (this.es !== 0.0) { - var invert_sign; - var tanphi, xa; - invert_sign = (lp.phi < 0.0 ? 1 : 0); - tanphi = Math.tan(lp.phi); - xa = this.b / Math.sqrt(tanphi * tanphi + this.one_minus_f_squared); - lp.phi = Math.atan(Math.sqrt(this.a * this.a - xa * xa) / (this.one_minus_f * xa)); - if (invert_sign) { - lp.phi = -lp.phi; - } - } - - lp.lam += this.long0; - p.x = lp.lam; - p.y = lp.phi; - return p; - } - - /* Helper function for forward projection: compute the theta angle - * and determine the area number. */ - function qsc_fwd_equat_face_theta(phi, y, x, area) { - var theta; - if (phi < EPSLN) { - area.value = this.area_enum.AREA_0; - theta = 0.0; - } else { - theta = Math.atan2(y, x); - if (Math.abs(theta) <= FORTPI) { - area.value = this.area_enum.AREA_0; - } else if (theta > FORTPI && theta <= HALF_PI + FORTPI) { - area.value = this.area_enum.AREA_1; - theta -= HALF_PI; - } else if (theta > HALF_PI + FORTPI || theta <= -(HALF_PI + FORTPI)) { - area.value = this.area_enum.AREA_2; - theta = (theta >= 0.0 ? theta - SPI : theta + SPI); - } else { - area.value = this.area_enum.AREA_3; - theta += HALF_PI; - } - } - return theta; - } - - /* Helper function: shift the longitude. */ - function qsc_shift_lon_origin(lon, offset) { - var slon = lon + offset; - if (slon < -SPI) { - slon += TWO_PI; - } else if (slon > +SPI) { - slon -= TWO_PI; - } - return slon; - } - - var names$29 = ["Quadrilateralized Spherical Cube", "qsc"]; - var qsc = { - init: init$28, - forward: forward$26, - inverse: inverse$26, - names: names$29, - qsc_fwd_equat_face_theta: qsc_fwd_equat_face_theta, - qsc_shift_lon_origin: qsc_shift_lon_origin - }; - - var includedProjections = function(_mproj4_){ - _mproj4_.Proj.projections.add(tmerc); - _mproj4_.Proj.projections.add(etmerc); - _mproj4_.Proj.projections.add(utm); - _mproj4_.Proj.projections.add(sterea); - _mproj4_.Proj.projections.add(stere); - _mproj4_.Proj.projections.add(somerc); - _mproj4_.Proj.projections.add(omerc); - _mproj4_.Proj.projections.add(lcc); - _mproj4_.Proj.projections.add(krovak); - _mproj4_.Proj.projections.add(cass); - _mproj4_.Proj.projections.add(laea); - _mproj4_.Proj.projections.add(aea); - _mproj4_.Proj.projections.add(gnom); - _mproj4_.Proj.projections.add(cea); - _mproj4_.Proj.projections.add(eqc); - _mproj4_.Proj.projections.add(poly); - _mproj4_.Proj.projections.add(nzmg); - _mproj4_.Proj.projections.add(mill); - _mproj4_.Proj.projections.add(sinu); - _mproj4_.Proj.projections.add(moll); - _mproj4_.Proj.projections.add(eqdc); - _mproj4_.Proj.projections.add(vandg); - _mproj4_.Proj.projections.add(aeqd); - _mproj4_.Proj.projections.add(ortho); - _mproj4_.Proj.projections.add(geocent); - _mproj4_.Proj.projections.add(qsc); - }; - - _mproj4_$1.defaultDatum = 'WGS84'; //default datum - _mproj4_$1.Proj = Projection$1; - _mproj4_$1.WGS84 = new _mproj4_$1.Proj('WGS84'); - _mproj4_$1.Point = Point; - _mproj4_$1.toPoint = toPoint; - _mproj4_$1.defs = defs; - _mproj4_$1.transform = transform; - _mproj4_$1.mgrs = mgrs; - _mproj4_$1.version = version; - includedProjections(_mproj4_$1); - - return _mproj4_$1; - -}))); diff --git a/src/core/utils/libs/proj4.js b/src/core/utils/libs/proj4.js deleted file mode 100755 index 1ce0a77a..00000000 --- a/src/core/utils/libs/proj4.js +++ /dev/null @@ -1,3 +0,0 @@ -!function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a._mproj4_=b()}(this,function(){"use strict";function a(a,b){if(a[b])return a[b];for(var c,d,e=Object.keys(a),f=b.toLowerCase().replace(Vb,""),g=-1;++g0?90:-90),a.lat_ts=a.lat1)}function i(a){var b=this;if(2===arguments.length){var c=arguments[1];"string"==typeof c?"+"===c.charAt(0)?i[a]=Wb(arguments[1]):i[a]=hc(arguments[1]):i[a]=c}else if(1===arguments.length){if(Array.isArray(a))return a.map(function(a){Array.isArray(a)?i.apply(b,a):i(a)});if("string"==typeof a){if(a in i)return i[a]}else"EPSG"in a?i["EPSG:"+a.EPSG]=a:"ESRI"in a?i["ESRI:"+a.ESRI]=a:"IAU2000"in a?i["IAU2000:"+a.IAU2000]=a:console.log(a);return}}function j(a){return"string"==typeof a}function k(a){return a in i}function l(a){return ic.some(function(b){return a.indexOf(b)>-1})}function m(a){return"+"===a[0]}function n(a){return j(a)?k(a)?i[a]:l(a)?hc(a):m(a)?Wb(a):void 0:a}function o(){var a=this.b/this.a;this.es=1-a*a,"x0"in this||(this.x0=0),"y0"in this||(this.y0=0),this.e=Math.sqrt(this.es),this.lat_ts?this.sphere?this.k0=Math.cos(this.lat_ts):this.k0=kc(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)):this.k0||(this.k?this.k0=this.k:this.k0=1)}function p(a){var b=a.x,c=a.y;if(c*Pb>90&&c*Pb<-90&&b*Pb>180&&b*Pb<-180)return null;var d,e;if(Math.abs(Math.abs(c)-Jb)<=Nb)return null;if(this.sphere)d=this.x0+this.a*this.k0*mc(b-this.long0),e=this.y0+this.a*this.k0*Math.log(Math.tan(Qb+.5*c));else{var f=Math.sin(c),g=nc(this.e,c,f);d=this.x0+this.a*this.k0*mc(b-this.long0),e=this.y0-this.a*this.k0*Math.log(g)}return a.x=d,a.y=e,a}function q(a){var b,c,d=a.x-this.x0,e=a.y-this.y0;if(this.sphere)c=Jb-2*Math.atan(Math.exp(-e/(this.a*this.k0)));else{var f=Math.exp(-e/(this.a*this.k0));if(c=oc(this.e,f),c===-9999)return null}return b=mc(this.long0+d/(this.a*this.k0)),a.x=b,a.y=c,a}function r(){}function s(a){return a}function t(a,b){var c=vc.length;return a.names?(vc[c]=a,a.names.forEach(function(a){uc[a.toLowerCase()]=c}),this):(console.log(b),!0)}function u(a){if(!a)return!1;var b=a.toLowerCase();return"undefined"!=typeof uc[b]&&vc[uc[b]]?vc[uc[b]]:void 0}function v(){tc.forEach(t)}function w(a,b,c,d){var e=a*a,f=b*b,g=(e-f)/e,h=0;d?(a*=1-g*(Kb+g*(Lb+g*Mb)),e=a*a,g=0):h=Math.sqrt(g);var i=(e-f)/f;return{es:g,e:h,ep2:i}}function x(b,c,d,e,f){if(!b){var g=a(xc,e);g||(g=yc),b=g.a,c=g.b,d=g.rf}return d&&!c&&(c=(1-1/d)*b),(0===d||Math.abs(b-c)3&&(0===g.datum_params[3]&&0===g.datum_params[4]&&0===g.datum_params[5]&&0===g.datum_params[6]||(g.datum_type=Fb,g.datum_params[3]*=Ib,g.datum_params[4]*=Ib,g.datum_params[5]*=Ib,g.datum_params[6]=g.datum_params[6]/1e6+1))),g.a=c,g.b=d,g.es=e,g.ep2=f,g}function z(b,c){if(!(this instanceof z))return new z(b);c=c||function(a){if(a)throw a};var d=n(b);if("object"!=typeof d)return void c(b);var e=z.projections.get(d.projName);if(!e)return void c(b);if(d.datumCode&&"none"!==d.datumCode){var f=a(zc,d.datumCode);f&&(d.datum_params=f.towgs84?f.towgs84.split(","):null,d.ellps=f.ellipse,d.datumName=f.datumName?f.datumName:d.datumCode)}d.k0=d.k0||1,d.axis=d.axis||"enu",d.ellps=d.ellps||"wgs84";var g=x(d.a,d.b,d.rf,d.ellps,d.sphere),h=w(g.a,g.b,g.rf,d.R_A),i=d.datum||y(d.datumCode,d.datum_params,g.a,g.b,h.es,h.ep2);jc(this,d),jc(this,e),this.a=g.a,this.b=g.b,this.rf=g.rf,this.sphere=g.sphere,this.es=h.es,this.e=h.e,this.ep2=h.ep2,this.datum=i,this.init(),c(null,this)}function A(a,b){return a.datum_type===b.datum_type&&(!(a.a!==b.a||Math.abs(a.es-b.es)>5e-11)&&(a.datum_type===Eb?a.datum_params[0]===b.datum_params[0]&&a.datum_params[1]===b.datum_params[1]&&a.datum_params[2]===b.datum_params[2]:a.datum_type!==Fb||a.datum_params[0]===b.datum_params[0]&&a.datum_params[1]===b.datum_params[1]&&a.datum_params[2]===b.datum_params[2]&&a.datum_params[3]===b.datum_params[3]&&a.datum_params[4]===b.datum_params[4]&&a.datum_params[5]===b.datum_params[5]&&a.datum_params[6]===b.datum_params[6]))}function B(a,b,c){var d,e,f,g,h=a.x,i=a.y,j=a.z?a.z:0;if(i<-Jb&&i>-1.001*Jb)i=-Jb;else if(i>Jb&&i<1.001*Jb)i=Jb;else if(i<-Jb||i>Jb)return null;return h>Math.PI&&(h-=2*Math.PI),e=Math.sin(i),g=Math.cos(i),f=e*e,d=c/Math.sqrt(1-b*f),{x:(d+j)*g*Math.cos(h),y:(d+j)*g*Math.sin(h),z:(d*(1-b)+j)*e}}function C(a,b,c,d){var e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u=1e-12,v=u*u,w=30,x=a.x,y=a.y,z=a.z?a.z:0;if(e=Math.sqrt(x*x+y*y),f=Math.sqrt(x*x+y*y+z*z),e/cv&&q=56&&k<64&&l>=3&&l<12&&(j=32),k>=72&&k<84&&(l>=0&&l<9?j=31:l>=9&&l<21?j=33:l>=21&&l<33?j=35:l>=33&&l<42&&(j=37)),b=6*(j-1)-180+3,i=O(b),c=n/(1-n),d=m/Math.sqrt(1-n*Math.sin(p)*Math.sin(p)),e=Math.tan(p)*Math.tan(p),f=c*Math.cos(p)*Math.cos(p),g=Math.cos(p)*(q-i),h=m*((1-n/4-3*n*n/64-5*n*n*n/256)*p-(3*n/8+3*n*n/32+45*n*n*n/1024)*Math.sin(2*p)+(15*n*n/256+45*n*n*n/1024)*Math.sin(4*p)-35*n*n*n/3072*Math.sin(6*p));var r=o*d*(g+(1-e+f)*g*g*g/6+(5-18*e+e*e+72*f-58*c)*g*g*g*g*g/120)+5e5,s=o*(h+d*Math.tan(p)*(g*g/2+(5-e+9*f+4*f*f)*g*g*g*g/24+(61-58*e+e*e+600*f-330*c)*g*g*g*g*g*g/720));return k<0&&(s+=1e7),{northing:Math.round(s),easting:Math.round(r),zoneNumber:j,zoneLetter:S(k)}}function R(a){var b=a.northing,c=a.easting,d=a.zoneLetter,e=a.zoneNumber;if(e<0||e>60)return null;var f,g,h,i,j,k,l,m,n,o,p=.9996,q=6378137,r=.00669438,s=(1-Math.sqrt(1-r))/(1+Math.sqrt(1-r)),t=c-5e5,u=b;d<"N"&&(u-=1e7),m=6*(e-1)-180+3,f=r/(1-r),l=u/p,n=l/(q*(1-r/4-3*r*r/64-5*r*r*r/256)),o=n+(3*s/2-27*s*s*s/32)*Math.sin(2*n)+(21*s*s/16-55*s*s*s*s/32)*Math.sin(4*n)+151*s*s*s/96*Math.sin(6*n),g=q/Math.sqrt(1-r*Math.sin(o)*Math.sin(o)),h=Math.tan(o)*Math.tan(o),i=f*Math.cos(o)*Math.cos(o),j=q*(1-r)/Math.pow(1-r*Math.sin(o)*Math.sin(o),1.5),k=t/(g*p);var v=o-g*Math.tan(o)/j*(k*k/2-(5+3*h+10*i-4*i*i-9*f)*k*k*k*k/24+(61+90*h+298*i+45*h*h-252*f-3*i*i)*k*k*k*k*k*k/720);v=P(v);var w=(k-(1+2*h+i)*k*k*k/6+(5-2*i+28*h-3*i*i+8*f+24*h*h)*k*k*k*k*k/120)/Math.cos(o);w=m+P(w);var x;if(a.accuracy){var y=R({northing:a.northing+a.accuracy,easting:a.easting+a.accuracy,zoneLetter:a.zoneLetter,zoneNumber:a.zoneNumber});x={top:y.lat,right:y.lon,bottom:v,left:w}}else x={lat:v,lon:w};return x}function S(a){var b="Z";return 84>=a&&a>=72?b="X":72>a&&a>=64?b="W":64>a&&a>=56?b="V":56>a&&a>=48?b="U":48>a&&a>=40?b="T":40>a&&a>=32?b="S":32>a&&a>=24?b="R":24>a&&a>=16?b="Q":16>a&&a>=8?b="P":8>a&&a>=0?b="N":0>a&&a>=-8?b="M":-8>a&&a>=-16?b="L":-16>a&&a>=-24?b="K":-24>a&&a>=-32?b="J":-32>a&&a>=-40?b="H":-40>a&&a>=-48?b="G":-48>a&&a>=-56?b="F":-56>a&&a>=-64?b="E":-64>a&&a>=-72?b="D":-72>a&&a>=-80&&(b="C"),b}function T(a,b){var c="00000"+a.easting,d="00000"+a.northing;return a.zoneNumber+a.zoneLetter+U(a.easting,a.northing,a.zoneNumber)+c.substr(c.length-5,b)+d.substr(d.length-5,b)}function U(a,b,c){var d=V(c),e=Math.floor(a/1e5),f=Math.floor(b/1e5)%20;return W(e,f,d)}function V(a){var b=a%Ec;return 0===b&&(b=Ec),b}function W(a,b,c){var d=c-1,e=Fc.charCodeAt(d),f=Gc.charCodeAt(d),g=e+a-1,h=f+b,i=!1;g>Lc&&(g=g-Lc+Hc-1,i=!0),(g===Ic||eIc||(g>Ic||eJc||(g>Jc||eLc&&(g=g-Lc+Hc-1),h>Kc?(h=h-Kc+Hc-1,i=!0):i=!1,(h===Ic||fIc||(h>Ic||fJc||(h>Jc||fKc&&(h=h-Kc+Hc-1);var j=String.fromCharCode(g)+String.fromCharCode(h);return j}function X(a){if(a&&0===a.length)throw"MGRSPoint coverting from nothing";for(var b,c=a.length,d=null,e="",f=0;!/[A-Z]/.test(b=a.charAt(f));){if(f>=2)throw"MGRSPoint bad conversion from: "+a;e+=b,f++}var g=parseInt(e,10);if(0===f||f+3>c)throw"MGRSPoint bad conversion from: "+a;var h=a.charAt(f++);if(h<="A"||"B"===h||"Y"===h||h>="Z"||"I"===h||"O"===h)throw"MGRSPoint zone letter "+h+" not handled: "+a;d=a.substring(f,f+=2);for(var i=V(g),j=Y(d.charAt(0),i),k=Z(d.charAt(1),i);k<$(h);)k+=2e6;var l=c-f;if(l%2!==0)throw"MGRSPoint has to have an even number \nof digits after the zone letter and two 100km letters - front \nhalf for easting meters, second half for \nnorthing meters"+a;var m,n,o,p,q,r=l/2,s=0,t=0;return r>0&&(m=1e5/Math.pow(10,r),n=a.substring(f,f+r),s=parseFloat(n)*m,o=a.substring(f+r),t=parseFloat(o)*m),p=s+j,q=t+k,{easting:p,northing:q,zoneLetter:h,zoneNumber:g,accuracy:m}}function Y(a,b){for(var c=Fc.charCodeAt(b-1),d=1e5,e=!1;c!==a.charCodeAt(0);){if(c++,c===Ic&&c++,c===Jc&&c++,c>Lc){if(e)throw"Bad character: "+a;c=Hc,e=!0}d+=1e5}return d}function Z(a,b){if(a>"V")throw"MGRSPoint given invalid Northing "+a;for(var c=Gc.charCodeAt(b-1),d=0,e=!1;c!==a.charCodeAt(0);){if(c++,c===Ic&&c++,c===Jc&&c++,c>Kc){if(e)throw"Bad character: "+a;c=Hc,e=!0}d+=1e5}return d}function $(a){var b;switch(a){case"C":b=11e5;break;case"D":b=2e6;break;case"E":b=28e5;break;case"F":b=37e5;break;case"G":b=46e5;break;case"H":b=55e5;break;case"J":b=64e5;break;case"K":b=73e5;break;case"L":b=82e5;break;case"M":b=91e5;break;case"N":b=0;break;case"P":b=8e5;break;case"Q":b=17e5;break;case"R":b=26e5;break;case"S":b=35e5;break;case"T":b=44e5;break;case"U":b=53e5;break;case"V":b=62e5;break;case"W":b=7e6;break;case"X":b=79e5;break;default:b=-1}if(b>=0)return b;throw"Invalid zone letter: "+a}function Point(a,b,c){if(!(this instanceof Point))return new Point(a,b,c);if(Array.isArray(a))this.x=a[0],this.y=a[1],this.z=a[2]||0;else if("object"==typeof a)this.x=a.x,this.y=a.y,this.z=a.z||0;else if("string"==typeof a&&"undefined"==typeof b){var d=a.split(",");this.x=parseFloat(d[0],10),this.y=parseFloat(d[1],10),this.z=parseFloat(d[2],10)||0}else this.x=a,this.y=b,this.z=c||0;console.warn("proj4.Point will be removed in version 3, use proj4.toPoint")}function _(){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.es&&(this.en=$c(this.es),this.ml0=_c(this.lat0,Math.sin(this.lat0),Math.cos(this.lat0),this.en))}function aa(a){var b,c,d,e=a.x,f=a.y,g=mc(e-this.long0),h=Math.sin(f),i=Math.cos(f);if(this.es){var j=i*g,k=Math.pow(j,2),l=this.ep2*Math.pow(i,2),m=Math.pow(l,2),n=Math.abs(i)>Nb?Math.tan(f):0,o=Math.pow(n,2),p=Math.pow(o,2);b=1-this.es*Math.pow(h,2),j/=Math.sqrt(b);var q=_c(f,h,i,this.en);c=this.a*(this.k0*j*(1+k/6*(1-o+l+k/20*(5-18*o+p+14*l-58*o*l+k/42*(61+179*p-p*o-479*o)))))+this.x0,d=this.a*(this.k0*(q-this.ml0+h*g*j/2*(1+k/12*(5-o+9*l+4*m+k/30*(61+p-58*o+270*l-330*o*l+k/56*(1385+543*p-p*o-3111*o))))))+this.y0}else{var r=i*Math.sin(g);if(Math.abs(Math.abs(r)-1)=1){if(r-1>Nb)return 93;d=0}else d=Math.acos(d);f<0&&(d=-d),d=this.a*this.k0*(d-this.lat0)+this.y0}return a.x=c,a.y=d,a}function ba(a){var b,c,d,e,f=(a.x-this.x0)*(1/this.a),g=(a.y-this.y0)*(1/this.a);if(this.es)if(b=this.ml0+g/this.k0,c=bd(b,this.es,this.en),Math.abs(c)Nb?Math.tan(c):0,k=this.ep2*Math.pow(i,2),l=Math.pow(k,2),m=Math.pow(j,2),n=Math.pow(m,2);b=1-this.es*Math.pow(h,2);var o=f*Math.sqrt(b)/this.k0,p=Math.pow(o,2);b*=j,d=c-b*p/(1-this.es)*.5*(1-p/12*(5+3*m-9*k*m+k-4*l-p/30*(61+90*m-252*k*m+45*n+46*k-p/56*(1385+3633*m+4095*n+1574*n*m)))),e=mc(this.long0+o*(1-p/6*(1+2*m+k-p/20*(5+28*m+24*n+8*k*m+6*k-p/42*(61+662*m+1320*n+720*n*m))))/i)}else d=Jb*lc(g),e=0;else{var q=Math.exp(f/this.k0),r=.5*(q-1/q),s=this.lat0+g/this.k0,t=Math.cos(s);b=Math.sqrt((1-Math.pow(t,2))/(1+Math.pow(r,2))),d=Math.asin(b),g<0&&(d=-d),e=0===r&&0===t?0:mc(Math.atan2(r,t)+this.long0)}return a.x=e,a.y=d,a}function ca(){if(void 0===this.es||this.es<=0)throw new Error("incorrect elliptical usage");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 a=this.es/(1+Math.sqrt(1-this.es)),b=a/(2-a),c=b;this.cgb[0]=b*(2+b*(-2/3+b*(-2+b*(116/45+b*(26/45+b*(-2854/675)))))),this.cbg[0]=b*(-2+b*(2/3+b*(4/3+b*(-82/45+b*(32/45+b*(4642/4725)))))),c*=b,this.cgb[1]=c*(7/3+b*(-1.6+b*(-227/45+b*(2704/315+b*(2323/945))))),this.cbg[1]=c*(5/3+b*(-16/15+b*(-13/9+b*(904/315+b*(-1522/945))))),c*=b,this.cgb[2]=c*(56/15+b*(-136/35+b*(-1262/105+b*(73814/2835)))),this.cbg[2]=c*(-26/15+b*(34/21+b*(1.6+b*(-12686/2835)))),c*=b,this.cgb[3]=c*(4279/630+b*(-332/35+b*(-399572/14175))),this.cbg[3]=c*(1237/630+b*(-2.4+b*(-24832/14175))),c*=b,this.cgb[4]=c*(4174/315+b*(-144838/6237)),this.cbg[4]=c*(-734/315+b*(109598/31185)),c*=b,this.cgb[5]=c*(601676/22275),this.cbg[5]=c*(444337/155925),c=Math.pow(b,2),this.Qn=this.k0/(1+b)*(1+c*(.25+c*(1/64+c/256))),this.utg[0]=b*(-.5+b*(2/3+b*(-37/96+b*(1/360+b*(81/512+b*(-96199/604800)))))),this.gtu[0]=b*(.5+b*(-2/3+b*(5/16+b*(41/180+b*(-127/288+b*(7891/37800)))))),this.utg[1]=c*(-1/48+b*(-1/15+b*(437/1440+b*(-46/105+b*(1118711/3870720))))),this.gtu[1]=c*(13/48+b*(-.6+b*(557/1440+b*(281/630+b*(-1983433/1935360))))),c*=b,this.utg[2]=c*(-17/480+b*(37/840+b*(209/4480+b*(-5569/90720)))),this.gtu[2]=c*(61/240+b*(-103/140+b*(15061/26880+b*(167603/181440)))),c*=b,this.utg[3]=c*(-4397/161280+b*(11/504+b*(830251/7257600))),this.gtu[3]=c*(49561/161280+b*(-179/168+b*(6601661/7257600))),c*=b,this.utg[4]=c*(-4583/161280+b*(108847/3991680)),this.gtu[4]=c*(34729/80640+b*(-3418889/1995840)),c*=b,this.utg[5]=c*-.03233083094085698,this.gtu[5]=.6650675310896665*c;var d=id(this.cbg,this.lat0);this.Zb=-this.Qn*(d+jd(this.gtu,2*d))}function da(a){var b=mc(a.x-this.long0),c=a.y;c=id(this.cbg,c);var d=Math.sin(c),e=Math.cos(c),f=Math.sin(b),g=Math.cos(b);c=Math.atan2(d,g*e),b=Math.atan2(f*e,fd(d,e*g)),b=hd(Math.tan(b));var h=ld(this.gtu,2*c,2*b);c+=h[0],b+=h[1];var i,j;return Math.abs(b)<=2.623395162778?(i=this.a*(this.Qn*b)+this.x0,j=this.a*(this.Qn*c+this.Zb)+this.y0):(i=1/0,j=1/0),a.x=i,a.y=j,a}function ea(a){var b=(a.x-this.x0)*(1/this.a),c=(a.y-this.y0)*(1/this.a);c=(c-this.Zb)/this.Qn,b/=this.Qn;var d,e;if(Math.abs(b)<=2.623395162778){var f=ld(this.utg,2*c,2*b);c+=f[0],b+=f[1],b=Math.atan(ed(b));var g=Math.sin(c),h=Math.cos(c),i=Math.sin(b),j=Math.cos(b);c=Math.atan2(g*j,fd(i,j*h)),b=Math.atan2(i,j*h),d=mc(b+this.long0),e=id(this.cgb,c)}else d=1/0,e=1/0;return a.x=d,a.y=e,a}function fa(){var a=od(this.zone,this.long0);if(void 0===a)throw new Error("unknown utm zone");this.lat0=0,this.long0=(6*Math.abs(a)-183)*Ob,this.x0=5e5,this.y0=this.utmSouth?1e7:0,this.k0=.9996,nd.init.apply(this),this.forward=nd.forward,this.inverse=nd.inverse}function ga(){var a=Math.sin(this.lat0),b=Math.cos(this.lat0);b*=b,this.rc=Math.sqrt(1-this.es)/(1-this.es*a*a),this.C=Math.sqrt(1+this.es*b*b/(1-this.es)),this.phic0=Math.asin(a/this.C),this.ratexp=.5*this.C*this.e,this.K=Math.tan(.5*this.phic0+Qb)/(Math.pow(Math.tan(.5*this.lat0+Qb),this.C)*sd(this.e*a,this.ratexp))}function ha(a){var b=a.x,c=a.y;return a.y=2*Math.atan(this.K*Math.pow(Math.tan(.5*c+Qb),this.C)*sd(this.e*Math.sin(c),this.ratexp))-Jb,a.x=this.C*b,a}function ia(a){for(var b=1e-14,c=a.x/this.C,d=a.y,e=Math.pow(Math.tan(.5*d+Qb)/this.K,1/this.C),f=td;f>0&&(d=2*Math.atan(e*sd(this.e*Math.sin(a.y),-.5*this.e))-Jb,!(Math.abs(d-a.y)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)<=Nb&&(this.k0=.5*this.cons*kc(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts))/nc(this.e,this.con*this.lat_ts,this.con*Math.sin(this.lat_ts))),this.ms1=kc(this.e,this.sinlat0,this.coslat0),this.X0=2*Math.atan(this.ssfn_(this.lat0,this.sinlat0,this.e))-Jb,this.cosX0=Math.cos(this.X0),this.sinX0=Math.sin(this.X0))}function oa(a){var b,c,d,e,f,g,h=a.x,i=a.y,j=Math.sin(i),k=Math.cos(i),l=mc(h-this.long0);return Math.abs(Math.abs(h-this.long0)-Math.PI)<=Nb&&Math.abs(i+this.lat0)<=Nb?(a.x=NaN,a.y=NaN,a):this.sphere?(b=2*this.k0/(1+this.sinlat0*j+this.coslat0*k*Math.cos(l)),a.x=this.a*b*k*Math.sin(l)+this.x0,a.y=this.a*b*(this.coslat0*j-this.sinlat0*k*Math.cos(l))+this.y0,a):(c=2*Math.atan(this.ssfn_(i,j,this.e))-Jb,e=Math.cos(c),d=Math.sin(c),Math.abs(this.coslat0)<=Nb?(f=nc(this.e,i*this.con,this.con*j),g=2*this.a*this.k0*f/this.cons,a.x=this.x0+g*Math.sin(h-this.long0),a.y=this.y0-this.con*g*Math.cos(h-this.long0),a):(Math.abs(this.sinlat0)0?this.long0+Math.atan2(a.x,-1*a.y):this.long0+Math.atan2(a.x,a.y):this.long0+Math.atan2(a.x*Math.sin(h),g*this.coslat0*Math.cos(h)-a.y*this.sinlat0*Math.sin(h))),a.x=b,a.y=c,a)}if(Math.abs(this.coslat0)<=Nb){if(g<=Nb)return c=this.lat0,b=this.long0,a.x=b,a.y=c,a;a.x*=this.con,a.y*=this.con,d=g*this.cons/(2*this.a*this.k0),c=this.con*oc(this.e,d),b=this.con*mc(this.con*this.long0+Math.atan2(a.x,-1*a.y))}else e=2*Math.atan(g*this.cosX0/(2*this.a*this.k0*this.ms1)),b=this.long0,g<=Nb?f=this.X0:(f=Math.asin(Math.cos(e)*this.sinX0+a.y*Math.sin(e)*this.cosX0/g),b=mc(this.long0+Math.atan2(a.x*Math.sin(e),g*this.cosX0*Math.cos(e)-a.y*this.sinX0*Math.sin(e)))),c=-1*oc(this.e,Math.tan(.5*(Jb+f)));return a.x=b,a.y=c,a}function qa(){var a=this.lat0;this.lambda0=this.long0;var b=Math.sin(a),c=this.a,d=this.rf,e=1/d,f=2*e-Math.pow(e,2),g=this.e=Math.sqrt(f);this.R=this.k0*c*Math.sqrt(1-f)/(1-f*Math.pow(b,2)),this.alpha=Math.sqrt(1+f/(1-f)*Math.pow(Math.cos(a),4)),this.b0=Math.asin(b/this.alpha);var h=Math.log(Math.tan(Math.PI/4+this.b0/2)),i=Math.log(Math.tan(Math.PI/4+a/2)),j=Math.log((1+g*b)/(1-g*b));this.K=h-this.alpha*i+this.alpha*g/2*j}function ra(a){var b=Math.log(Math.tan(Math.PI/4-a.y/2)),c=this.e/2*Math.log((1+this.e*Math.sin(a.y))/(1-this.e*Math.sin(a.y))),d=-this.alpha*(b+c)+this.K,e=2*(Math.atan(Math.exp(d))-Math.PI/4),f=this.alpha*(a.x-this.lambda0),g=Math.atan(Math.sin(f)/(Math.sin(this.b0)*Math.tan(e)+Math.cos(this.b0)*Math.cos(f))),h=Math.asin(Math.cos(this.b0)*Math.sin(e)-Math.sin(this.b0)*Math.cos(e)*Math.cos(f));return a.y=this.R/2*Math.log((1+Math.sin(h))/(1-Math.sin(h)))+this.y0,a.x=this.R*g+this.x0,a}function sa(a){for(var b=a.x-this.x0,c=a.y-this.y0,d=b/this.R,e=2*(Math.atan(Math.exp(c/this.R))-Math.PI/4),f=Math.asin(Math.cos(this.b0)*Math.sin(e)+Math.sin(this.b0)*Math.cos(e)*Math.cos(d)),g=Math.atan(Math.sin(d)/(Math.cos(this.b0)*Math.cos(d)-Math.sin(this.b0)*Math.tan(e))),h=this.lambda0+g/this.alpha,i=0,j=f,k=-1e3,l=0;Math.abs(j-k)>1e-7;){if(++l>20)return;i=1/this.alpha*(Math.log(Math.tan(Math.PI/4+f/2))-this.K)+this.e*Math.log(Math.tan(Math.PI/4+Math.asin(this.e*Math.sin(j))/2)),k=j,j=2*Math.atan(Math.exp(i))-Math.PI/2}return a.x=h,a.y=j,a}function ta(){this.no_off=this.no_off||!1,this.no_rot=this.no_rot||!1,isNaN(this.k0)&&(this.k0=1);var a=Math.sin(this.lat0),b=Math.cos(this.lat0),c=this.e*a;this.bl=Math.sqrt(1+this.es/(1-this.es)*Math.pow(b,4)),this.al=this.a*this.bl*this.k0*Math.sqrt(1-this.es)/(1-c*c);var d=nc(this.e,this.lat0,a),e=this.bl/b*Math.sqrt((1-this.es)/(1-c*c));e*e<1&&(e=1);var f,g;if(isNaN(this.longc)){var h=nc(this.e,this.lat1,Math.sin(this.lat1)),i=nc(this.e,this.lat2,Math.sin(this.lat2));this.lat0>=0?this.el=(e+Math.sqrt(e*e-1))*Math.pow(d,this.bl):this.el=(e-Math.sqrt(e*e-1))*Math.pow(d,this.bl);var j=Math.pow(h,this.bl),k=Math.pow(i,this.bl);f=this.el/j,g=.5*(f-1/f);var l=(this.el*this.el-k*j)/(this.el*this.el+k*j),m=(k-j)/(k+j),n=mc(this.long1-this.long2);this.long0=.5*(this.long1+this.long2)-Math.atan(l*Math.tan(.5*this.bl*n)/m)/this.bl,this.long0=mc(this.long0);var o=mc(this.long1-this.long0);this.gamma0=Math.atan(Math.sin(this.bl*o)/g),this.alpha=Math.asin(e*Math.sin(this.gamma0))}else f=this.lat0>=0?e+Math.sqrt(e*e-1):e-Math.sqrt(e*e-1),this.el=f*Math.pow(d,this.bl),g=.5*(f-1/f),this.gamma0=Math.asin(Math.sin(this.alpha)/e),this.long0=this.longc-Math.asin(g*Math.tan(this.gamma0))/this.bl;this.no_off?this.uc=0:this.lat0>=0?this.uc=this.al/this.bl*Math.atan2(Math.sqrt(e*e-1),Math.cos(this.alpha)):this.uc=-1*this.al/this.bl*Math.atan2(Math.sqrt(e*e-1),Math.cos(this.alpha))}function ua(a){var b,c,d,e=a.x,f=a.y,g=mc(e-this.long0);if(Math.abs(Math.abs(f)-Jb)<=Nb)d=f>0?-1:1,c=this.al/this.bl*Math.log(Math.tan(Qb+d*this.gamma0*.5)),b=-1*d*Jb*this.al/this.bl;else{var h=nc(this.e,f,Math.sin(f)),i=this.el/Math.pow(h,this.bl),j=.5*(i-1/i),k=.5*(i+1/i),l=Math.sin(this.bl*g),m=(j*Math.sin(this.gamma0)-l*Math.cos(this.gamma0))/k;c=Math.abs(Math.abs(m)-1)<=Nb?Number.POSITIVE_INFINITY:.5*this.al*Math.log((1-m)/(1+m))/this.bl,b=Math.abs(Math.cos(this.bl*g))<=Nb?this.al*this.bl*g:this.al*Math.atan2(j*Math.cos(this.gamma0)+l*Math.sin(this.gamma0),Math.cos(this.bl*g))/this.bl}return this.no_rot?(a.x=this.x0+b,a.y=this.y0+c):(b-=this.uc,a.x=this.x0+c*Math.cos(this.alpha)+b*Math.sin(this.alpha),a.y=this.y0+b*Math.cos(this.alpha)-c*Math.sin(this.alpha)),a}function va(a){var b,c;this.no_rot?(c=a.y-this.y0,b=a.x-this.x0):(c=(a.x-this.x0)*Math.cos(this.alpha)-(a.y-this.y0)*Math.sin(this.alpha),b=(a.y-this.y0)*Math.cos(this.alpha)+(a.x-this.x0)*Math.sin(this.alpha),b+=this.uc);var d=Math.exp(-1*this.bl*c/this.al),e=.5*(d-1/d),f=.5*(d+1/d),g=Math.sin(this.bl*b/this.al),h=(g*Math.cos(this.gamma0)+e*Math.sin(this.gamma0))/f,i=Math.pow(this.el/Math.sqrt((1+h)/(1-h)),1/this.bl);return Math.abs(h-1)Nb?this.ns=Math.log(d/h)/Math.log(e/i):this.ns=b,isNaN(this.ns)&&(this.ns=b),this.f0=d/(this.ns*Math.pow(e,this.ns)),this.rh=this.a*this.f0*Math.pow(j,this.ns),this.title||(this.title="Lambert Conformal Conic")}}function xa(a){var b=a.x,c=a.y;Math.abs(2*Math.abs(c)-Math.PI)<=Nb&&(c=lc(c)*(Jb-2*Nb));var d,e,f=Math.abs(Math.abs(c)-Jb);if(f>Nb)d=nc(this.e,c,Math.sin(c)),e=this.a*this.f0*Math.pow(d,this.ns);else{if(f=c*this.ns,f<=0)return null;e=0}var g=this.ns*mc(b-this.long0);return a.x=this.k0*(e*Math.sin(g))+this.x0,a.y=this.k0*(this.rh-e*Math.cos(g))+this.y0,a}function ya(a){var b,c,d,e,f,g=(a.x-this.x0)/this.k0,h=this.rh-(a.y-this.y0)/this.k0;this.ns>0?(b=Math.sqrt(g*g+h*h),c=1):(b=-Math.sqrt(g*g+h*h),c=-1);var i=0;if(0!==b&&(i=Math.atan2(c*g,c*h)),0!==b||this.ns>0){if(c=1/this.ns,d=Math.pow(b/(this.a*this.f0),c),e=oc(this.e,d),e===-9999)return null}else e=-Jb;return f=mc(i/this.ns+this.long0),a.x=f,a.y=e,a}function za(){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; -}function Aa(a){var b,c,d,e,f,g,h,i=a.x,j=a.y,k=mc(i-this.long0);return b=Math.pow((1+this.e*Math.sin(j))/(1-this.e*Math.sin(j)),this.alfa*this.e/2),c=2*(Math.atan(this.k*Math.pow(Math.tan(j/2+this.s45),this.alfa)/b)-this.s45),d=-k*this.alfa,e=Math.asin(Math.cos(this.ad)*Math.sin(c)+Math.sin(this.ad)*Math.cos(c)*Math.cos(d)),f=Math.asin(Math.cos(c)*Math.sin(d)/Math.cos(e)),g=this.n*f,h=this.ro0*Math.pow(Math.tan(this.s0/2+this.s45),this.n)/Math.pow(Math.tan(e/2+this.s45),this.n),a.y=h*Math.cos(g)/1,a.x=h*Math.sin(g)/1,this.czech||(a.y*=-1,a.x*=-1),a}function Ba(a){var b,c,d,e,f,g,h,i,j=a.x;a.x=a.y,a.y=j,this.czech||(a.y*=-1,a.x*=-1),g=Math.sqrt(a.x*a.x+a.y*a.y),f=Math.atan2(a.y,a.x),e=f/Math.sin(this.s0),d=2*(Math.atan(Math.pow(this.ro0/g,1/this.n)*Math.tan(this.s0/2+this.s45))-this.s45),b=Math.asin(Math.cos(this.ad)*Math.sin(d)-Math.sin(this.ad)*Math.cos(d)*Math.cos(e)),c=Math.asin(Math.cos(d)*Math.sin(e)/Math.cos(b)),a.x=this.long0-c/this.alfa,h=b,i=0;var k=0;do a.y=2*(Math.atan(Math.pow(this.k,-1/this.alfa)*Math.pow(Math.tan(b/2+this.s45),1/this.alfa)*Math.pow((1+this.e*Math.sin(h))/(1-this.e*Math.sin(h)),this.e/2))-this.s45),Math.abs(h-a.y)<1e-10&&(i=1),h=a.y,k+=1;while(0===i&&k<15);return k>=15?null:a}function Ca(){this.sphere||(this.e0=Jd(this.es),this.e1=Kd(this.es),this.e2=Ld(this.es),this.e3=Md(this.es),this.ml0=this.a*Id(this.e0,this.e1,this.e2,this.e3,this.lat0))}function Da(a){var b,c,d=a.x,e=a.y;if(d=mc(d-this.long0),this.sphere)b=this.a*Math.asin(Math.cos(e)*Math.sin(d)),c=this.a*(Math.atan2(Math.tan(e),Math.cos(d))-this.lat0);else{var f=Math.sin(e),g=Math.cos(e),h=Nd(this.a,this.e,f),i=Math.tan(e)*Math.tan(e),j=d*Math.cos(e),k=j*j,l=this.es*g*g/(1-this.es),m=this.a*Id(this.e0,this.e1,this.e2,this.e3,e);b=h*j*(1-k*i*(1/6-(8-i+8*l)*k/120)),c=m-this.ml0+h*f/g*k*(.5+(5-i+6*l)*k/24)}return a.x=b+this.x0,a.y=c+this.y0,a}function Ea(a){a.x-=this.x0,a.y-=this.y0;var b,c,d=a.x/this.a,e=a.y/this.a;if(this.sphere){var f=e+this.lat0;b=Math.asin(Math.sin(f)*Math.cos(d)),c=Math.atan2(Math.tan(d),Math.cos(f))}else{var g=this.ml0/this.a+e,h=Pd(g,this.e0,this.e1,this.e2,this.e3);if(Math.abs(Math.abs(h)-Jb)<=Nb)return a.x=this.long0,a.y=Jb,e<0&&(a.y*=-1),a;var i=Nd(this.a,this.e,Math.sin(h)),j=i*i*i/this.a/this.a*(1-this.es),k=Math.pow(Math.tan(h),2),l=d*this.a/i,m=l*l;b=h-i*Math.tan(h)/j*l*l*(.5-(1+3*k)*l*l/24),c=l*(1-m*(k/3+(1+3*k)*k*m/15))/Math.cos(h)}return a.x=mc(c+this.long0),a.y=Od(b),a}function Fa(){var a=Math.abs(this.lat0);if(Math.abs(a-Jb)0){var b;switch(this.qp=Sd(this.e,1),this.mmf=.5/(1-this.es),this.apa=Ia(this.es),this.mode){case this.N_POLE:this.dd=1;break;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),b=Math.sin(this.lat0),this.sinb1=Sd(this.e,b)/this.qp,this.cosb1=Math.sqrt(1-this.sinb1*this.sinb1),this.dd=Math.cos(this.lat0)/(Math.sqrt(1-this.es*b*b)*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))}function Ga(a){var b,c,d,e,f,g,h,i,j,k,l=a.x,m=a.y;if(l=mc(l-this.long0),this.sphere){if(f=Math.sin(m),k=Math.cos(m),d=Math.cos(l),this.mode===this.OBLIQ||this.mode===this.EQUIT){if(c=this.mode===this.EQUIT?1+k*d:1+this.sinph0*f+this.cosph0*k*d,c<=Nb)return null;c=Math.sqrt(2/c),b=c*k*Math.sin(l),c*=this.mode===this.EQUIT?f:this.cosph0*f-this.sinph0*k*d}else if(this.mode===this.N_POLE||this.mode===this.S_POLE){if(this.mode===this.N_POLE&&(d=-d),Math.abs(m+this.phi0)=0?(b=(j=Math.sqrt(g))*e,c=d*(this.mode===this.S_POLE?j:-j)):b=c=0}}return a.x=this.a*b+this.x0,a.y=this.a*c+this.y0,a}function Ha(a){a.x-=this.x0,a.y-=this.y0;var b,c,d,e,f,g,h,i=a.x/this.a,j=a.y/this.a;if(this.sphere){var k,l=0,m=0;if(k=Math.sqrt(i*i+j*j),c=.5*k,c>1)return null;switch(c=2*Math.asin(c),this.mode!==this.OBLIQ&&this.mode!==this.EQUIT||(m=Math.sin(c),l=Math.cos(c)),this.mode){case this.EQUIT:c=Math.abs(k)<=Nb?0:Math.asin(j*m/k),i*=m,j=l*k;break;case this.OBLIQ:c=Math.abs(k)<=Nb?this.phi0:Math.asin(l*this.sinph0+j*m*this.cosph0/k),i*=m*this.cosph0,j=(l-Math.sin(c)*this.sinph0)*k;break;case this.N_POLE:j=-j,c=Jb-c;break;case this.S_POLE:c-=Jb}b=0!==j||this.mode!==this.EQUIT&&this.mode!==this.OBLIQ?Math.atan2(i,j):0}else{if(h=0,this.mode===this.OBLIQ||this.mode===this.EQUIT){if(i/=this.dd,j*=this.dd,g=Math.sqrt(i*i+j*j),gNb?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)}function La(a){var b=a.x,c=a.y;this.sin_phi=Math.sin(c),this.cos_phi=Math.cos(c);var d=Sd(this.e3,this.sin_phi,this.cos_phi),e=this.a*Math.sqrt(this.c-this.ns0*d)/this.ns0,f=this.ns0*mc(b-this.long0),g=e*Math.sin(f)+this.x0,h=this.rh-e*Math.cos(f)+this.y0;return a.x=g,a.y=h,a}function Ma(a){var b,c,d,e,f,g;return a.x-=this.x0,a.y=this.rh-a.y+this.y0,this.ns0>=0?(b=Math.sqrt(a.x*a.x+a.y*a.y),d=1):(b=-Math.sqrt(a.x*a.x+a.y*a.y),d=-1),e=0,0!==b&&(e=Math.atan2(d*a.x,d*a.y)),d=b*this.ns0/this.a,this.sphere?g=Math.asin((this.c-d*d)/(2*this.ns0)):(c=(this.c-d*d)/this.ns0,g=this.phi1z(this.e3,c)),f=mc(e/this.ns0+this.long0),a.x=f,a.y=g,a}function Na(a,b){var c,d,e,f,g,h=de(.5*b);if(a0||Math.abs(g)<=Nb?(h=this.x0+this.a*f*c*Math.sin(d)/g,i=this.y0+this.a*f*(this.cos_p14*b-this.sin_p14*c*e)/g):(h=this.x0+this.infinity_dist*c*Math.sin(d),i=this.y0+this.infinity_dist*(this.cos_p14*b-this.sin_p14*c*e)),a.x=h,a.y=i,a}function Qa(a){var b,c,d,e,f,g;return a.x=(a.x-this.x0)/this.a,a.y=(a.y-this.y0)/this.a,a.x/=this.k0,a.y/=this.k0,(b=Math.sqrt(a.x*a.x+a.y*a.y))?(e=Math.atan2(b,this.rc),c=Math.sin(e),d=Math.cos(e),g=de(d*this.sin_p14+a.y*c*this.cos_p14/b),f=Math.atan2(a.x*c,b*this.cos_p14*d-a.y*this.sin_p14*c),f=mc(this.long0+f)):(g=this.phic0,f=0),a.x=f,a.y=g,a}function Ra(){this.sphere||(this.k0=kc(this.e,Math.sin(this.lat_ts),Math.cos(this.lat_ts)))}function Sa(a){var b,c,d=a.x,e=a.y,f=mc(d-this.long0);if(this.sphere)b=this.x0+this.a*f*Math.cos(this.lat_ts),c=this.y0+this.a*Math.sin(e)/Math.cos(this.lat_ts);else{var g=Sd(this.e,Math.sin(e));b=this.x0+this.a*this.k0*f,c=this.y0+this.a*g*.5/this.k0}return a.x=b,a.y=c,a}function Ta(a){a.x-=this.x0,a.y-=this.y0;var b,c;return this.sphere?(b=mc(this.long0+a.x/this.a/Math.cos(this.lat_ts)),c=Math.asin(a.y/this.a*Math.cos(this.lat_ts))):(c=ie(this.e,2*a.y*this.k0/this.a),b=mc(this.long0+a.x/(this.a*this.k0))),a.x=b,a.y=c,a}function Ua(){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)}function Va(a){var b=a.x,c=a.y,d=mc(b-this.long0),e=Od(c-this.lat0);return a.x=this.x0+this.a*d*this.rc,a.y=this.y0+this.a*e,a}function Wa(a){var b=a.x,c=a.y;return a.x=mc(this.long0+(b-this.x0)/(this.a*this.rc)),a.y=Od(this.lat0+(c-this.y0)/this.a),a}function Xa(){this.temp=this.b/this.a,this.es=1-Math.pow(this.temp,2),this.e=Math.sqrt(this.es),this.e0=Jd(this.es),this.e1=Kd(this.es),this.e2=Ld(this.es),this.e3=Md(this.es),this.ml0=this.a*Id(this.e0,this.e1,this.e2,this.e3,this.lat0)}function Ya(a){var b,c,d,e=a.x,f=a.y,g=mc(e-this.long0);if(d=g*Math.sin(f),this.sphere)Math.abs(f)<=Nb?(b=this.a*g,c=-1*this.a*this.lat0):(b=this.a*Math.sin(d)/Math.tan(f),c=this.a*(Od(f-this.lat0)+(1-Math.cos(d))/Math.tan(f)));else if(Math.abs(f)<=Nb)b=this.a*g,c=-1*this.ml0;else{var h=Nd(this.a,this.e,Math.sin(f))/Math.tan(f);b=h*Math.sin(d),c=this.a*Id(this.e0,this.e1,this.e2,this.e3,f)-this.ml0+h*(1-Math.cos(d))}return a.x=b+this.x0,a.y=c+this.y0,a}function Za(a){var b,c,d,e,f,g,h,i,j;if(d=a.x-this.x0,e=a.y-this.y0,this.sphere)if(Math.abs(e+this.a*this.lat0)<=Nb)b=mc(d/this.a+this.long0),c=0;else{g=this.lat0+e/this.a,h=d*d/this.a/this.a+g*g,i=g;var k;for(f=ne;f;--f)if(k=Math.tan(i),j=-1*(g*(i*k+1)-i-.5*(i*i+h)*k)/((i-g)/k-1),i+=j,Math.abs(j)<=Nb){c=i;break}b=mc(this.long0+Math.asin(d*Math.tan(i)/this.a)/Math.sin(c))}else if(Math.abs(e+this.ml0)<=Nb)c=0,b=mc(this.long0+d/this.a);else{g=(this.ml0+e)/this.a,h=d*d/this.a/this.a+g*g,i=g;var l,m,n,o,p;for(f=ne;f;--f)if(p=this.e*Math.sin(i),l=Math.sqrt(1-p*p)*Math.tan(i),m=this.a*Id(this.e0,this.e1,this.e2,this.e3,i),n=this.e0-2*this.e1*Math.cos(2*i)+4*this.e2*Math.cos(4*i)-6*this.e3*Math.cos(6*i),o=m/this.a,j=(g*(l*o+1)-o-.5*l*(o*o+h))/(this.es*Math.sin(2*i)*(o*o+h-2*g*o)/(4*l)+(g-o)*(l*n-2/Math.sin(2*i))-n),i-=j,Math.abs(j)<=Nb){c=i;break}l=Math.sqrt(1-this.es*Math.pow(Math.sin(c),2))*Math.tan(c),b=mc(this.long0+Math.asin(d*l/this.a)/Math.sin(c))}return a.x=b,a.y=c,a}function $a(){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}function _a(a){var b,c=a.x,d=a.y,e=d-this.lat0,f=c-this.long0,g=e/Ib*1e-5,h=f,i=1,j=0;for(b=1;b<=10;b++)i*=g,j+=this.A[b]*i;var k,l,m=j,n=h,o=1,p=0,q=0,r=0;for(b=1;b<=6;b++)k=o*m-p*n,l=p*m+o*n,o=k,p=l,q=q+this.B_re[b]*o-this.B_im[b]*p,r=r+this.B_im[b]*o+this.B_re[b]*p;return a.x=r*this.a+this.x0,a.y=q*this.a+this.y0,a}function ab(a){var b,c,d,e=a.x,f=a.y,g=e-this.x0,h=f-this.y0,i=h/this.a,j=g/this.a,k=1,l=0,m=0,n=0;for(b=1;b<=6;b++)c=k*i-l*j,d=l*i+k*j,k=c,l=d,m=m+this.C_re[b]*k-this.C_im[b]*l,n=n+this.C_im[b]*k+this.C_re[b]*l;for(var o=0;o.999999999999&&(c=.999999999999),b=Math.asin(c);var d=mc(this.long0+a.x/(.900316316158*this.a*Math.cos(b)));d<-Math.PI&&(d=-Math.PI),d>Math.PI&&(d=Math.PI),c=(2*b+Math.sin(2*b))/Math.PI,Math.abs(c)>1&&(c=1);var e=Math.asin(c);return a.x=d,a.y=e,a}function kb(){Math.abs(this.lat1+this.lat2)=0?(c=Math.sqrt(a.x*a.x+a.y*a.y),b=1):(c=-Math.sqrt(a.x*a.x+a.y*a.y),b=-1);var f=0;if(0!==c&&(f=Math.atan2(b*a.x,b*a.y)),this.sphere)return e=mc(this.long0+f/this.ns),d=Od(this.g-c/this.a),a.x=e,a.y=d,a;var g=this.g-c/this.a;return d=Pd(g,this.e0,this.e1,this.e2,this.e3),e=mc(this.long0+f/this.ns),a.x=e,a.y=d,a}function nb(){this.R=this.a}function ob(a){var b,c,d=a.x,e=a.y,f=mc(d-this.long0);Math.abs(e)<=Nb&&(b=this.x0+this.R*f,c=this.y0);var g=de(2*Math.abs(e/Math.PI));(Math.abs(f)<=Nb||Math.abs(Math.abs(e)-Jb)<=Nb)&&(b=this.x0,c=e>=0?this.y0+Math.PI*this.R*Math.tan(.5*g):this.y0+Math.PI*this.R*-Math.tan(.5*g));var h=.5*Math.abs(Math.PI/f-f/Math.PI),i=h*h,j=Math.sin(g),k=Math.cos(g),l=k/(j+k-1),m=l*l,n=l*(2/j-1),o=n*n,p=Math.PI*this.R*(h*(l-o)+Math.sqrt(i*(l-o)*(l-o)-(o+i)*(m-o)))/(o+i);f<0&&(p=-p),b=this.x0+p;var q=i+l;return p=Math.PI*this.R*(n*q-h*Math.sqrt((o+i)*(i+1)-q*q))/(o+i),c=e>=0?this.y0+p:this.y0-p,a.x=b,a.y=c,a}function pb(a){var b,c,d,e,f,g,h,i,j,k,l,m,n;return a.x-=this.x0,a.y-=this.y0,l=Math.PI*this.R,d=a.x/l,e=a.y/l,f=d*d+e*e,g=-Math.abs(e)*(1+f),h=g-2*e*e+d*d,i=-2*g+1+2*e*e+f*f,n=e*e/i+(2*h*h*h/i/i/i-9*g*h/i/i)/27,j=(g-h*h/3/i)/i,k=2*Math.sqrt(-j/3),l=3*n/j/k,Math.abs(l)>1&&(l=l>=0?1:-1),m=Math.acos(l)/3,c=a.y>=0?(-k*Math.cos(m+Math.PI/3)-h/3/i)*Math.PI:-(-k*Math.cos(m+Math.PI/3)-h/3/i)*Math.PI,b=Math.abs(d)2*Jb*this.a)return;return c=b/this.a,d=Math.sin(c),e=Math.cos(c),f=this.long0,Math.abs(b)<=Nb?g=this.lat0:(g=de(e*this.sin_p12+a.y*d*this.cos_p12/b),h=Math.abs(this.lat0)-Jb,f=mc(Math.abs(h)<=Nb?this.lat0>=0?this.long0+Math.atan2(a.x,-a.y):this.long0-Math.atan2(-a.x,a.y):this.long0+Math.atan2(a.x*d,b*this.cos_p12*e-a.y*this.sin_p12*d))),a.x=f,a.y=g,a}return i=Jd(this.es),j=Kd(this.es),k=Ld(this.es),l=Md(this.es),Math.abs(this.sin_p12-1)<=Nb?(m=this.a*Id(i,j,k,l,Jb),b=Math.sqrt(a.x*a.x+a.y*a.y),n=m-b,g=Pd(n/this.a,i,j,k,l),f=mc(this.long0+Math.atan2(a.x,-1*a.y)),a.x=f,a.y=g,a):Math.abs(this.sin_p12+1)<=Nb?(m=this.a*Id(i,j,k,l,Jb),b=Math.sqrt(a.x*a.x+a.y*a.y),n=b-m,g=Pd(n/this.a,i,j,k,l),f=mc(this.long0+Math.atan2(a.x,a.y)),a.x=f,a.y=g,a):(b=Math.sqrt(a.x*a.x+a.y*a.y),q=Math.atan2(a.x,a.y),o=Nd(this.a,this.e,this.sin_p12),r=Math.cos(q),s=this.e*this.cos_p12*r,t=-s*s/(1-this.es),u=3*this.es*(1-t)*this.sin_p12*this.cos_p12*r/(1-this.es),v=b/o,w=v-t*(1+t)*Math.pow(v,3)/6-u*(1+3*t)*Math.pow(v,4)/24,x=1-t*w*w/2-v*w*w*w/6,p=Math.asin(this.sin_p12*Math.cos(w)+this.cos_p12*Math.sin(w)*r),f=mc(this.long0+Math.asin(Math.sin(q)*Math.sin(w)/Math.cos(p))),g=Math.atan((1-this.es*x*this.sin_p12/Math.sin(p))*Math.tan(p)/(1-this.es)),a.x=f,a.y=g,a)}function tb(){this.sin_p14=Math.sin(this.lat0),this.cos_p14=Math.cos(this.lat0)}function ub(a){var b,c,d,e,f,g,h,i,j=a.x,k=a.y;return d=mc(j-this.long0),b=Math.sin(k),c=Math.cos(k),e=Math.cos(d),g=this.sin_p14*b+this.cos_p14*c*e,f=1,(g>0||Math.abs(g)<=Nb)&&(h=this.a*f*c*Math.sin(d),i=this.y0+this.a*f*(this.cos_p14*b-this.sin_p14*c*e)),a.x=h,a.y=i,a}function vb(a){var b,c,d,e,f,g,h;return a.x-=this.x0,a.y-=this.y0,b=Math.sqrt(a.x*a.x+a.y*a.y),c=de(b/this.a),d=Math.sin(c),e=Math.cos(c),g=this.long0,Math.abs(b)<=Nb?(h=this.lat0,a.x=g,a.y=h,a):(h=de(e*this.sin_p14+a.y*d*this.cos_p14/b),f=Math.abs(this.lat0)-Jb,Math.abs(f)<=Nb?(g=mc(this.lat0>=0?this.long0+Math.atan2(a.x,-a.y):this.long0-Math.atan2(-a.x,a.y)),a.x=g,a.y=h,a):(g=mc(this.long0+Math.atan2(a.x*d,b*this.cos_p14*e-a.y*this.sin_p14*d)),a.x=g,a.y=h,a))}function wb(){this.isGeocent=!0}function xb(a){return a}function yb(){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.face_enum={FRONT:1,RIGHT:2,BACK:3,LEFT:4,TOP:5,BOTTOM:6},this.area_enum={AREA_0:1,AREA_1:2,AREA_2:3,AREA_3:4},this.lat0>=Jb-Qb/2?this.face=this.face_enum.TOP:this.lat0<=-(Jb-Qb/2)?this.face=this.face_enum.BOTTOM:Math.abs(this.long0)<=Qb?this.face=this.face_enum.FRONT:Math.abs(this.long0)<=Jb+Qb?this.face=this.long0>0?this.face_enum.RIGHT:this.face_enum.LEFT:this.face=this.face_enum.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)}function zb(a){var b,c,d,e,f,g,h={x:0,y:0},i={value:0};if(a.x-=this.long0,b=0!==this.es?Math.atan(this.one_minus_f_squared*Math.tan(a.y)):a.y,c=a.x,this.face===this.face_enum.TOP)e=Jb-b,c>=Qb&&c<=Jb+Qb?(i.value=this.area_enum.AREA_0,d=c-Jb):c>Jb+Qb||c<=-(Jb+Qb)?(i.value=this.area_enum.AREA_1,d=c>0?c-Sb:c+Sb):c>-(Jb+Qb)&&c<=-Qb?(i.value=this.area_enum.AREA_2,d=c+Jb):(i.value=this.area_enum.AREA_3,d=c);else if(this.face===this.face_enum.BOTTOM)e=Jb+b,c>=Qb&&c<=Jb+Qb?(i.value=this.area_enum.AREA_0,d=-c+Jb):c=-Qb?(i.value=this.area_enum.AREA_1,d=-c):c<-Qb&&c>=-(Jb+Qb)?(i.value=this.area_enum.AREA_2,d=-c-Jb):(i.value=this.area_enum.AREA_3,d=c>0?-c+Sb:-c-Sb);else{var j,k,l,m,n,o,p;this.face===this.face_enum.RIGHT?c=this.qsc_shift_lon_origin(c,+Jb):this.face===this.face_enum.BACK?c=this.qsc_shift_lon_origin(c,+Sb):this.face===this.face_enum.LEFT&&(c=this.qsc_shift_lon_origin(c,-Jb)),m=Math.sin(b),n=Math.cos(b),o=Math.sin(c),p=Math.cos(c),j=n*p,k=n*o,l=m,this.face===this.face_enum.FRONT?(e=Math.acos(j),d=this.qsc_fwd_equat_face_theta(e,l,k,i)):this.face===this.face_enum.RIGHT?(e=Math.acos(k),d=this.qsc_fwd_equat_face_theta(e,l,-j,i)):this.face===this.face_enum.BACK?(e=Math.acos(-j),d=this.qsc_fwd_equat_face_theta(e,l,-k,i)):this.face===this.face_enum.LEFT?(e=Math.acos(-k),d=this.qsc_fwd_equat_face_theta(e,l,j,i)):(e=d=0,i.value=this.area_enum.AREA_0)}return g=Math.atan(12/Sb*(d+Math.acos(Math.sin(d)*Math.cos(Qb))-Jb)),f=Math.sqrt((1-Math.cos(e))/(Math.cos(g)*Math.cos(g))/(1-Math.cos(Math.atan(1/Math.cos(d))))),i.value===this.area_enum.AREA_1?g+=Jb:i.value===this.area_enum.AREA_2?g+=Sb:i.value===this.area_enum.AREA_3&&(g+=1.5*Sb),h.x=f*Math.cos(g),h.y=f*Math.sin(g),h.x=h.x*this.a+this.x0,h.y=h.y*this.a+this.y0,a.x=h.x,a.y=h.y,a}function Ab(a){var b,c,d,e,f,g,h,i,j,k={lam:0,phi:0},l={value:0};if(a.x=(a.x-this.x0)/this.a,a.y=(a.y-this.y0)/this.a,c=Math.atan(Math.sqrt(a.x*a.x+a.y*a.y)),b=Math.atan2(a.y,a.x),a.x>=0&&a.x>=Math.abs(a.y)?l.value=this.area_enum.AREA_0:a.y>=0&&a.y>=Math.abs(a.x)?(l.value=this.area_enum.AREA_1,b-=Jb):a.x<0&&-a.x>=Math.abs(a.y)?(l.value=this.area_enum.AREA_2,b=b<0?b+Sb:b-Sb):(l.value=this.area_enum.AREA_3,b+=Jb),j=Sb/12*Math.tan(b),f=Math.sin(j)/(Math.cos(j)-1/Math.sqrt(2)),g=Math.atan(f),d=Math.cos(b),e=Math.tan(c),h=1-d*d*e*e*(1-Math.cos(Math.atan(1/Math.cos(g)))),h<-1?h=-1:h>1&&(h=1),this.face===this.face_enum.TOP)i=Math.acos(h),k.phi=Jb-i,l.value===this.area_enum.AREA_0?k.lam=g+Jb:l.value===this.area_enum.AREA_1?k.lam=g<0?g+Sb:g-Sb:l.value===this.area_enum.AREA_2?k.lam=g-Jb:k.lam=g;else if(this.face===this.face_enum.BOTTOM)i=Math.acos(h),k.phi=i-Jb,l.value===this.area_enum.AREA_0?k.lam=-g+Jb:l.value===this.area_enum.AREA_1?k.lam=-g:l.value===this.area_enum.AREA_2?k.lam=-g-Jb:k.lam=g<0?-g-Sb:-g+Sb;else{var m,n,o;m=h,j=m*m,o=j>=1?0:Math.sqrt(1-j)*Math.sin(g),j+=o*o,n=j>=1?0:Math.sqrt(1-j),l.value===this.area_enum.AREA_1?(j=n,n=-o,o=j):l.value===this.area_enum.AREA_2?(n=-n,o=-o):l.value===this.area_enum.AREA_3&&(j=n,n=o,o=-j),this.face===this.face_enum.RIGHT?(j=m,m=-n,n=j):this.face===this.face_enum.BACK?(m=-m,n=-n):this.face===this.face_enum.LEFT&&(j=m,m=n,n=-j),k.phi=Math.acos(-o)-Jb,k.lam=Math.atan2(n,m),this.face===this.face_enum.RIGHT?k.lam=this.qsc_shift_lon_origin(k.lam,-Jb):this.face===this.face_enum.BACK?k.lam=this.qsc_shift_lon_origin(k.lam,-Sb):this.face===this.face_enum.LEFT&&(k.lam=this.qsc_shift_lon_origin(k.lam,+Jb))}if(0!==this.es){var p,q,r;p=k.phi<0?1:0,q=Math.tan(k.phi),r=this.b/Math.sqrt(q*q+this.one_minus_f_squared),k.phi=Math.atan(Math.sqrt(this.a*this.a-r*r)/(this.one_minus_f*r)),p&&(k.phi=-k.phi)}return k.lam+=this.long0,a.x=k.lam,a.y=k.phi,a}function Bb(a,b,c,d){var e;return aQb&&e<=Jb+Qb?(d.value=this.area_enum.AREA_1,e-=Jb):e>Jb+Qb||e<=-(Jb+Qb)?(d.value=this.area_enum.AREA_2,e=e>=0?e-Sb:e+Sb):(d.value=this.area_enum.AREA_3,e+=Jb)),e}function Cb(a,b){var c=a+b;return c<-Sb?c+=Rb:c>+Sb&&(c-=Rb),c}var Db=function(a){a("EPSG:4326","+title=WGS 84 (long/lat) +proj=longlat +ellps=WGS84 +datum=WGS84 +units=degrees"),a("EPSG:4269","+title=NAD83 (long/lat) +proj=longlat +a=6378137.0 +b=6356752.31414036 +ellps=GRS80 +datum=NAD83 +units=degrees"),a("EPSG:3857","+title=WGS 84 / Pseudo-Mercator +proj=merc +a=6378137 +b=6378137 +lat_ts=0.0 +lon_0=0.0 +x_0=0.0 +y_0=0 +k=1.0 +units=m +nadgrids=@null +no_defs"),a.WGS84=a["EPSG:4326"],a["EPSG:3785"]=a["EPSG:3857"],a.GOOGLE=a["EPSG:3857"],a["EPSG:900913"]=a["EPSG:3857"],a["EPSG:102113"]=a["EPSG:3857"]},Eb=1,Fb=2,Gb=4,Hb=5,Ib=484813681109536e-20,Jb=Math.PI/2,Kb=.16666666666666666,Lb=.04722222222222222,Mb=.022156084656084655,Nb="undefined"==typeof Number.EPSILON?1e-10:Number.EPSILON,Ob=.017453292519943295,Pb=57.29577951308232,Qb=Math.PI/4,Rb=2*Math.PI,Sb=3.14159265359,Tb={};Tb.greenwich=0,Tb.lisbon=-9.131906111111,Tb.paris=2.337229166667,Tb.bogota=-74.080916666667,Tb.madrid=-3.687938888889,Tb.rome=12.452333333333,Tb.bern=7.439583333333,Tb.jakarta=106.807719444444,Tb.ferro=-17.666666666667,Tb.brussels=4.367975,Tb.stockholm=18.058277777778,Tb.athens=23.7163375,Tb.oslo=10.722916666667;var Ub={ft:{to_meter:.3048},"us-ft":{to_meter:1200/3937}},Vb=/[\s_\-\/\(\)]/g,Wb=function(b){var c,d,e,f={},g=b.split("+").map(function(a){return a.trim()}).filter(function(a){return a}).reduce(function(a,b){var c=b.split("=");return c.push(!0),a[c[0].toLowerCase()]=c[1],a},{}),h={proj:"projName",datum:"datumCode",rf:function(a){f.rf=parseFloat(a)},lat_0:function(a){f.lat0=a*Ob},lat_1:function(a){f.lat1=a*Ob},lat_2:function(a){f.lat2=a*Ob},lat_ts:function(a){f.lat_ts=a*Ob},lon_0:function(a){f.long0=a*Ob},lon_1:function(a){f.long1=a*Ob},lon_2:function(a){f.long2=a*Ob},alpha:function(a){f.alpha=parseFloat(a)*Ob},lonc:function(a){f.longc=a*Ob},x_0:function(a){f.x0=parseFloat(a)},y_0:function(a){f.y0=parseFloat(a)},k_0:function(a){f.k0=parseFloat(a)},k:function(a){f.k0=parseFloat(a)},a:function(a){f.a=parseFloat(a)},b:function(a){f.b=parseFloat(a)},r_a:function(){f.R_A=!0},zone:function(a){f.zone=parseInt(a,10)},south:function(){f.utmSouth=!0},towgs84:function(a){f.datum_params=a.split(",").map(function(a){return parseFloat(a)})},to_meter:function(a){f.to_meter=parseFloat(a)},units:function(b){f.units=b;var c=a(Ub,b);c&&(f.to_meter=c.to_meter)},from_greenwich:function(a){f.from_greenwich=a*Ob},pm:function(b){var c=a(Tb,b);f.from_greenwich=(c?c:parseFloat(b))*Ob},nadgrids:function(a){"@null"===a?f.datumCode="none":f.nadgrids=a},axis:function(a){var b="ewnsud";3===a.length&&b.indexOf(a.substr(0,1))!==-1&&b.indexOf(a.substr(1,1))!==-1&&b.indexOf(a.substr(2,1))!==-1&&(f.axis=a)}};for(c in g)d=g[c],c in h?(e=h[c],"function"==typeof e?e(d):f[e]=d):f[c]=d;return"string"==typeof f.datumCode&&"WGS84"!==f.datumCode&&(f.datumCode=f.datumCode.toLowerCase()),f},Xb=1,Yb=2,Zb=3,$b=4,_b=5,ac=-1,bc=/\s/,cc=/[A-Za-z]/,dc=/[A-Za-z84]/,ec=/[,\]]/,fc=/[\d\.E\-\+]/;b.prototype.readCharicter=function(){var a=this.text[this.place++];if(this.state!==$b)for(;bc.test(a);){if(this.place>=this.text.length)return;a=this.text[this.place++]}switch(this.state){case Xb:return this.neutral(a);case Yb:return this.keyword(a);case $b:return this.quoted(a);case _b:return this.afterquote(a);case Zb:return this.number(a);case ac:return}},b.prototype.afterquote=function(a){if('"'===a)return this.word+='"',void(this.state=$b);if(ec.test(a))return this.word=this.word.trim(),void this.afterItem(a);throw new Error("havn't handled \""+a+'" in afterquote yet, index '+this.place)},b.prototype.afterItem=function(a){return","===a?(null!==this.word&&this.currentObject.push(this.word),this.word=null,void(this.state=Xb)):"]"===a?(this.level--,null!==this.word&&(this.currentObject.push(this.word),this.word=null),this.state=Xb,this.currentObject=this.stack.pop(),void(this.currentObject||(this.state=ac))):void 0},b.prototype.number=function(a){if(fc.test(a))return void(this.word+=a);if(ec.test(a))return this.word=parseFloat(this.word),void this.afterItem(a);throw new Error("havn't handled \""+a+'" in number yet, index '+this.place)},b.prototype.quoted=function(a){return'"'===a?void(this.state=_b):void(this.word+=a)},b.prototype.keyword=function(a){if(dc.test(a))return void(this.word+=a);if("["===a){var b=[];return b.push(this.word),this.level++,null===this.root?this.root=b:this.currentObject.push(b),this.stack.push(this.currentObject),this.currentObject=b,void(this.state=Xb)}if(ec.test(a))return void this.afterItem(a);throw new Error("havn't handled \""+a+'" in keyword yet, index '+this.place)},b.prototype.neutral=function(a){if(cc.test(a))return this.word=a,void(this.state=Yb);if('"'===a)return this.word="",void(this.state=$b);if(fc.test(a))return this.word=a,void(this.state=Zb);if(ec.test(a))return void this.afterItem(a);throw new Error("havn't handled \""+a+'" in neutral yet, index '+this.place)},b.prototype.output=function(){for(;this.place2&&(b.z=a[2]),a.length>3&&(b.m=a[3]),b},Dc=z("WGS84"),Ec=6,Fc="AJSAJS",Gc="AFAFAF",Hc=65,Ic=73,Jc=79,Kc=86,Lc=90,Mc={forward:L,inverse:M,toPoint:N};Point.fromMGRS=function(a){return new Point(N(a))},Point.prototype.toMGRS=function(a){return L([this.x,this.y],a)};var Nc="2.4.4-alpha",Oc=1,Pc=.25,Qc=.046875,Rc=.01953125,Sc=.01068115234375,Tc=.75,Uc=.46875,Vc=.013020833333333334,Wc=.007120768229166667,Xc=.3645833333333333,Yc=.005696614583333333,Zc=.3076171875,$c=function(a){var b=[];b[0]=Oc-a*(Pc+a*(Qc+a*(Rc+a*Sc))),b[1]=a*(Tc-a*(Qc+a*(Rc+a*Sc)));var c=a*a;return b[2]=c*(Uc-a*(Vc+a*Wc)),c*=a,b[3]=c*(Xc-a*Yc),b[4]=c*a*Zc,b},_c=function(a,b,c,d){return c*=b,b*=b,d[0]*a-c*(d[1]+b*(d[2]+b*(d[3]+b*d[4])))},ad=20,bd=function(a,b,c){for(var d=1/(1-b),e=a,f=ad;f;--f){var g=Math.sin(e),h=1-b*g*g;if(h=(_c(e,g,Math.cos(e),c)-a)*(h*Math.sqrt(h))*d,e-=h,Math.abs(h)=0;)c=-g+d*f+a[e],g=f,f=c;return b+c*Math.sin(2*b)},jd=function(a,b){for(var c,d=2*Math.cos(b),e=a.length-1,f=a[e],g=0;--e>=0;)c=-g+d*f+a[e],g=f,f=c;return Math.sin(b)*c},kd=function(a){var b=Math.exp(a);return b=(b+1/b)/2},ld=function(a,b,c){for(var d,e,f=Math.sin(b),g=Math.cos(b),h=ed(c),i=kd(c),j=2*g*i,k=-2*f*h,l=a.length-1,m=a[l],n=0,o=0,p=0;--l>=0;)d=o,e=n,o=m,n=p,m=-d+j*o-k*n+a[l],p=-e+k*o+j*n;return j=f*i,k=g*h,[j*m-k*p,j*p+k*m]},md=["Extended_Transverse_Mercator","Extended Transverse Mercator","etmerc"],nd={init:ca,forward:da,inverse:ea,names:md},od=function(a,b){if(void 0===a){if(a=Math.floor(30*(mc(b)+Math.PI)/Math.PI)+1,a<0)return 0;if(a>60)return 60}return a},pd="etmerc",qd=["Universal Transverse Mercator System","utm"],rd={init:fa,names:qd,dependsOn:pd},sd=function(a,b){return Math.pow((1-a)/(1+a),b)},td=20,ud=["gauss"],vd={init:ga,forward:ha,inverse:ia,names:ud},wd=["Stereographic_North_Pole","Oblique_Stereographic","Polar_Stereographic","sterea","Oblique Stereographic Alternative"],xd={init:ja,forward:ka,inverse:la,names:wd},yd=["stere","Stereographic_South_Pole","Polar Stereographic (variant B)"],zd={init:na,forward:oa,inverse:pa,names:yd,ssfn_:ma},Ad=["somerc"],Bd={init:qa,forward:ra,inverse:sa,names:Ad},Cd=["Hotine_Oblique_Mercator","Hotine Oblique Mercator","Hotine_Oblique_Mercator_Azimuth_Natural_Origin","Hotine_Oblique_Mercator_Azimuth_Center","omerc"],Dd={init:ta,forward:ua,inverse:va,names:Cd},Ed=["Lambert Tangential Conformal Conic Projection","Lambert_Conformal_Conic","Lambert_Conformal_Conic_2SP","lcc"],Fd={init:wa,forward:xa,inverse:ya,names:Ed},Gd=["Krovak","krovak"],Hd={init:za,forward:Aa,inverse:Ba,names:Gd},Id=function(a,b,c,d,e){return a*e-b*Math.sin(2*e)+c*Math.sin(4*e)-d*Math.sin(6*e)},Jd=function(a){return 1-.25*a*(1+a/16*(3+1.25*a))},Kd=function(a){return.375*a*(1+.25*a*(1+.46875*a))},Ld=function(a){return.05859375*a*a*(1+.75*a)},Md=function(a){return a*a*a*(35/3072)},Nd=function(a,b,c){var d=b*c;return a/Math.sqrt(1-d*d)},Od=function(a){return Math.abs(a)1e-7?(c=a*b,(1-a*a)*(b/(1-c*c)-.5/a*Math.log((1-c)/(1+c)))):2*b},Td=1,Ud=2,Vd=3,Wd=4,Xd=.3333333333333333,Yd=.17222222222222222,Zd=.10257936507936508,$d=.06388888888888888,_d=.0664021164021164,ae=.016415012942191543,be=["Lambert Azimuthal Equal Area","Lambert_Azimuthal_Equal_Area","laea"],ce={init:Fa,forward:Ga,inverse:Ha,names:be,S_POLE:Td,N_POLE:Ud,EQUIT:Vd,OBLIQ:Wd},de=function(a){return Math.abs(a)>1&&(a=a>1?1:-1),Math.asin(a)},ee=["Albers_Conic_Equal_Area","Albers","aea"],fe={init:Ka,forward:La,inverse:Ma,names:ee,phi1z:Na},ge=["gnom"],he={init:Oa,forward:Pa,inverse:Qa,names:ge},ie=function(a,b){var c=1-(1-a*a)/(2*a)*Math.log((1-a)/(1+a));if(Math.abs(Math.abs(b)-c)<1e-6)return b<0?-1*Jb:Jb;for(var d,e,f,g,h=Math.asin(.5*b),i=0;i<30;i++)if(e=Math.sin(h),f=Math.cos(h),g=a*e,d=Math.pow(1-g*g,2)/(2*f)*(b/(1-a*a)-e/(1-g*g)+.5/a*Math.log((1-g)/(1+g))),h+=d,Math.abs(d)<=1e-10)return h;return NaN},je=["cea"],ke={init:Ra,forward:Sa,inverse:Ta,names:je},le=["Equirectangular","Equidistant_Cylindrical","eqc"],me={init:Ua,forward:Va,inverse:Wa,names:le},ne=20,oe=["Polyconic","poly"],pe={init:Xa,forward:Ya,inverse:Za,names:oe},qe=["New_Zealand_Map_Grid","nzmg"],re={init:$a,forward:_a,inverse:ab,names:qe},se=["Miller_Cylindrical","mill"],te={init:bb,forward:cb,inverse:db,names:se},ue=20,ve=["Sinusoidal","sinu"],we={init:eb,forward:fb,inverse:gb,names:ve},xe=["Mollweide","moll"],ye={init:hb,forward:ib,inverse:jb,names:xe},ze=["Equidistant_Conic","eqdc"],Ae={init:kb,forward:lb,inverse:mb,names:ze},Be=["Van_der_Grinten_I","VanDerGrinten","vandg"],Ce={init:nb,forward:ob,inverse:pb,names:Be},De=["Azimuthal_Equidistant","aeqd"],Ee={init:qb,forward:rb,inverse:sb,names:De},Fe=["ortho"],Ge={init:tb,forward:ub,inverse:vb,names:Fe},He=["geocent"],Ie={init:wb,forward:xb,inverse:xb,names:He},Je=["Quadrilateralized Spherical Cube","qsc"],Ke={init:yb,forward:zb,inverse:Ab,names:Je,qsc_fwd_equat_face_theta:Bb,qsc_shift_lon_origin:Cb},Le=function(_mproj4_){_mproj4_.Proj.projections.add(dd),_mproj4_.Proj.projections.add(nd),_mproj4_.Proj.projections.add(rd),_mproj4_.Proj.projections.add(xd),_mproj4_.Proj.projections.add(zd),_mproj4_.Proj.projections.add(Bd),_mproj4_.Proj.projections.add(Dd),_mproj4_.Proj.projections.add(Fd),_mproj4_.Proj.projections.add(Hd),_mproj4_.Proj.projections.add(Rd),_mproj4_.Proj.projections.add(ce),_mproj4_.Proj.projections.add(fe),_mproj4_.Proj.projections.add(he),_mproj4_.Proj.projections.add(ke),_mproj4_.Proj.projections.add(me),_mproj4_.Proj.projections.add(pe),_mproj4_.Proj.projections.add(re),_mproj4_.Proj.projections.add(te),_mproj4_.Proj.projections.add(we),_mproj4_.Proj.projections.add(ye),_mproj4_.Proj.projections.add(Ae),_mproj4_.Proj.projections.add(Ce),_mproj4_.Proj.projections.add(Ee),_mproj4_.Proj.projections.add(Ge),_mproj4_.Proj.projections.add(Ie),_mproj4_.Proj.projections.add(Ke)};return K.defaultDatum="WGS84",K.Proj=z,K.WGS84=new K.Proj("WGS84"),K.Point=Point,K.toPoint=Cc,K.defs=i,K.transform=H,K.mgrs=Mc,K.version=Nc,Le(K),K}); \ No newline at end of file diff --git a/src/core/utils/utils.js b/src/core/utils/utils.js index aa9db637..029f1f7a 100755 --- a/src/core/utils/utils.js +++ b/src/core/utils/utils.js @@ -1 +1,315 @@ - Melown.isEqual = function(value_, value2_, delta_) { return (Math.abs(value_ - value2_) < delta_); }; Melown.clamp = function(value_, min_, max_) { if (value_ < min_) value_ = min_; else if (value_ > max_) value_ = max_; return value_; }; Melown.radians = function(degrees_) { return degrees_ * Math.PI / 180; }; Melown.degrees = function(radians_) { return (radians_ / Math.PI) * 180; }; Melown.mix = function(a, b, c) { return a + (b - a) * c; }; Melown.validateBool = function(value_, defaultValue_) { if (typeof value_ === "boolean") { return value_; } else { return defaultValue_; } }; Melown.validateNumber = function(value_, minValue, maxValue, defaultValue_) { if (typeof value_ === "number") { return Melown.clamp(value_, minValue, maxValue); } else { return defaultValue_; } }; Melown.validateNumberArray = function(array_, arraySize_, minValues_, maxValues_, defaultValues_) { if (Array.isArray(array_) && array_.length == arraySize_) { for (var i = 0; i < arraySize_; i++) { array_[i] = Melown.clamp(array_[i], minValues_[i], maxValues_[i]); } return array_; } else { return defaultValues_; } }; Melown.validateString = function(value_, defaultValue_) { if (typeof value_ === "string") { return value_; } else { return defaultValue_; } }; Melown.padNumber = function(n, width_) { var z = '0'; if (n < 0) { n = (-n) + ''; width_--; //7 return n.length >= width_ ? ("-" + n) : "-" + (new Array(width_ - n.length + 1).join(z) + n); } else { n = n + ''; return n.length >= width_ ? n : new Array(width_ - n.length + 1).join(z) + n; } }; Melown.decodeFloat16 = function(binary) { var exponent = (binary & 0x7C00) >> 10; fraction = binary & 0x03FF; return (binary >> 15 ? -1 : 1) * ( exponent ? ( exponent === 0x1F ? fraction ? NaN : Infinity : Math.pow(2, exponent - 15) * (1 + fraction / 0x400) ) : 6.103515625e-5 * (fraction / 0x400) ); }; Melown.simpleFmtObj = (function obj(str, obj) { if (!str || str == "") { return ""; } return str.replace(/\{([_$a-zA-Z0-9][_$a-zA-Z0-9]*)\}/g, function(s, match) { return (match in obj ? obj[match] : s); }); }); Melown.simpleWikiLinks = (function obj(str_, plain_) { if (!str_ || str_ == "") { return ""; } var str2_ = Melown.simpleFmtObj(str_, {"copy":"©", "Y": (new Date().getFullYear())}); return str2_.replace(/\[([^\]]*)\]/g, function(s, match_) { match_ = match_.trim(); urls_ = match_.split(" ");//, 1); if (urls_[0].indexOf("//") != -1) { if (plain_) { if (urls_.length > 1) { return "" + match_.substring(urls_[0].length); } else { return "" + urls_[0]; } } else { if (urls_.length > 1) { return "" + match_.substring(urls_[0].length)+""; } else { return "" + urls_[0]+""; } } } return match_; }); }); Melown.simpleFmtObjOrCall = (function obj(str, obj, call) { if (!str || str == "") { return ""; } return str.replace(/\{([_$a-zA-Z(-9][_$a-zA-Z(-9]*)\}/g, function(s, match) { return (match in obj ? obj[match] : call(match)); }); }); Melown.getABGRFromHexaCode = (function(code_) { var result_ = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(code_); return result_ ? [ parseInt(result_[4], 16), parseInt(result_[3], 16), parseInt(result_[2], 16), parseInt(result_[1], 16)] : [0,0,0,255]; }); Melown.stringifyFunction = (function(function_) { // Stringify the code return '(' + function_ + ').call(self);'; }); Melown.loadJSON = function(path_, onLoaded_, onError_, skipParse_, withCredentials_, xhrParams_) { var xhr_ = new XMLHttpRequest(); //xhr_.onload = (function() { xhr_.onreadystatechange = (function (){ switch (xhr_.readyState) { case 0 : // UNINITIALIZED case 1 : // LOADING case 2 : // LOADED case 3 : // INTERACTIVE break; case 4 : // COMPLETED if (xhr_.status >= 400 || xhr_.status == 0) { if (onError_) { onError_(xhr_.status); } break; } var data_ = xhr_.response; var parsedData_ = data_; if (!skipParse_) { try { //var parsedData_ = skipParse_ ? data_ : eval("("+data_+")"); parsedData_ = JSON.parse(data_); } catch(e) { console.log("JSON Parse Error ("+path_+"): " + (e["message"] ? e["message"] : "")); if (onError_ ) { onError_(xhr_.status); } return; } } if (onLoaded_) { onLoaded_(parsedData_); } break; } }).bind(this); /* xhr_.onerror = (function() { if (onError_) { onError_(); } }).bind(this);*/ xhr_.open('GET', path_, true); xhr_.withCredentials = withCredentials_; if (xhrParams_ && xhrParams_["token"] /*&& xhrParams_["tokenHeader"]*/) { //xhr_.setRequestHeader(xhrParams_["tokenHeader"], xhrParams_["token"]); //old way xhr_.setRequestHeader("Accept", "token/" + xhrParams_["token"] + ", */*"); } xhr_.send(""); }; Melown.loadBinary = function(path_, onLoaded_, onError_, withCredentials_, xhrParams_, responseType_) { var xhr_ = new XMLHttpRequest(); xhr_.onreadystatechange = (function (){ switch (xhr_.readyState) { case 0 : // UNINITIALIZED case 1 : // LOADING case 2 : // LOADED case 3 : // INTERACTIVE break; case 4 : // COMPLETED if (xhr_.status >= 400 || xhr_.status == 0) { if (onError_) { onError_(xhr_.status); } break; } var abuffer_ = xhr_.response; if (!abuffer_) { if (onError_) { onError_(); } break; } //if (!responseType_ || responseType_ == "arraybuffer") { //var data_ = new DataView(abuffer_); //} else { // var data_ = abuffer_; //} if (onLoaded_) { onLoaded_(abuffer_); } break; default: if (onError_) { onError_(); } break; } }).bind(this); /* xhr_.onerror = (function() { if (onError_) { onError_(); } }).bind(this);*/ xhr_.open('GET', path_, true); xhr_.responseType = responseType_ ? responseType_ : "arraybuffer"; xhr_.withCredentials = withCredentials_; if (xhrParams_ && xhrParams_["token"] /*&& xhrParams_["tokenHeader"]*/) { //xhr_.setRequestHeader(xhrParams_["tokenHeader"], xhrParams_["token"]); //old way xhr_.setRequestHeader("Accept", "token/" + xhrParams_["token"] + ", */*"); } xhr_.send(""); }; window.performance = window.performance || {}; performance.now = (function() { return performance.now || performance.mozNow || performance.msNow || performance.oNow || performance.webkitNow || function() { return new Date().getTime(); }; })(); //Provides requestAnimationFrame in a cross browser way. window.requestAnimFrame = (function() { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) { window.setTimeout(callback, 1000/60); }; })(); // only implement if no native implementation is available if (typeof Array.isArray === 'undefined') { Array.isArray = (function(obj) { return Object.prototype.toString.call(obj) === '[object Array]'; }); } Melown["isEqual"] = Melown.isEqual; Melown["clamp"] = Melown.clamp; Melown["mix"] = Melown.mix; Melown["radians"] = Melown.radians; Melown["degrees"] = Melown.degrees; Melown["loadJSON"] = Melown.loadJSON; Melown["loadBinary"] = Melown.loadBinary; \ No newline at end of file +Melown.isEqual = function(value_, value2_, delta_) { + return (Math.abs(value_ - value2_) < delta_); +}; + +Melown.clamp = function(value_, min_, max_) { + if (value_ < min_) value_ = min_; + else if (value_ > max_) value_ = max_; + + return value_; +}; + +Melown.radians = function(degrees_) { + return degrees_ * Math.PI / 180; +}; + +Melown.degrees = function(radians_) { + return (radians_ / Math.PI) * 180; +}; + +Melown.mix = function(a, b, c) { + return a + (b - a) * c; +}; + +Melown.validateBool = function(value_, defaultValue_) { + if (typeof value_ === "boolean") { + return value_; + } else { + return defaultValue_; + } +}; + +Melown.validateNumber = function(value_, minValue, maxValue, defaultValue_) { + if (typeof value_ === "number") { + return Melown.clamp(value_, minValue, maxValue); + } else { + return defaultValue_; + } +}; + +Melown.validateString = function(value_, defaultValue_) { + if (typeof value_ === "string") { + return value_; + } else { + return defaultValue_; + } +}; + +Melown.padNumber = function(n, width_) { + var z = '0'; + + if (n < 0) { + n = (-n) + ''; + width_--; //7 + return n.length >= width_ ? ("-" + n) : "-" + (new Array(width_ - n.length + 1).join(z) + n); + } else { + n = n + ''; + return n.length >= width_ ? n : new Array(width_ - n.length + 1).join(z) + n; + } +}; + +Melown.decodeFloat16 = function(binary) { + var exponent = (binary & 0x7C00) >> 10; + fraction = binary & 0x03FF; + return (binary >> 15 ? -1 : 1) * ( + exponent ? + ( + exponent === 0x1F ? + fraction ? NaN : Infinity : + Math.pow(2, exponent - 15) * (1 + fraction / 0x400) + ) : + 6.103515625e-5 * (fraction / 0x400) + ); +}; + +Melown.simpleFmtObj = (function obj(str, obj) { + if (!str || str == "") { + return ""; + } + + return str.replace(/\{([_$a-zA-Z0-9][_$a-zA-Z0-9]*)\}/g, function(s, match) { + return (match in obj ? obj[match] : s); + }); +}); + +Melown.simpleWikiLinks = (function obj(str_, plain_) { + if (!str_ || str_ == "") { + return ""; + } + + var str2_ = Melown.simpleFmtObj(str_, {"copy":"©", "Y": (new Date().getFullYear())}); + + return str2_.replace(/\[([^\]]*)\]/g, function(s, match_) { + match_ = match_.trim(); + urls_ = match_.split(" ");//, 1); + + if (urls_[0].indexOf("//") != -1) { + if (plain_) { + if (urls_.length > 1) { + return "" + match_.substring(urls_[0].length); + } else { + return "" + urls_[0]; + } + } else { + if (urls_.length > 1) { + return "" + match_.substring(urls_[0].length)+""; + } else { + return "" + urls_[0]+""; + } + } + } + + return match_; + }); +}); + +Melown.simpleFmtObjOrCall = (function obj(str, obj, call) { + if (!str || str == "") { + return ""; + } + + return str.replace(/\{([_$a-zA-Z(-9][_$a-zA-Z(-9]*)\}/g, function(s, match) { + return (match in obj ? obj[match] : call(match)); + }); +}); + +Melown.getABGRFromHexaCode = (function(code_) { + var result_ = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(code_); + + return result_ ? + [ parseInt(result_[4], 16), + parseInt(result_[3], 16), + parseInt(result_[2], 16), + parseInt(result_[1], 16)] + : [0,0,0,255]; +}); + +Melown.stringifyFunction = (function(function_) { + // Stringify the code + return '(' + function_ + ').call(self);'; +}); + +Melown.loadJSON = function(path_, onLoaded_, onError_, skipParse_, withCredentials_, xhrParams_) { + var xhr_ = new XMLHttpRequest(); + + //xhr_.onload = (function() { + xhr_.onreadystatechange = (function (){ + + switch (xhr_.readyState) { + case 0 : // UNINITIALIZED + case 1 : // LOADING + case 2 : // LOADED + case 3 : // INTERACTIVE + break; + case 4 : // COMPLETED + + if (xhr_.status >= 400 || xhr_.status == 0) { + if (onError_) { + onError_(xhr_.status); + } + break; + } + + var data_ = xhr_.response; + var parsedData_ = data_; + + if (!skipParse_) { + try { + //var parsedData_ = skipParse_ ? data_ : eval("("+data_+")"); + parsedData_ = JSON.parse(data_); + } catch(e) { + console.log("JSON Parse Error ("+path_+"): " + (e["message"] ? e["message"] : "")); + + if (onError_ ) { + onError_(xhr_.status); + } + + return; + } + } + + if (onLoaded_) { + onLoaded_(parsedData_); + } + + break; + } + + }).bind(this); + + /* + xhr_.onerror = (function() { + if (onError_) { + onError_(); + } + }).bind(this);*/ + + xhr_.open('GET', path_, true); + xhr_.withCredentials = withCredentials_; + + if (xhrParams_ && xhrParams_["token"] /*&& xhrParams_["tokenHeader"]*/) { + //xhr_.setRequestHeader(xhrParams_["tokenHeader"], xhrParams_["token"]); //old way + xhr_.setRequestHeader("Accept", "token/" + xhrParams_["token"] + ", */*"); + } + + xhr_.send(""); +}; + +Melown.loadBinary = function(path_, onLoaded_, onError_, withCredentials_, xhrParams_, responseType_) { + var xhr_ = new XMLHttpRequest(); + + xhr_.onreadystatechange = (function (){ + + switch (xhr_.readyState) { + case 0 : // UNINITIALIZED + case 1 : // LOADING + case 2 : // LOADED + case 3 : // INTERACTIVE + break; + case 4 : // COMPLETED + + if (xhr_.status >= 400 || xhr_.status == 0) { + if (onError_) { + onError_(xhr_.status); + } + break; + } + + var abuffer_ = xhr_.response; + + if (!abuffer_) { + if (onError_) { + onError_(); + } + break; + } + + //if (!responseType_ || responseType_ == "arraybuffer") { + //var data_ = new DataView(abuffer_); + //} else { + // var data_ = abuffer_; + //} + + if (onLoaded_) { + onLoaded_(abuffer_); + } + + break; + + default: + + if (onError_) { + onError_(); + } + + break; + } + + }).bind(this); + + /* + xhr_.onerror = (function() { + if (onError_) { + onError_(); + } + }).bind(this);*/ + + xhr_.open('GET', path_, true); + xhr_.responseType = responseType_ ? responseType_ : "arraybuffer"; + xhr_.withCredentials = withCredentials_; + + if (xhrParams_ && xhrParams_["token"] /*&& xhrParams_["tokenHeader"]*/) { + //xhr_.setRequestHeader(xhrParams_["tokenHeader"], xhrParams_["token"]); //old way + xhr_.setRequestHeader("Accept", "token/" + xhrParams_["token"] + ", */*"); + } + + xhr_.send(""); +}; + +window.performance = window.performance || {}; +performance.now = (function() { + return performance.now || + performance.mozNow || + performance.msNow || + performance.oNow || + performance.webkitNow || + function() { return new Date().getTime(); }; +})(); + +//Provides requestAnimationFrame in a cross browser way. +window.requestAnimFrame = (function() { + + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function(/* function FrameRequestCallback */ callback, /* DOMElement Element */ element) { + window.setTimeout(callback, 1000/60); + }; +})(); + +// only implement if no native implementation is available +if (typeof Array.isArray === 'undefined') { + Array.isArray = (function(obj) { + return Object.prototype.toString.call(obj) === '[object Array]'; + }); +} + +Melown["isEqual"] = Melown.isEqual; +Melown["clamp"] = Melown.clamp; +Melown["mix"] = Melown.mix; +Melown["radians"] = Melown.radians; +Melown["degrees"] = Melown.degrees; +Melown["loadJSON"] = Melown.loadJSON; +Melown["loadBinary"] = Melown.loadBinary; diff --git a/test/index.js b/test/index.js new file mode 100644 index 00000000..90cbb07b --- /dev/null +++ b/test/index.js @@ -0,0 +1,11 @@ +var expect = require("chai").expect, + MapCore = require('../src/core/interface').MapCore; + +describe("#MapCore", function() { + it('constructor', function() { + var core = MapCore('map-div', { + map: "https://demo.test.mlwn.se/public-maps/grand-ev/mapConfig.json" + }); + expect(core).to.be.a('object'); + }); +}); diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 00000000..72145f11 --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,65 @@ +var path = require('path'); +var webpack = require('webpack'); +var CopyWebpackPlugin = require('copy-webpack-plugin'); +var CommonChunks = require('copy-webpack-plugin'); +var UglifyJsPlugin = webpack.optimize.UglifyJsPlugin; +var ExtractTextPlugin = require("extract-text-webpack-plugin"); + +var PROD = (process.env.NODE_ENV === 'production') + +var plugins = [ + new ExtractTextPlugin({ + filename: "melown-browser.css" + }) +]; + +if (PROD) { + plugins.push(new UglifyJsPlugin({ + compress: true, + mangle: true, + extractComments: {}, + })); +} + + +var libraryName = 'bundle'; +var outputFile = libraryName + '.js'; +var outFile = libraryName + '.js'; + + +var config = { + entry: { + 'melown-core': __dirname + '/src/core/index.js', + 'melown-browser': __dirname + '/src/browser/index.js' + }, + devtool: 'source-map', + output: { + path: __dirname + '/build/', + filename: '[name].js', + libraryTarget: "var", + library: "Melown" + }, + module: { + loaders: [ + { + include: [path.resolve(__dirname, "src/")] + }, + { + test: /\.css$/, loader: ExtractTextPlugin.extract({fallback: "style-loader", use: "css-loader"}) + }, + ] + }, + resolve: { + modules : ['./node_modules/', './src/'], + alias: { + core: path.resolve(__dirname, 'src/core/'), + browser: path.resolve(__dirname, 'src/browser/') + } + }, + devServer: { + inline: true + }, + plugins: plugins +}; + +module.exports = config;