From 490f7b6da6c24c28d5a445d9b6ec011dc3d0467f Mon Sep 17 00:00:00 2001 From: C-WINN <150981627+C-WINN@users.noreply.github.com> Date: Fri, 1 Dec 2023 00:21:37 -0500 Subject: [PATCH] Add files via upload --- css/L.Control.Locate.min.css | 2 + css/MarkerCluster.Default.css | 60 + css/MarkerCluster.css | 14 + css/fontawesome-all.min.css | 5 + css/images/cancel.png | Bin 0 -> 397 bytes css/images/cancel_@2X.png | Bin 0 -> 762 bytes css/images/check.png | Bin 0 -> 387 bytes css/images/check_@2X.png | Bin 0 -> 692 bytes css/images/focus.png | Bin 0 -> 326 bytes css/images/focus_@2X.png | Bin 0 -> 462 bytes css/images/layers-2x.png | Bin 0 -> 1259 bytes css/images/layers.png | Bin 0 -> 696 bytes css/images/marker-icon-2x.png | Bin 0 -> 2464 bytes css/images/marker-icon.png | Bin 0 -> 1466 bytes css/images/marker-shadow.png | Bin 0 -> 618 bytes css/images/measure-control.png | Bin 0 -> 344 bytes css/images/rulers.png | Bin 0 -> 344 bytes css/images/rulers_@2X.png | Bin 0 -> 277 bytes css/images/start.png | Bin 0 -> 491 bytes css/images/start_@2X.png | Bin 0 -> 1003 bytes css/images/throbber.gif | Bin 0 -> 4831 bytes css/images/trash.png | Bin 0 -> 279 bytes css/images/trash_@2X.png | Bin 0 -> 460 bytes css/leaflet-control-geocoder.Geocoder.css | 123 + css/leaflet-measure.css | 1 + css/leaflet.css | 640 ++ css/qgis2web.css | 129 + data/Cafeswithin500mofaPublicLibrary_6.js | 1 + data/City_Boundary_1.js | 1 + data/DowntownStudySpots_4.js | 1 + data/PublicLibrariesinHamilton_5.js | 1 + data/RedeemerUniversityCampus_2.js | 1 + data/RedemerCampusStudySpots_3.js | 1 + index.html | 605 ++ js/Autolinker.min.js | 11 + js/L.Control.Locate.min.js | 5 + js/Leaflet.VectorGrid.js | 2585 ++++++ js/OSMBuildings-Leaflet.js | 48 + js/labelgun.min.js | 1 + js/labels.js | 62 + js/leaflet-control-geocoder.Geocoder.js | 1296 +++ js/leaflet-hash.js | 162 + js/leaflet-heat.js | 11 + js/leaflet-measure.js | 7648 ++++++++++++++++++ js/leaflet-svg-shape-markers.min.js | 1 + js/leaflet-tilelayer-wmts.js | 1 + js/leaflet.js | 6 + js/leaflet.js.map | 1 + js/leaflet.markercluster.js | 6 + js/leaflet.pattern.js | 6 + js/leaflet.rotatedMarker.js | 51 + js/leaflet.wms.js | 495 ++ js/multi-style-layer.js | 52 + js/qgis2web_expressions.js | 756 ++ js/rbush.min.js | 1 + legend/Cafeswithin500mofaPublicLibrary_6.png | Bin 0 -> 395 bytes legend/City_Boundary_1.png | Bin 0 -> 136 bytes legend/DowntownStudySpots_4.png | Bin 0 -> 438 bytes legend/PublicLibrariesinHamilton_5.png | Bin 0 -> 441 bytes legend/RedeemerUniversityCampus_2.png | Bin 0 -> 155 bytes legend/RedemerCampusStudySpots_3.png | Bin 0 -> 466 bytes webfonts/fa-solid-900.ttf | Bin 0 -> 132920 bytes webfonts/fa-solid-900.woff2 | Bin 0 -> 50372 bytes 63 files changed, 14790 insertions(+) create mode 100644 css/L.Control.Locate.min.css create mode 100644 css/MarkerCluster.Default.css create mode 100644 css/MarkerCluster.css create mode 100644 css/fontawesome-all.min.css create mode 100644 css/images/cancel.png create mode 100644 css/images/cancel_@2X.png create mode 100644 css/images/check.png create mode 100644 css/images/check_@2X.png create mode 100644 css/images/focus.png create mode 100644 css/images/focus_@2X.png create mode 100644 css/images/layers-2x.png create mode 100644 css/images/layers.png create mode 100644 css/images/marker-icon-2x.png create mode 100644 css/images/marker-icon.png create mode 100644 css/images/marker-shadow.png create mode 100644 css/images/measure-control.png create mode 100644 css/images/rulers.png create mode 100644 css/images/rulers_@2X.png create mode 100644 css/images/start.png create mode 100644 css/images/start_@2X.png create mode 100644 css/images/throbber.gif create mode 100644 css/images/trash.png create mode 100644 css/images/trash_@2X.png create mode 100644 css/leaflet-control-geocoder.Geocoder.css create mode 100644 css/leaflet-measure.css create mode 100644 css/leaflet.css create mode 100644 css/qgis2web.css create mode 100644 data/Cafeswithin500mofaPublicLibrary_6.js create mode 100644 data/City_Boundary_1.js create mode 100644 data/DowntownStudySpots_4.js create mode 100644 data/PublicLibrariesinHamilton_5.js create mode 100644 data/RedeemerUniversityCampus_2.js create mode 100644 data/RedemerCampusStudySpots_3.js create mode 100644 index.html create mode 100644 js/Autolinker.min.js create mode 100644 js/L.Control.Locate.min.js create mode 100644 js/Leaflet.VectorGrid.js create mode 100644 js/OSMBuildings-Leaflet.js create mode 100644 js/labelgun.min.js create mode 100644 js/labels.js create mode 100644 js/leaflet-control-geocoder.Geocoder.js create mode 100644 js/leaflet-hash.js create mode 100644 js/leaflet-heat.js create mode 100644 js/leaflet-measure.js create mode 100644 js/leaflet-svg-shape-markers.min.js create mode 100644 js/leaflet-tilelayer-wmts.js create mode 100644 js/leaflet.js create mode 100644 js/leaflet.js.map create mode 100644 js/leaflet.markercluster.js create mode 100644 js/leaflet.pattern.js create mode 100644 js/leaflet.rotatedMarker.js create mode 100644 js/leaflet.wms.js create mode 100644 js/multi-style-layer.js create mode 100644 js/qgis2web_expressions.js create mode 100644 js/rbush.min.js create mode 100644 legend/Cafeswithin500mofaPublicLibrary_6.png create mode 100644 legend/City_Boundary_1.png create mode 100644 legend/DowntownStudySpots_4.png create mode 100644 legend/PublicLibrariesinHamilton_5.png create mode 100644 legend/RedeemerUniversityCampus_2.png create mode 100644 legend/RedemerCampusStudySpots_3.png create mode 100644 webfonts/fa-solid-900.ttf create mode 100644 webfonts/fa-solid-900.woff2 diff --git a/css/L.Control.Locate.min.css b/css/L.Control.Locate.min.css new file mode 100644 index 0000000..b13a172 --- /dev/null +++ b/css/L.Control.Locate.min.css @@ -0,0 +1,2 @@ +.leaflet-control-locate a{font-size:1.4em;color:#444}.leaflet-control-locate.active a{color:#2074B6}.leaflet-control-locate.active.following a{color:#FC8428} +/*# sourceMappingURL=L.Control.Locate.min.css.map */ diff --git a/css/MarkerCluster.Default.css b/css/MarkerCluster.Default.css new file mode 100644 index 0000000..da330ca --- /dev/null +++ b/css/MarkerCluster.Default.css @@ -0,0 +1,60 @@ +.marker-cluster-small { + background-color: rgba(181, 226, 140, 0.6); + } +.marker-cluster-small div { + background-color: rgba(110, 204, 57, 0.6); + } + +.marker-cluster-medium { + background-color: rgba(241, 211, 87, 0.6); + } +.marker-cluster-medium div { + background-color: rgba(240, 194, 12, 0.6); + } + +.marker-cluster-large { + background-color: rgba(253, 156, 115, 0.6); + } +.marker-cluster-large div { + background-color: rgba(241, 128, 23, 0.6); + } + + /* IE 6-8 fallback colors */ +.leaflet-oldie .marker-cluster-small { + background-color: rgb(181, 226, 140); + } +.leaflet-oldie .marker-cluster-small div { + background-color: rgb(110, 204, 57); + } + +.leaflet-oldie .marker-cluster-medium { + background-color: rgb(241, 211, 87); + } +.leaflet-oldie .marker-cluster-medium div { + background-color: rgb(240, 194, 12); + } + +.leaflet-oldie .marker-cluster-large { + background-color: rgb(253, 156, 115); + } +.leaflet-oldie .marker-cluster-large div { + background-color: rgb(241, 128, 23); +} + +.marker-cluster { + background-clip: padding-box; + border-radius: 20px; + } +.marker-cluster div { + width: 30px; + height: 30px; + margin-left: 5px; + margin-top: 5px; + + text-align: center; + border-radius: 15px; + font: 12px "Helvetica Neue", Arial, Helvetica, sans-serif; + } +.marker-cluster span { + line-height: 30px; + } \ No newline at end of file diff --git a/css/MarkerCluster.css b/css/MarkerCluster.css new file mode 100644 index 0000000..7ac0182 --- /dev/null +++ b/css/MarkerCluster.css @@ -0,0 +1,14 @@ +.leaflet-cluster-anim .leaflet-marker-icon, .leaflet-cluster-anim .leaflet-marker-shadow { + -webkit-transition: -webkit-transform 0.3s ease-out, opacity 0.3s ease-in; + -moz-transition: -moz-transform 0.3s ease-out, opacity 0.3s ease-in; + -o-transition: -o-transform 0.3s ease-out, opacity 0.3s ease-in; + transition: transform 0.3s ease-out, opacity 0.3s ease-in; +} + +.leaflet-cluster-spider-leg { + /* stroke-dashoffset (duration and function) should match with leaflet-marker-icon transform in order to track it exactly */ + -webkit-transition: -webkit-stroke-dashoffset 0.3s ease-out, -webkit-stroke-opacity 0.3s ease-in; + -moz-transition: -moz-stroke-dashoffset 0.3s ease-out, -moz-stroke-opacity 0.3s ease-in; + -o-transition: -o-stroke-dashoffset 0.3s ease-out, -o-stroke-opacity 0.3s ease-in; + transition: stroke-dashoffset 0.3s ease-out, stroke-opacity 0.3s ease-in; +} diff --git a/css/fontawesome-all.min.css b/css/fontawesome-all.min.css new file mode 100644 index 0000000..dc2a0ab --- /dev/null +++ b/css/fontawesome-all.min.css @@ -0,0 +1,5 @@ +/*! + * Font Awesome Free 5.0.13 by @fontawesome - https://fontawesome.com + * License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License) + */ +.fa,.fab,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{animation:a 2s infinite linear}.fa-pulse{animation:a 1s infinite steps(8)}@keyframes a{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";transform:scaleX(-1)}.fa-flip-vertical{transform:scaleY(-1)}.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-horizontal.fa-flip-vertical{transform:scale(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-aws:before{content:"\f375"}.fa-backward:before{content:"\f04a"}.fa-balance-scale:before{content:"\f24e"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bicycle:before{content:"\f206"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blind:before{content:"\f29d"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-book:before{content:"\f02d"}.fa-book-open:before{content:"\f518"}.fa-bookmark:before{content:"\f02e"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-btc:before{content:"\f15a"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-certificate:before{content:"\f0a3"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-square:before{content:"\f14a"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-credit-card:before{content:"\f09d"}.fa-crop:before{content:"\f125"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-deviantart:before{content:"\f1bd"}.fa-diagnoses:before{content:"\f470"}.fa-dice:before{content:"\f522"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-excel:before{content:"\f1c3"}.fa-file-image:before{content:"\f1c5"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fire:before{content:"\f06d"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-fulcrum:before{content:"\f50b"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-gift:before{content:"\f06b"}.fa-git:before{content:"\f1d3"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-martini:before{content:"\f000"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hashtag:before{content:"\f292"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-heart:before{content:"\f004"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-houzz:before{content:"\f27c"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-internet-explorer:before{content:"\f26b"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-joget:before{content:"\f3b7"}.fa-joomla:before{content:"\f1aa"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-meh:before{content:"\f11a"}.fa-memory:before{content:"\f538"}.fa-mercury:before{content:"\f223"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-moon:before{content:"\f186"}.fa-motorcycle:before{content:"\f21c"}.fa-mouse-pointer:before{content:"\f245"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nintendo-switch:before{content:"\f418"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-old-republic:before{content:"\f510"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-osi:before{content:"\f41a"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-paint-brush:before{content:"\f1fc"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-people-carry:before{content:"\f4ce"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-volume:before{content:"\f2a0"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-plane:before{content:"\f072"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poo:before{content:"\f2fe"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-r-project:before{content:"\f4f7"}.fa-random:before{content:"\f074"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-rendact:before{content:"\f3e4"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-retweet:before{content:"\f079"}.fa-ribbon:before{content:"\f4d6"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-rupee-sign:before{content:"\f156"}.fa-safari:before{content:"\f267"}.fa-sass:before{content:"\f41e"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-search:before{content:"\f002"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shower:before{content:"\f2cc"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skull:before{content:"\f54c"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowflake:before{content:"\f2dc"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-spinner:before{content:"\f110"}.fa-spotify:before{content:"\f1bc"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-star:before{content:"\f005"}.fa-star-half:before{content:"\f089"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toolbox:before{content:"\f552"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-train:before{content:"\f238"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-moving:before{content:"\f4df"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-uikit:before{content:"\f403"}.fa-umbrella:before{content:"\f0e9"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-glass:before{content:"\f4e3"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:Font Awesome\ 5 Free}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/css/images/cancel.png b/css/images/cancel.png new file mode 100644 index 0000000000000000000000000000000000000000..a4e7c492ef6361dfcc8d2584c8b6b72212d8e9e8 GIT binary patch literal 397 zcmV;80doF{P)!kTFgIQ4~eb9Y&Z*6xo3t ziO^xR#}0cM&=A2!tyl|*+93wkU`c4Gq%yMt7eGib42k*AVgOARe4zFPxYJO&jKP^sj|g7?GKFo5Ya(6%nVqzEXjof8e~2DycWBznNb>RjX-HV`T$4{o$T ziH0BsbFz_VS_RZsqcIFzX75E%{O4O=bD8Y1*XxzzRLWHhqQ7A0KF&Iw{Bl#Q(HI7n r-n}+am#MIJ2KD!Y>_exMUjlprupxbFzN5i;00000NkvXXu0mjf1P-X} literal 0 HcmV?d00001 diff --git a/css/images/cancel_@2X.png b/css/images/cancel_@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..dcc72f0c191f021818a99133bd298c558cca57ce GIT binary patch literal 762 zcmV}PgtpK4o^yWBd+vSCJ(sAXvFZJG(^O#quK@%Ecvc>fD}rYb&q{GxH0Hd zj7;pck;Wn*Z%C?oO^ApF@x?5u+4NfX`J)EW$^9s(J`s3Y5A0x7pyt&2YH*{vTGQRT z*ufmB63xQ_fId-3MPr8_YO2+plPb|X*e(G^lks5s!5}iR*G6TW{9Wfx4w4r#kc8d59ha@VyRdw>(D*HC572U;zNs*z|t8h`hC~BvmM}(vvM3PX++_<^nrm z$G%jmt02Xe!A9W#K%j%s*x?<47Izb%x@!Pv1YX(0UER;X|BwRY>XA7$&-~AecTHE7 zc&P}UH468ZZnNG}F;gd97RjlCAlE1yKyRIN*`x(IMdjHP5p6fu3+`#DO&3)8)LLYc z+#&!(V+Y#=hb;~Th=eMK$Sp0qLRqBXGeDnZES-o4M-2clOKR3I^ib_2`aot}!1wB- zu+O%6;9Bd_98kFr(rex4)SP+*)`U2@vHJ4og8=}nuLd_D`1sFkk@v}X_x6L8bvzn7 z9HGcENPkmY;2Pj$H5{;9nE;TC2h&0Z0Bkv?%Ptc@+T+myD;#k7tGL(5_))82=&*qO s1UdkDURibt$f*|ONNy$L!3#IWZz+CGCOrV=;s5{u07*qoM6N<$f~%rcF8}}l literal 0 HcmV?d00001 diff --git a/css/images/check.png b/css/images/check.png new file mode 100644 index 0000000000000000000000000000000000000000..55f274b1d85c7930ebcc253cbca86aaf358fb76e GIT binary patch literal 387 zcmV-}0et?6P)kkTFXF0T_m#_wLj?DDxk* z3E5`Y(vl5OYE00rt)bB-r<~+|L2HX(p>*EYkitRUJAORh_rC8Z zR%&)eK`_f-11-ZU0FolZ2F_x3-|N-q00L-TjCVaRc?IpUK?afQCXJ_u!w)q(qagUo zjkDnNQmIfpaQJBY4TP!yLbtJ3$i>*{e;7c0 zh2hXo3fu33{mk-!!K73u)|_6iK6l-uVXIGM!ATOIb-U$-*26Fy`j+3iG|`r+vd#?Z h@A$>XZnwMu_ysFna@?3hyu<(i002ovPDHLkV1fVxrO*HX literal 0 HcmV?d00001 diff --git a/css/images/check_@2X.png b/css/images/check_@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..df8032e49651d82a009edfaf0ef29badc9c7b7f6 GIT binary patch literal 692 zcmV;l0!#ggP)8cT8;vkC&{spvFlokpk`~xNiS5m5zu($|ef)R1*y`KXG z`r}e^>pQ;ZyU+W5C+Fl`(MA)Qarac1@UBfY|V>Zl<)@zjtLoGF46@w;;II4jdA7qCnG2d2glOZRl=1y*(?r zLUcHQuA5^ynXbHSaO*plTp>ERRR*KQoL4#z7@OMak&FNAtn;u0`(sj~nDh1>fOGNr z|A8C)Z7`%R!90K_GUeWCRllw}Ep4>q2h}$*#lIr%UJPM@@4H^-`);^%xP9)q)jzqC zA3Q*08i$aJ$Ae+V=_TqA?meHIQ}8TZxo1YHr2-8(AQ2gD_Ng8o7~dprHrEOI+{N{8 z!F<7}hQWJpdsA1zYt`MMdvA~}2gnN9fsM0}PT-(JC$!r- zL9j5Mu1o>cLLNki1K5tnQ?FKSl9-DEH#qi#>MYdWgVJLE zo&rrr=O=u<5X=vX`tW>PZ!4!jfqny8s;@S2)N!~(;&R$q^-|>(b%pjnmOi->kb++tyAin zBDQq*+w0<;Q-l*XPCk^dHb*^hS#AA)o3n@P-5KImJ$B}rx+?A1gL}8{Fy>_EJ0Ive zQPK2nadfR@gNW9GA4_-4Fjiq$HH&fG{inWjW|{9SeJQQ5+s1%xdyConrH*~m`<=ay@wZ*H UQzopr05^1kr2qf` literal 0 HcmV?d00001 diff --git a/css/images/focus_@2X.png b/css/images/focus_@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..1eb7dd4cef4cd2eacd5738c37f37d5a14fdb4177 GIT binary patch literal 462 zcmV;<0WtoGP)KmA@_oQ5431=k5>{)p`h} ztk{-bL`}A`vz~xw;0YKKL7@}WqSb6fDV_i;5s5@G>wbzwX2+j9$ZGhybMk%XJLk-u zd*L4eST?B5H)k-dVm6%3ZzmPw9n|8cvawJLqrS5?cJPvO-F9z_f2~_9n}Oort%GTPtXJO+#m{5V775O;^bF=2}430o7v)4QaKN4gS(z>oQ{;dKfxHx z<^^{Ssv(o$ik$ok#vsyO3guGjh7kt_Lmrlc`Vaw_07%UmyGi9{b91!iOHmA9(&Uc~ z3<+Q$b+7Aerw@gWF%FhCYNy;#0irRPomHqW|G1C*;4?@4#E?jH>?v@U%cy?3dQAc-DchXVErpOh~ z-jbon+tNbnl6hoEb;)TVk+%hTDDi_G%i3*RZ&15!$Fjr^f;Ke&A@|?=`2&+{zr+3a z{D*=t(`AXyS%X7N z%a#RZw6vD^t_rnM`L4E>m=U&R!A-&}nZIi$BOPvkhrCuUe@BN~-lRD)f44;J%TwgE zcze8u!PQ_NR7?o(NylLXVTfDO zxs5=@|GsYEsNo4M#nT%N!UE(?dnS)t2+{ELYAFp*3=iF=|EQnTp`#vlSXuGVraYo? z+RCzXo6h3qA8{KG?S4nE(lM+;Eb4nT3XV;7gcAxUi5m)`k5tv}cPy()8ZR3TLW3I- zAS^}cq-IJvL7a4RgR!yk@~RT%$lA7{L5ES*hyx)M4(yxI$Ub(4f)K|^v1>zvwQY!_ zIrWw8q9GS^!Dp~}+?mbnB6jDF8mVlbQ!jFKDY;w=7;XO{9bq7>LXGK24WA`;rL)_Z z)&j}pbV(;6gY;VMhbxgvn`X;6x}VUEE-7 z%)7j-%t8S=ZL3yc)HbXDAqJZvBTPoiW_A-+a8m3_Z?v{DN7Tnr#O_VUMT0UBt$;p` zDh6JbGHN8JJ*JN%y2%msb97@_S>9!%Egwk;?PEkU9ntz&3uR}%Fj5d$JHQbQb3}a{ zSzFT^#n=VInPpcAS}CNxj?_ zVscANk5Cfz(51EI1pz};AWWb|kgbYNb4wCEGUn3+eMUMV?1-{=I4TlmLJMot@rd07 zZuo2hk1ccu{YmGkcYdWAVdk{Z4Nm?^cTD&}jGm+Q1SYIXMwmG*oO*83&#>l%nbR`G zhh=lZ%xIb7kU3#;TBbfECrnC9P=-XpL|TG2BoZdj61*XiFbW8?1Z_wp%#;>${SUIy V$8qr;L*)Pf002ovPDHLkV1hYLS~36t literal 0 HcmV?d00001 diff --git a/css/images/layers.png b/css/images/layers.png new file mode 100644 index 0000000000000000000000000000000000000000..1a72e5784b2b456eac5d7670738db80697af3377 GIT binary patch literal 696 zcmV;p0!RIcP)*@&l2<6p=!C&s@#ZL+%BQvF&b?w6S%wp=I>1QHj7AP5C)IWy#b znXXB;g;j=$a-tW89K%FbDceHVq&unY*Wx3L#=EGWH=rjqnp|4c_Ulec!ql3#G-5ZF zVlbBA@XP=)C8U&+Lrc)S4O5%1$&{(;7R^K(CSnvSr$v;+B$8q&7Bf|h$#PARo1^%M zf1H^nG-EiXVXr07OH(*8R)xa|FD;lXUlg_-%)~ZGsL2cX0NXaAzN2q%jqLRR6ruVk8`Jb7n#{`T;o@`F= z#3YcynIR^s83UNF3D!f5m#Mg)NJ24&Qfrqb&_z=yF;=B)#9Iq7u-@^O!(mW{D;qvr zPc)gVb%aowtS8m@ElL4A9G>w#ffQ~q{i&_i)*6f^)Sz|C?C>zb4Uo?H<-&Hz@a?J; z$ml@zGygWofb9$ZBj6aLjpLhsT2AzjOu=-*u_gSCUYnU^5s62$4H-fe}gSR(=wKRaTHh!@*b)YV6mo|a4Fn6Rgc&Rpk zvn_X|3VY?v=>nJ{slE^V1GaGWk}m@aIWGIpghbfPh8m@aIWEo_%AZI>==moIFVE^L=C zZJ91?mo03UEp3-BY?wBGur6$uD{Yr9Y?m%SHF8Fk1pc(Nva%QJ+{FLkalfypz3&M|||Fn`7|g3c~4(nXHKFmRnwn$J#_$xE8i z|Ns9!kC;(oC1qQk>LMp3_a2(odYyMT@>voX=UI)k>1cJdn;gjmJ-|6v4nb1Oryh)eQMwHP(i@!36%vGJyFK(JTj?Vb{{C=jx&)@1l zlFmnw%0`&bqruifkkHKC=vbiAM3&E`#Mv>2%tw;VK8?_|&E89cs{a1}$J*!f_xd-C z&F%B|oxRgPlh0F!txkxrQjNA`m9~?&&|jw4W0<`_iNHsX$VQXVK!B}Xkh4>av|f_8 zLY2?t?ejE=%(TnfV5iqOjm?d;&qI~ZGl|SzU77a)002XDQchC<95+*MjE@82?VLm= z3xf6%Vd@99z|q|-ua5l3kJxvZwan-8K1cPiwQAtlcNX~ZqLeoMB+a;7)WA|O#HOB% zg6SX;754xD1{Fy}K~#8Ntklac&zTpadXZ& zC*_=T&g7hfbI$R?v%9?sknIb97gJOJ=`-8YyS3ndqN+Jm+x33!p&Hc@@L$w))s2@N ztv~i}Emc?DykgwFWwma($8+~b>l?tqj$dh13R^nMZnva9 zn0Vflzv2Dvp`oVQw{Guby~i`JGbyBGTEC{y>yzCkg>K&CIeQ$u;lyQ+M{O~gEJ^)Z zrF3p)^>|uT;57}WY&IRwyOQ=dq%Az}_t=_hKowP!Z79q0;@Zu(SWEJJcHY+5T6I({ zw)wj*SNi4wrd+POUfZe4gF77vW?j zoFS}|r2n&$U9Y!S4VEOyN}OpZZi|?cr1VcE_tHsDQgp-ga(SwkBrkCm{|*-yb=}ZW zvcYvLvfA90TPn|!-TuYJV<6`}+RJeRgP3EA=qQcF9k0*#*{f&I_pjam%I6Dd#YE|G zqB!R}tW-K!wV1w+4JcFA_s6~=@9F&j8`u$-ifLN3vK;`lvaA-`jRn_}(8|)!3?-}I zvFi{H;@A$gEZYh?%|Qr_y#*UkOPjwiRCsJQ>mb6h5yGIk6C5_XA=8T?IBfm_?+P0; zhhUs)-(0R*H<&Kku(1>#cGtOpk&Z&kQcw&SJv-4VY<+;=8hYnoX zfNJMCa9)^5Z0;2dCUk;x-%#yS!I~Jr3pNuI!g_tHz!$hKwt1GL~sFvx)3u4TA zv>CLGdQtoZ7Du7ctJRfTqY;FPxs1G{ZJ?73D5J@OO{6BHcPbk{_mjg&p2QFeke%QI zlAJ-kvjuwy1<5D-6>su68A+i998aSZNnQX)+Q}6(GK-C%8G-!1bOJBONU{gT%IOOE z;Yk24YC@^lFW77>r6x7eS1Omc;8=GUp#&zLQ&L{ zv8$hGC`wp~$9pR>f%-_Ps3>YhzP(+vC(E*zr1CVO8ChN^MI-VGMX7+|(r!SGZ9gd5 zzO9sQd>sm|f1|X&oh=8lOzd6+ITvo zCXInR?>RZ#>Hb*PO=7dI!dZ(wY4O}ZGv zdfQFio7+0~PN*RFCZGM6@9-o~y*@?;k00NvOsw54t1^tt{*ATMs^2j}4Wp=4t3RH* z_+8b`F-{E=0sOgM<;VHTo!Ij3u zmmI`2?K7g(GOcGA)@h?$SW&pwHdtj1n57PLI8&6RHhx4R%Q7b z^JEqR)@06V!pbS*@D_ZyRMo_LlT}r{#sXOx4kM-V<_V{!5SSuM^SIVCA37|nY7LWQ zZA#B1h4l`6asz=Lvax_#GMRX|NF>=$=p{Qn0i@ExX1jGhy@B8a*_uR+ODEbVi8ObL zezG?azy>E~S~dl43&8<$(2H}P&*tuBdESUP83KQ?8B z?K(!uS>H1wlWQz;qOfB`T#TZ=EoSp~vZ5XtCvwm1h*Ex6mzTsn_y@_=xREIslV-%- zpdWkEzMjeNOGWrSM32gpBt27*O29NdhGzuDgYxcf`Jjjqw@B;Vmdb@fxdhCRi`Kg> zmUTr$=&@#i!%F4Q6mb&4QKfR^95KJ!<6~fqx-f^66AV!|ywG{6D^Vay-3b99>XOe# e-I|>x8~*?ZhF3snGbtJX0000cOl4 literal 0 HcmV?d00001 diff --git a/css/images/marker-icon.png b/css/images/marker-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..950edf24677ded147df13b26f91baa2b0fa70513 GIT binary patch literal 1466 zcmV;r1x5OaP)P001cn1^@s6z>|W`000GnNklGNuHDcIX17Zdjl&3`L?0sTjIws<{((Dh&g-s0<@jYQyl?D*X^?%13;ml^gy> ziMrY_^1WI=(g@LMizu=zCoA>C`6|QEq1eV92k*7m>G65*&@&6)aC&e}G zI)pf-Za|N`DT&Cn1J|o`19mumxW~hiKiKyc-P`S@q)rdTo84@QI@;0yXrG%9uhI>A zG5QHb6s4=<6xy{1 z@NMxEkryp{LS44%z$3lP^cX!9+2-;CTt3wM4(k*#C{aiIiLuB>jJj;KPhPzIC00bL zU3a#;aJld94lCW=`4&aAy8M7PY=HQ>O%$YEP4c4UY#CRxfgbE~(|uiI=YS8q;O9y6 zmIkXzR`}p7ti|PrM3a}WMnR=3NVnWdAAR>b9X@)DKL6=YsvmH%?I24wdq?Gh54_;# z$?_LvgjEdspdQlft#4CQ z`2Zyvy?*)N1Ftw|{_hakhG9WjS?Az@I@+IZ8JbWewR!XUK4&6346+d#~gsE0SY(LX8&JfY>Aj)RxGy96nwhs2rv zzW6pTnMpFkDSkT*a*6Dx|u@ds6ISVn0@^RmIsKZ5Y;bazbc;tTSq(kg(=481ODrPyNB6n z-$+U}(w$m6U6H$w17Bw+wDaFIe~GvNMYvnw31MpY0eQKT9l>SU``8k7w4)z!GZKMI z#_cEKq7k~i%nlK@6c-K?+R;B#5$?T#YpKD`t_4bAs^#E+@5QW$@OX3*`;(#{U^d-vY)&xEE>n5lYl&T?Amke9$Lam@{1K@O ze*LXqlKQHiv=gx+V^Cbb2?z@ISBQ*3amF;9UJ3SBg(N|710TLamQmYZ&Qjn2LuO<* zCZlB4n%@pc&7NNnY1}x+NWpHlq`OJEo|`aYN9<`RBUB+79g;>dgb6YlfN#kGL?lO_ z!6~M^7sOnbsUkKk<@Ysie&`G>ruxH&Mgy&8;i=A zB9OO!xR{AyODw>DS-q5YM{0ExFEAzt zm>RdS+ssW(-8|?xr0(?$vBVB*%(xDLtq3Hf0I5yFm<_g=W2`QWAax{1rWVH=I!VrP zs(rTFX@W#t$hXNvbgX`gK&^w_YD;CQ!B@e0QbLIWaKAXQe2-kkloo;{iF#6}z!4=W zi$giRj1{ zt;2w`VSCF#WE&*ev7jpsC=6175@(~nTE2;7M-L((0bH@yG}-TB$R~WXd?tA$s3|%y zA`9$sA(>F%J3ioz<-LJl*^o1|w84l>HBR`>3l9c8$5Xr@xCiIQ7{x$fMCzOk_-M=% z+{a_Q#;42`#KfUte@$NT77uaTz?b-fBe)1s5XE$yA79fm?KqM^VgLXD07*qoM6N<$ Ef<_J(9smFU literal 0 HcmV?d00001 diff --git a/css/images/measure-control.png b/css/images/measure-control.png new file mode 100644 index 0000000000000000000000000000000000000000..b88e8e4a43272fcda9adb794562668ca14573d3f GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2?f#ZI0f96(URk z2Vq7hjoB4ILCF%=h?3y^w370~qEv?R@^Zb*yzJuS#DY}4{G#;P?`))iimrOPIEH9U zoO{X8%b8K2OM>l5=h6;iNDnW7i{$?+T(1tnjKhC^GqyZ(7}%TeFkiOBb|xrrDj(-8SjgnLmHl i{@b~1-RJe@znFT3-2@lxIpGWRAcLo?pUXO@geCwYlZFof literal 0 HcmV?d00001 diff --git a/css/images/rulers.png b/css/images/rulers.png new file mode 100644 index 0000000000000000000000000000000000000000..b88e8e4a43272fcda9adb794562668ca14573d3f GIT binary patch literal 344 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uAB#T}@sR2?f#ZI0f96(URk z2Vq7hjoB4ILCF%=h?3y^w370~qEv?R@^Zb*yzJuS#DY}4{G#;P?`))iimrOPIEH9U zoO{X8%b8K2OM>l5=h6;iNDnW7i{$?+T(1tnjKhC^GqyZ(7}%TeFkiOBb|xrrDj(-8SjgnLmHl i{@b~1-RJe@znFT3-2@lxIpGWRAcLo?pUXO@geCwYlZFof literal 0 HcmV?d00001 diff --git a/css/images/rulers_@2X.png b/css/images/rulers_@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..7247a0c9d16b7b6bbf8a272614eb56089823dc46 GIT binary patch literal 277 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdzmSQK*5Dp-y;YjHK@;M7UB8wRq z_>O=u<5X=vX`tYCPZ!6Kh}O5$9k~uU@VL%j+}+P2sx($4>T3%sbg! literal 0 HcmV?d00001 diff --git a/css/images/start.png b/css/images/start.png new file mode 100644 index 0000000000000000000000000000000000000000..b8ca942b5d4c953be6afbed03e750a8d53909588 GIT binary patch literal 491 zcmVskiSn80UX8O_siwlUc3qk zn=#_z(1`>QWOJ06ffVDJi_{>Mq<@LS5i#f>dL8(&GqRBK!!}GEoE&s>FeL5S#@_on z)Jq!&KjX`LFYo&m{AH!qD0m%r6F`~95&$UBHkG>eJ8$;(9`yh~0H7SU?l?|*Ou|*s z$V4uOHMStY7J;NuTF55CDttx@p0P7B1B#2=K8UN8N^7?n!X>w)`(-kr)7=hW-C znHoS`m6q9^Ok!?joE#o@7Xq12M%KZqFr)f@%d23r7dmWd?$DpLFOZhmKE}k7MRAJoN#oLL`+&I~AT&}-g{4QBj5S--Ay|FQTotB2GwILGU h%opEA(Y-zZ`~laIr}6x~ZR7v|002ovPDHLkV1jU2-Bthq literal 0 HcmV?d00001 diff --git a/css/images/start_@2X.png b/css/images/start_@2X.png new file mode 100644 index 0000000000000000000000000000000000000000..01da494c809064869254a0eb0ec9789b19563964 GIT binary patch literal 1003 zcmV%o}=4 zVA2%b7#rFBTRje|wb<43U^^C{Bltl{YE*=~yUBh`$~rZ1rRC|W0-4@ICIp5hZKx8I zWV#z*8u$aij3%Jn-8&?us#0&v)jxJQeZ8(gci+ruu&)3d-dYIX#O3JX)vJ5vYo2sq zZnMe@Cml{oS`QFH7|iEdzy6;&-pmIS(b9&86al(ZpucoO2&-tpmGuhv4oh@&T_w|FVKXGSybe+Ox2el-0|08%_8 zX@kRCkD>!B$+OwnCI~efVi9AP+Fu6gAov2(MuQ;$J9fO#Tq^NIl0pb)^SRbDE0Z&Q zGXq9AP(ocdM$>;a66)?LTtNEV-Q7KER+6YwlH9!%m!pgIQ}t2gVeUvz@xw*}wk})% z5=n|^Rm4dWGi}t5#qP4WqD%7JdMe-+1Vy@ev*`Oc%9&<0R%8{rRAx)`T@*n_EL1OtN+*c z8WFCnyc{R@LE8Wf>%D&Y{TG$@W$5lL4q}|IeE9;-ceXBEsM^0~)ulKL2KP^wCR+%f zUCXt8yBJerWX>G65Jr$TR+kcBs$%~|hlZ^lXs>ol1mN)6u-^P=%dO>nH7~48U-2D- zA$LEt+Rz6Q+;1tx7e9R8_I%}L!y$4wJG(88z0*DHm$U=C>Jz;Jf8@a?&Fp4=H2tg| Z$G;w}gww(;|K0!q002ovPDHLkV1hTc*t`G$ literal 0 HcmV?d00001 diff --git a/css/images/throbber.gif b/css/images/throbber.gif new file mode 100644 index 0000000000000000000000000000000000000000..c0c52a06c09d98bb75d1c3f9945f3101ab094f98 GIT binary patch literal 4831 zcmeH}`BxHX+s6?>5EM~RQAxoCae>^oGFcTB6qI&NQOu=uT&S$aDM7&9a4k(!ky4vB z+qF#v*R0%{acr41D=V{X8*7^BvG<(!{b^2r!F&IFopYb_IiK(Ky@G-ReS8HN00!_U z0AOZjW@Tk%XJgww2>yIBl{>v}FoH=vm+_`g?E?w&E?7VsNW_NdYUtizQ z(9p=p$k^D}ufP5}H8u6{;lsy|A3uHi^wq0Z3kwTNOG}?Vefsj{%eQaez+f;81~V`) zz+f;W5{XWyGnvfr@bJjU$jzHKM@L7eq@-kKX71j-d+*-8IXO8Ji6lQizqYnksZ^>| zs6vonoG3k(bl4h{|r3yX+|;Pd%0F)^{Rv5AR^X=!PD_Ut)u;6Pbf zS$TQ+v17;1pFe;7`gOHh-QV9oI5>Fw_U-ZU@#*R5M~@!O&d$Dg@#4*!Hy=NK{Ohm3 zHf`FJk&#hTQ*-3Vk;cZxmX?-|j*gz59*ssbJUo2&?%n(M@Bi_~AJ3jWo1dS5_wLMn^}VJbB{edDE;=g*&;o10&_Z~^fD@81aEzrn+p z{75>L%XA~VXlt#^;Qt|U1i}Pd++JL0rXVXhH91p&3rk3ePfFM=z!6tmAn*K1AWTl% z{u4PZLF53ye+B_yfNucj?;m{66+q`3Ws09ZH)OTJ9f}_3M(S{&3 z(b3kocDAr%kT_0+AR^P&5Cpc2bPU=ZLb60EL!1d)8Em#{CwYgOOhD)j!mV~X;O^k? zT?qIj{7j64)m?l9+v#RcZ?9ZxZQLH>gr5&4pmlZekpwd{+`fEsIMm3NWV0OAHdxiG zt)p*Sz|MXv;1ohk|0!SM&PWv~Y>hszd6o-?*lgi9jrKm&p|g)mlhUc1WUw86-0qJF zG7!{+S)q#8Qa4yQIFZwly%L&i4c_PL*SNMmFr1^dqxPhQApeCIZMQ}#j9amC*05FZS0#GE9WNq7)RaRP*ml?2K;uIZSK^DelR7)~r zqSDA&QPEE1)Qy{!E#y_3DD6>ESt0?ztUB{ld)(%f6Af74w%!b4o=CVRxpe0iiYO7A zB><+hZ{O%sC1S=zQ#hjJbSWn>D|zec4V0sjpM*Z!c2qOhyKI{xD$gG;ac6SU>zh52 z%IJZ55CV;=Q_yDx47yDf0}(-f=mP-57aSYxK}!qY98AWBV+7_LU->@pxHa0W|0_k6 z1U};V(}He@wy;FuEqV;ivQ3d4@k~W@;Wo-SHa-b{SA2q7b3i^%YZKwXlyuug23>|R z58Kp+3_mId&2&b}Gyf>s2TdZx<`&KkR|Q`ixz>3eE-ysg^!R|u?72WTHm{g)ooTYE zHgt3bLGCp59U#6jM0Y-?40u4mlK8J45PxB`-tglA8IG#+4YS&onEpg;`61T(%|!mi zMoNaMfwZOdAmv@s-x`zTf;^o=@I?*MC*qv zTfVd0IYxV2&sg^iy2A1?8omlU-7zsLQ&?rLuxu#^vN6r_3K2;PsH}4G0Lxg{F=Vivsn0x6-liV`MsZ1I|xflnNYx&&p@;SQPN*^SIKlh-$iW^On5&e>O zjj7%=QHGci9|2eQ(?7m>F#x6IySl~f$(tlZpp-qTE&GkZpdW|{#`=I!jw%~PnQgG1 zg`=&HY!D*O+E1*rIa{D|K!L;Bo1n5{-y*cD^U_mskpg&V8J8Jh6BMif$OjB9HbuPn*M|~cIc8KWUQ*NurKdylyEyLae+$BACC|dt40LYI`BjI zZPBX3jON}Wg(;Q^JkdsceQ+YYm!~3}4)-fCRL}V)4x`H)2^oh+v;-_f)D_CCQ9DC8 zTrF4}I%&2;t#Jt-Pabg>zzF`Rh!mHhvn)d8sOs>QAPNA&hTWjLCl7@hXE+$ww#>l+ zL1^o7fwEs!>=3&6PKDC#@AGAx&GldE+83*9x0-kOfp&c8UG%T06WsBQ*YC1c%T?s7 zs@8q-PynSn4L`ONm;=#QK@m&GzhkH5c+(eNQz03G7i`aBFE^8Sv>K zelTCHTVq^yC28W>j5Y;z(C09Ycic`dC#){l!6jt9k&%(}*~xqVV-t?wW=m~oGUm16 zw<4KlUa9tODokZqxTDkB(_E$ept)z3ljYL6Sg|Q2-Yj54R_2_c3!Jj1+wt&QmOTGw zqpEn?E-DIH2KqHgqHl2nbP$aLh(T08;uKNKwjyM!5w?w(oZd&#hzZlq%w!s3l^&+e z1KFhW)DmRSRYxt$1iESgoytIOXWc`dOP$#DQ5pNes~`Y3O?|;^JN(N$XBX4%&3ZJL z4d~_TV8Dx)X?E4!!s-3m7km2m|2XvZ-#x`95w!_)JyV1VD3Ma=m=6@ujFuW*NN!8- zR`ts8{umq#7$JtSOt~((F13bn^3YHd^Xa65a2+Zpvf_%0*Hm;+`+hFcmdn*a%8&YF zh+hm;Dnj;0P0i01<|9HwV6>DfDc;^#RPchE4l6{gLOSkzk1Mex!q;EOXy+=9dPV6j z<|J1X3Do%D3p}<`#Xt%yCtoi~VY>aLREfg*^Z30U@h)>ete>!c9M}vHpBPmX*>jf( zppIkx2irldl)b=7B%xTlLFB?vLP|+YaKEAEPA`rodj|0^Z}ZH4Pj{MkNLuwFES?{gN6Lg|-c3g=fgNs$pXn=(bS zQ4^^nXrKdEVMs9IbRA~&>-U+UzOjoUGFuAW60MEC5Jy3kY@jb{(N_UZ!EuqF&17%7P@Qz z#XSXEualL`8$%(CVgjWrrvu%AEOT;<&P4(Um&<9C3t!6z6Ct&Q5+&5R%BEXI^X@{g zdzVFF|CWa)X+iTo^_Nyt&a$U1z_*MKOMB0VvYx;r6uexXobvhM+j6sjuMnfK`%e}0 zje3jg6&6={KStUb_FYw0(2$iM5Kk5^>-15OI9o5Ro;W4kkMj>smA9gyHP$wa-#k}J zDM3J zEyYA{J&(PogHgTSb-N21F$qD)SNC<-Ye0b<(a~K9pQh@h#p~1w#*bs){9RAm<)NWo znS54czWkyRFXm21<;(-oRmF106&N5*f4&UZXGk1p9zisjNQxX>!f?{mb)5whf}#FA zZT*?ILY-zj(dif~V@Y=?!jyX_7Yfr17n5@IjQx^b9E{v+utrfzK%jA`o4XL;>e}4w z4ih;pT+l&pG;KgUV=j*>{?lT`aW)_SzE-K#7D)z90<} zT4|E)<1x9tytXo9Lzhccn|ugj0Q=c5g*%gYU%D#gs|(b!S)mi@8zRW<7Bqk2?gjXs z;SL+%FU&lrK}_GaDq?`fvvlhm{2-6U{m{?*w^ROq)82=ruXNK|A0(P6Lq=1g6h)c=lLK-bzgI|rtiHL6t8`;Pw8bhB%c!@um61_0js-e&c`r@7nL0PeZ zEB}t`7b(ZyR8DCZygOgg!i7zaIM8-Iu5WFaV$bXe*_5@pbG_%T+JjAI859AIG3tg#ok Tr1ob$&=U-vu6{1-oD!MKmAgsdtwaR{ z8xcgXi~0f)LF<6Ux=k*vrD$m-q_#0uNg>);so)C;W=WYwEVQujf}ln)ml=yBve}F5 zCSsM-of+nv`G;Xw!9(kbtMM>}@=zQDNVR8K09;l<`q4r3*{zimr`5E303nE)$z>OAt$8C=n1+%YW>i!}CiDACFAi`#exg0jjkYzIdKlVP zO6@{$p36qp+?pFH^9%~B5bWGdyl1SrvC@+$BWZquFyQs1&ctOBLIptmFR=ou{TL%{ zijg*@Q<%Np^D4U4|AY19by-iFZ+^X9eV!eO27`Ft6L+f~xCeI1^Nzv%Aw+fG-Y+(xeNdsiQ;TftdS_rHxT^ViZxfEgr#sw3cAvyWTefY z6E`t*Yy$%ku5Ny5;Sn&$h$zstFf%Kn3+}INwPN4M=!UE@YX5ft0000 svg, +.leaflet-pane > canvas, +.leaflet-zoom-box, +.leaflet-image-layer, +.leaflet-layer { + position: absolute; + left: 0; + top: 0; + } +.leaflet-container { + overflow: hidden; + } +.leaflet-tile, +.leaflet-marker-icon, +.leaflet-marker-shadow { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + -webkit-user-drag: none; + } +/* Prevents IE11 from highlighting tiles in blue */ +.leaflet-tile::selection { + background: transparent; +} +/* Safari renders non-retina tile on retina better with this, but Chrome is worse */ +.leaflet-safari .leaflet-tile { + image-rendering: -webkit-optimize-contrast; + } +/* hack that prevents hw layers "stretching" when loading new tiles */ +.leaflet-safari .leaflet-tile-container { + width: 1600px; + height: 1600px; + -webkit-transform-origin: 0 0; + } +.leaflet-marker-icon, +.leaflet-marker-shadow { + display: block; + } +/* .leaflet-container svg: reset svg max-width decleration shipped in Joomla! (joomla.org) 3.x */ +/* .leaflet-container img: map is broken in FF if you have max-width: 100% on tiles */ +.leaflet-container .leaflet-overlay-pane svg, +.leaflet-container .leaflet-marker-pane img, +.leaflet-container .leaflet-shadow-pane img, +.leaflet-container .leaflet-tile-pane img, +.leaflet-container img.leaflet-image-layer, +.leaflet-container .leaflet-tile { + max-width: none !important; + max-height: none !important; + } + +.leaflet-container.leaflet-touch-zoom { + -ms-touch-action: pan-x pan-y; + touch-action: pan-x pan-y; + } +.leaflet-container.leaflet-touch-drag { + -ms-touch-action: pinch-zoom; + /* Fallback for FF which doesn't support pinch-zoom */ + touch-action: none; + touch-action: pinch-zoom; +} +.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom { + -ms-touch-action: none; + touch-action: none; +} +.leaflet-container { + -webkit-tap-highlight-color: transparent; +} +.leaflet-container a { + -webkit-tap-highlight-color: rgba(51, 181, 229, 0.4); +} +.leaflet-tile { + filter: inherit; + visibility: hidden; + } +.leaflet-tile-loaded { + visibility: inherit; + } +.leaflet-zoom-box { + width: 0; + height: 0; + -moz-box-sizing: border-box; + box-sizing: border-box; + z-index: 800; + } +/* workaround for https://bugzilla.mozilla.org/show_bug.cgi?id=888319 */ +.leaflet-overlay-pane svg { + -moz-user-select: none; + } + +.leaflet-pane { z-index: 400; } + +.leaflet-tile-pane { z-index: 200; } +.leaflet-overlay-pane { z-index: 400; } +.leaflet-shadow-pane { z-index: 500; } +.leaflet-marker-pane { z-index: 600; } +.leaflet-tooltip-pane { z-index: 650; } +.leaflet-popup-pane { z-index: 700; } + +.leaflet-map-pane canvas { z-index: 100; } +.leaflet-map-pane svg { z-index: 200; } + +.leaflet-vml-shape { + width: 1px; + height: 1px; + } +.lvml { + behavior: url(#default#VML); + display: inline-block; + position: absolute; + } + + +/* control positioning */ + +.leaflet-control { + position: relative; + z-index: 800; + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } +.leaflet-top, +.leaflet-bottom { + position: absolute; + z-index: 1000; + pointer-events: none; + } +.leaflet-top { + top: 0; + } +.leaflet-right { + right: 0; + } +.leaflet-bottom { + bottom: 0; + } +.leaflet-left { + left: 0; + } +.leaflet-control { + float: left; + clear: both; + } +.leaflet-right .leaflet-control { + float: right; + } +.leaflet-top .leaflet-control { + margin-top: 10px; + } +.leaflet-bottom .leaflet-control { + margin-bottom: 10px; + } +.leaflet-left .leaflet-control { + margin-left: 10px; + } +.leaflet-right .leaflet-control { + margin-right: 10px; + } + + +/* zoom and fade animations */ + +.leaflet-fade-anim .leaflet-tile { + will-change: opacity; + } +.leaflet-fade-anim .leaflet-popup { + opacity: 0; + -webkit-transition: opacity 0.2s linear; + -moz-transition: opacity 0.2s linear; + transition: opacity 0.2s linear; + } +.leaflet-fade-anim .leaflet-map-pane .leaflet-popup { + opacity: 1; + } +.leaflet-zoom-animated { + -webkit-transform-origin: 0 0; + -ms-transform-origin: 0 0; + transform-origin: 0 0; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + will-change: transform; + } +.leaflet-zoom-anim .leaflet-zoom-animated { + -webkit-transition: -webkit-transform 0.25s cubic-bezier(0,0,0.25,1); + -moz-transition: -moz-transform 0.25s cubic-bezier(0,0,0.25,1); + transition: transform 0.25s cubic-bezier(0,0,0.25,1); + } +.leaflet-zoom-anim .leaflet-tile, +.leaflet-pan-anim .leaflet-tile { + -webkit-transition: none; + -moz-transition: none; + transition: none; + } + +.leaflet-zoom-anim .leaflet-zoom-hide { + visibility: hidden; + } + + +/* cursors */ + +.leaflet-interactive { + cursor: pointer; + } +.leaflet-grab { + cursor: -webkit-grab; + cursor: -moz-grab; + cursor: grab; + } +.leaflet-crosshair, +.leaflet-crosshair .leaflet-interactive { + cursor: crosshair; + } +.leaflet-popup-pane, +.leaflet-control { + cursor: auto; + } +.leaflet-dragging .leaflet-grab, +.leaflet-dragging .leaflet-grab .leaflet-interactive, +.leaflet-dragging .leaflet-marker-draggable { + cursor: move; + cursor: -webkit-grabbing; + cursor: -moz-grabbing; + cursor: grabbing; + } + +/* marker & overlays interactivity */ +.leaflet-marker-icon, +.leaflet-marker-shadow, +.leaflet-image-layer, +.leaflet-pane > svg path, +.leaflet-tile-container { + pointer-events: none; + } + +.leaflet-marker-icon.leaflet-interactive, +.leaflet-image-layer.leaflet-interactive, +.leaflet-pane > svg path.leaflet-interactive, +svg.leaflet-image-layer.leaflet-interactive path { + pointer-events: visiblePainted; /* IE 9-10 doesn't have auto */ + pointer-events: auto; + } + +/* visual tweaks */ + +.leaflet-container { + background: #ddd; + outline: 0; + } +.leaflet-container a { + color: #0078A8; + } +.leaflet-container a.leaflet-active { + outline: 2px solid orange; + } +.leaflet-zoom-box { + border: 2px dotted #38f; + background: rgba(255,255,255,0.5); + } + + +/* general typography */ +.leaflet-container { + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + } + + +/* general toolbar styles */ + +.leaflet-bar { + box-shadow: 0 1px 5px rgba(0,0,0,0.65); + border-radius: 4px; + } +.leaflet-bar a, +.leaflet-bar a:hover { + background-color: #fff; + border-bottom: 1px solid #ccc; + width: 26px; + height: 26px; + line-height: 26px; + display: block; + text-align: center; + text-decoration: none; + color: black; + } +.leaflet-bar a, +.leaflet-control-layers-toggle { + background-position: 50% 50%; + background-repeat: no-repeat; + display: block; + } +.leaflet-bar a:hover { + background-color: #f4f4f4; + } +.leaflet-bar a:first-child { + border-top-left-radius: 4px; + border-top-right-radius: 4px; + } +.leaflet-bar a:last-child { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; + border-bottom: none; + } +.leaflet-bar a.leaflet-disabled { + cursor: default; + background-color: #f4f4f4; + color: #bbb; + } + +.leaflet-touch .leaflet-bar a { + width: 30px; + height: 30px; + line-height: 30px; + } +.leaflet-touch .leaflet-bar a:first-child { + border-top-left-radius: 2px; + border-top-right-radius: 2px; + } +.leaflet-touch .leaflet-bar a:last-child { + border-bottom-left-radius: 2px; + border-bottom-right-radius: 2px; + } + +/* zoom control */ + +.leaflet-control-zoom-in, +.leaflet-control-zoom-out { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + } + +.leaflet-touch .leaflet-control-zoom-in, .leaflet-touch .leaflet-control-zoom-out { + font-size: 22px; + } + + +/* layers control */ + +.leaflet-control-layers { + box-shadow: 0 1px 5px rgba(0,0,0,0.4); + background: #fff; + border-radius: 5px; + } +.leaflet-control-layers-toggle { + background-image: url(images/layers.png); + width: 36px; + height: 36px; + } +.leaflet-retina .leaflet-control-layers-toggle { + background-image: url(images/layers-2x.png); + background-size: 26px 26px; + } +.leaflet-touch .leaflet-control-layers-toggle { + width: 44px; + height: 44px; + } +.leaflet-control-layers .leaflet-control-layers-list, +.leaflet-control-layers-expanded .leaflet-control-layers-toggle { + display: none; + } +.leaflet-control-layers-expanded .leaflet-control-layers-list { + display: block; + position: relative; + } +.leaflet-control-layers-expanded { + padding: 6px 10px 6px 6px; + color: #333; + background: #fff; + } +.leaflet-control-layers-scrollbar { + overflow-y: scroll; + overflow-x: hidden; + padding-right: 5px; + } +.leaflet-control-layers-selector { + margin-top: 2px; + position: relative; + top: 1px; + } +.leaflet-control-layers label { + display: block; + } +.leaflet-control-layers-separator { + height: 0; + border-top: 1px solid #ddd; + margin: 5px -10px 5px -6px; + } + +/* Default icon URLs */ +.leaflet-default-icon-path { + background-image: url(images/marker-icon.png); + } + + +/* attribution and scale controls */ + +.leaflet-container .leaflet-control-attribution { + background: #fff; + background: rgba(255, 255, 255, 0.7); + margin: 0; + } +.leaflet-control-attribution, +.leaflet-control-scale-line { + padding: 0 5px; + color: #333; + } +.leaflet-control-attribution a { + text-decoration: none; + } +.leaflet-control-attribution a:hover { + text-decoration: underline; + } +.leaflet-container .leaflet-control-attribution, +.leaflet-container .leaflet-control-scale { + font-size: 11px; + } +.leaflet-left .leaflet-control-scale { + margin-left: 5px; + } +.leaflet-bottom .leaflet-control-scale { + margin-bottom: 5px; + } +.leaflet-control-scale-line { + border: 2px solid #777; + border-top: none; + line-height: 1.1; + padding: 2px 5px 1px; + font-size: 11px; + white-space: nowrap; + overflow: hidden; + -moz-box-sizing: border-box; + box-sizing: border-box; + + background: #fff; + background: rgba(255, 255, 255, 0.5); + } +.leaflet-control-scale-line:not(:first-child) { + border-top: 2px solid #777; + border-bottom: none; + margin-top: -2px; + } +.leaflet-control-scale-line:not(:first-child):not(:last-child) { + border-bottom: 2px solid #777; + } + +.leaflet-touch .leaflet-control-attribution, +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + box-shadow: none; + } +.leaflet-touch .leaflet-control-layers, +.leaflet-touch .leaflet-bar { + border: 2px solid rgba(0,0,0,0.2); + background-clip: padding-box; + } + + +/* popup */ + +.leaflet-popup { + position: absolute; + text-align: center; + margin-bottom: 20px; + } +.leaflet-popup-content-wrapper { + padding: 1px; + text-align: left; + border-radius: 12px; + } +.leaflet-popup-content { + margin: 13px 19px; + line-height: 1.4; + } +.leaflet-popup-content p { + margin: 18px 0; + } +.leaflet-popup-tip-container { + width: 40px; + height: 20px; + position: absolute; + left: 50%; + margin-left: -20px; + overflow: hidden; + pointer-events: none; + } +.leaflet-popup-tip { + width: 17px; + height: 17px; + padding: 1px; + + margin: -10px auto 0; + + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -ms-transform: rotate(45deg); + transform: rotate(45deg); + } +.leaflet-popup-content-wrapper, +.leaflet-popup-tip { + background: white; + color: #333; + box-shadow: 0 3px 14px rgba(0,0,0,0.4); + } +.leaflet-container a.leaflet-popup-close-button { + position: absolute; + top: 0; + right: 0; + padding: 4px 4px 0 0; + border: none; + text-align: center; + width: 18px; + height: 14px; + font: 16px/14px Tahoma, Verdana, sans-serif; + color: #c3c3c3; + text-decoration: none; + font-weight: bold; + background: transparent; + } +.leaflet-container a.leaflet-popup-close-button:hover { + color: #999; + } +.leaflet-popup-scrolled { + overflow: auto; + border-bottom: 1px solid #ddd; + border-top: 1px solid #ddd; + } + +.leaflet-oldie .leaflet-popup-content-wrapper { + -ms-zoom: 1; + } +.leaflet-oldie .leaflet-popup-tip { + width: 24px; + margin: 0 auto; + + -ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)"; + filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678); + } +.leaflet-oldie .leaflet-popup-tip-container { + margin-top: -1px; + } + +.leaflet-oldie .leaflet-control-zoom, +.leaflet-oldie .leaflet-control-layers, +.leaflet-oldie .leaflet-popup-content-wrapper, +.leaflet-oldie .leaflet-popup-tip { + border: 1px solid #999; + } + + +/* div icon */ + +.leaflet-div-icon { + background: #fff; + border: 1px solid #666; + } + + +/* Tooltip */ +/* Base styles for the element that has a tooltip */ +.leaflet-tooltip { + position: absolute; + padding: 6px; + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + color: #222; + white-space: nowrap; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + pointer-events: none; + box-shadow: 0 1px 3px rgba(0,0,0,0.4); + } +.leaflet-tooltip.leaflet-clickable { + cursor: pointer; + pointer-events: auto; + } +.leaflet-tooltip-top:before, +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + position: absolute; + pointer-events: none; + border: 6px solid transparent; + background: transparent; + content: ""; + } + +/* Directions */ + +.leaflet-tooltip-bottom { + margin-top: 6px; +} +.leaflet-tooltip-top { + margin-top: -6px; +} +.leaflet-tooltip-bottom:before, +.leaflet-tooltip-top:before { + left: 50%; + margin-left: -6px; + } +.leaflet-tooltip-top:before { + bottom: 0; + margin-bottom: -12px; + border-top-color: #fff; + } +.leaflet-tooltip-bottom:before { + top: 0; + margin-top: -12px; + margin-left: -6px; + border-bottom-color: #fff; + } +.leaflet-tooltip-left { + margin-left: -6px; +} +.leaflet-tooltip-right { + margin-left: 6px; +} +.leaflet-tooltip-left:before, +.leaflet-tooltip-right:before { + top: 50%; + margin-top: -6px; + } +.leaflet-tooltip-left:before { + right: 0; + margin-right: -12px; + border-left-color: #fff; + } +.leaflet-tooltip-right:before { + left: 0; + margin-left: -12px; + border-right-color: #fff; + } diff --git a/css/qgis2web.css b/css/qgis2web.css new file mode 100644 index 0000000..6fa738c --- /dev/null +++ b/css/qgis2web.css @@ -0,0 +1,129 @@ + + #map { + background-color: #ffffff + } + th { + text-align: left; + vertical-align: top; + } + .info { + padding: 6px 8px; + font: 14px/16px Arial, Helvetica, sans-serif; + background: white; + background: rgba(255,255,255,0.8); + box-shadow: 0 0 15px rgba(0,0,0,0.2); + border-radius: 5px; + } + .info h2 { + margin: 0 0 5px; + color: #777; + } + .leaflet-container { + background: #fff; + padding-right: 10px; + } + .leaflet-popup-content { + width:auto; + padding-right:10px; + } + .leaflet-tooltip { + background: none; + box-shadow: none; + border: none; + } + .leaflet-tooltip-left:before, .leaflet-tooltip-right:before { + border: 0px; + } + } + .fa, .leaflet-container, a { + color: #000000 !important; + } + .leaflet-control-zoom-in, .leaflet-control-zoom-out, + .leaflet-control-locate a, + .leaflet-touch .leaflet-control-geocoder-icon, + .leaflet-control-search .search-button, + .leaflet-control-measure { + background-color: #f8f8f8 !important; + border-radius: 0px !important; + color: #000000 !important; + } + .abstract { + font: bold 18px 'Lucida Console', Monaco, monospace; + text-indent: 1px; + background-color: #f8f8f8 !important; + width: 30px !important; + color: #000000 !important; + height: 30px !important; + text-align: center !important; + line-height: 30px !important; + } + .abstractUncollapsed { + padding: 6px 8px; + font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif; + background-color:#f8f8f8 !important; + color: #000000 !important; + box-shadow: 0 0 15px rgba(0,0,0,0.2); + border-radius: 5px; + max-width: 40%; + } + .leaflet-touch .leaflet-control-layers, + .leaflet-touch .leaflet-bar, + .leaflet-control-search, + .leaflet-control-measure { + border: 3px solid rgba(255,255,255,.4) !important; + } + .leaflet-control-attribution a { + color: #0078A8 !important; + } + .leaflet-control-scale-line { + border: 2px solid #f8f8f8 !important; + border-top: none !important; + color: black !important; + } + .leaflet-control-search .search-button, + .leaflet-container .leaflet-control-search, + .leaflet-control-measure { + box-shadow: none !important; + } + .leaflet-control-search .search-button { + width: 30px !important; + height: 30px !important; + font-size: 13px !important; + text-align: center !important; + line-height: 30px !important; + } + .leaflet-control-measure .leaflet-control { + width: 30px !important; + height: 30px !important; + } + .leaflet-container .leaflet-control-search{ + background: none !important; + } + .leaflet-control-search .search-input { + margin: 0px 0px 0px 0px !important; + height: 30px !important; + } + .leaflet-control-measure { + background: none!important; + border-radius: 4px !important; + } + .leaflet-control-measure .leaflet-control-measure-interaction { + background-color: #f8f8f8 !important; + } + .leaflet-touch .leaflet-control-measure + .leaflet-control-measure-toggle, + .leaflet-touch .leaflet-control-measure + .leaflet-control-measure-toggle:hover { + width: 30px !important; + height: 30px !important; + border-radius: 0px !important; + background-color: #f8f8f8 !important; + color: #000000 !important; + font-size: 13px; + line-height: 30px; + text-align: center; + text-indent: 0%; + } + .leaflet-control-layers-toggle { + background-color: #f8f8f8 !important; + } \ No newline at end of file diff --git a/data/Cafeswithin500mofaPublicLibrary_6.js b/data/Cafeswithin500mofaPublicLibrary_6.js new file mode 100644 index 0000000..b1a8493 --- /dev/null +++ b/data/Cafeswithin500mofaPublicLibrary_6.js @@ -0,0 +1 @@ +var json_Cafeswithin500mofaPublicLibrary_6 = {"type":"FeatureCollection","name":"Cafeswithin500mofaPublicLibrary_6","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{"1. Name":"Democracy","lattitude":43.25486,"longitude":-79.88626,"Local or n":"local","Parking":"street","offers fre":"yes","bike rack":"yes","person":"Jacob"},"geometry":{"type":"Point","coordinates":[-79.886257,43.254856]}},{"type":"Feature","properties":{"1. Name":"Gong Cha","lattitude":43.25961,"longitude":-79.86816,"Local or n":"no","Parking":"street","offers fre":"no","bike rack":"yes","person":"Clio"},"geometry":{"type":"Point","coordinates":[-79.868158,43.259606]}},{"type":"Feature","properties":{"1. Name":"Mulberry Coffeehouse","lattitude":43.26205,"longitude":-79.86703,"Local or n":"local","Parking":"street","offers fre":"yes","bike rack":"yes","person":"Clio"},"geometry":{"type":"Point","coordinates":[-79.867034,43.262051]}},{"type":"Feature","properties":{"1. Name":"Paisley Coffeehouse & Eatery","lattitude":43.26235,"longitude":-79.90556,"Local or n":"local","Parking":"street","offers fre":"no","bike rack":"yes","person":"Clio"},"geometry":{"type":"Point","coordinates":[-79.905558,43.262354]}},{"type":"Feature","properties":{"1. Name":"Redchurch Cafe + Gallery","lattitude":43.25567,"longitude":-79.86721,"Local or n":"local","Parking":"street","offers fre":"yes","bike rack":"yes","person":"Jacob"},"geometry":{"type":"Point","coordinates":[-79.867205,43.255672]}},{"type":"Feature","properties":{"1. Name":"RELAY Coffee Roasters","lattitude":43.25768,"longitude":-79.86779,"Local or n":"local","Parking":"paid lot","offers fre":"yes","bike rack":"yes","person":"Clio"},"geometry":{"type":"Point","coordinates":[-79.867785,43.257682]}},{"type":"Feature","properties":{"1. Name":"Second Cup Cafe","lattitude":43.26245,"longitude":-79.90509,"Local or n":"no","Parking":"street","offers fre":"yes","bike rack":"no","person":"Clio"},"geometry":{"type":"Point","coordinates":[-79.905086,43.262451]}},{"type":"Feature","properties":{"1. Name":"The Alley","lattitude":43.26168,"longitude":-79.90706,"Local or n":"no","Parking":"free lot","offers fre":"yes","bike rack":"no","person":"Clio"},"geometry":{"type":"Point","coordinates":[-79.907061,43.261677]}}]} \ No newline at end of file diff --git a/data/City_Boundary_1.js b/data/City_Boundary_1.js new file mode 100644 index 0000000..a864b40 --- /dev/null +++ b/data/City_Boundary_1.js @@ -0,0 +1 @@ +var json_City_Boundary_1 = {"type":"FeatureCollection","name":"City_Boundary_1","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{"OBJECTID":1.0,"AREA_IN_HA":114882.0165,"Shape__Are":1148820165.9453101,"Shape__Len":177180.87441},"geometry":{"type":"MultiPolygon","coordinates":[[[[-79.625030049240635,43.219402134847613],[-79.625170825447938,43.2190721199471],[-79.625232647996924,43.218927191437551],[-79.625717752262958,43.217789952509065],[-79.625826448650912,43.217535124914562],[-79.626052224870676,43.217005814026777],[-79.626378981131793,43.216239735025169],[-79.626416062463719,43.216154086605606],[-79.626425518342472,43.216131853482693],[-79.62645288776784,43.216067498621435],[-79.626492609280291,43.215977373283316],[-79.626553562391365,43.215839078917973],[-79.626614513988912,43.215700784498367],[-79.626684410785387,43.215542199356527],[-79.626819066440078,43.21523667951265],[-79.626846869372486,43.21517359759612],[-79.626869460355451,43.215122440008244],[-79.62690866401347,43.215033664383363],[-79.626980263048054,43.214871352666805],[-79.627026370605606,43.214766830708207],[-79.627035699498947,43.214745682858293],[-79.627084397267353,43.214635285856701],[-79.627126662450578,43.214539471992367],[-79.627247044392035,43.214266565066048],[-79.627251498508599,43.214256363197748],[-79.627291709946604,43.214164266924108],[-79.62730577806947,43.214133095290087],[-79.627375342445347,43.213978956656945],[-79.627477419833369,43.213752777916888],[-79.627653420045647,43.213362797500395],[-79.627707664733023,43.213242603129139],[-79.627759061792247,43.21312871559801],[-79.6277989975259,43.213040225758306],[-79.627831644825704,43.212967884643597],[-79.627872343420222,43.212877702059721],[-79.62807681247466,43.212424627799692],[-79.628101756340882,43.212369356051092],[-79.628187627526401,43.212179072628807],[-79.628296813247786,43.211937128450785],[-79.62839967647821,43.211709190622571],[-79.628649330086006,43.211155969505704],[-79.628702670517598,43.21103776729263],[-79.628769993117871,43.2108885803842],[-79.628899280366525,43.21060199225473],[-79.628911036554115,43.210575910899749],[-79.628955319098353,43.210477654109411],[-79.629251582193447,43.209820273094351],[-79.629587042564793,43.209075899220551],[-79.629605821849779,43.209034228530506],[-79.630452831884313,43.207154653146162],[-79.630844087680558,43.206286371813441],[-79.631011232548332,43.20619672445472],[-79.631083772422244,43.2060302277145],[-79.631251015873943,43.205646359469412],[-79.631392622911491,43.205321329138528],[-79.631505267469748,43.205062774358346],[-79.631579522551235,43.20489233216194],[-79.631993546228443,43.203941987108493],[-79.632424138026423,43.202953577906527],[-79.632495462066373,43.202789854358578],[-79.632566784484212,43.202626130741692],[-79.633092152968359,43.201420102832117],[-79.633228839796374,43.201106319157738],[-79.633277654257427,43.20099425657591],[-79.633492813915794,43.2005003166676],[-79.633680561590651,43.200069300860349],[-79.634230643284553,43.19880642626736],[-79.634295349196634,43.198657872658579],[-79.634645832984347,43.197853199361752],[-79.635206971051005,43.196564839687703],[-79.635586157732234,43.195694201958617],[-79.635669277305212,43.195503350923538],[-79.635778142633711,43.195253383607131],[-79.635836300923458,43.195119842676078],[-79.6358433376612,43.19510368676724],[-79.635906888972343,43.194957762128816],[-79.635975065366438,43.194801217628871],[-79.636043241402774,43.194644673079367],[-79.636233818718139,43.194207070649938],[-79.636801790901018,43.192902849162557],[-79.637055154451488,43.192321037045033],[-79.637681908590011,43.190881738474381],[-79.63808352385567,43.189959417258812],[-79.638252925061465,43.189556134015163],[-79.638764615117637,43.188364483716768],[-79.639703856814933,43.186176993662613],[-79.641394052720017,43.182240111714663],[-79.642070532316353,43.180664271365046],[-79.644766726816641,43.174400530801456],[-79.646150709426905,43.171184753423198],[-79.646808106398296,43.169699277888824],[-79.649743425733661,43.163065572674576],[-79.649750808365866,43.163059896826397],[-79.649757798247762,43.163052505454992],[-79.649764788127968,43.163045114083147],[-79.649776107966503,43.163028228869187],[-79.650053229158672,43.162375691170141],[-79.650067498845033,43.162342090248828],[-79.650215478849503,43.162006881645944],[-79.650276618206902,43.161900537496628],[-79.650395113001068,43.161648326174905],[-79.650423999314739,43.161586842692742],[-79.65078857086587,43.16081097836242],[-79.650824140197187,43.160755936291068],[-79.650833904806035,43.160740826353319],[-79.651069870633194,43.160218509656985],[-79.651492780805398,43.159282362313782],[-79.651778745481437,43.158649335594738],[-79.652064704105655,43.158016308013018],[-79.652513755078402,43.157022215051988],[-79.652564923483752,43.156908938288318],[-79.652678797160775,43.156662501359747],[-79.65339339508148,43.155115959266034],[-79.653739916647638,43.15436598297358],[-79.65374197622674,43.154361526481125],[-79.654010653355215,43.153779953613935],[-79.654282750921297,43.153190965308944],[-79.654393554741972,43.152951113331476],[-79.654413543117812,43.152907841407298],[-79.65450330965902,43.152713509975449],[-79.654603787125438,43.152486591311764],[-79.654769701148652,43.15211188543973],[-79.654954083210754,43.151695467917619],[-79.655852802521437,43.149665656042806],[-79.655971579344026,43.149397381802181],[-79.656177306289337,43.148932709094126],[-79.656412660056418,43.148401110783524],[-79.656794165088272,43.147539377183136],[-79.656894380697253,43.147313006097583],[-79.656928135445881,43.147236760738053],[-79.657220487747409,43.146576377356794],[-79.657309421223019,43.146375486395925],[-79.657411146562083,43.146145697235475],[-79.657923299729461,43.144988758205336],[-79.658035337350782,43.14473566368455],[-79.658300058865407,43.144137640218197],[-79.658303174762395,43.144133939811596],[-79.658308391528536,43.144127742728223],[-79.65831131826755,43.144125156685604],[-79.658315124050802,43.144121793041109],[-79.658318929853323,43.144118428496256],[-79.658319551828242,43.144117878399854],[-79.658325235355207,43.144114291849171],[-79.658330918861822,43.144110706198433],[-79.658332021154905,43.144110010456089],[-79.65833892116197,43.144106579545095],[-79.658345821168268,43.144103148633675],[-79.658360930209838,43.144098283194992],[-79.658371568640987,43.144095636310659],[-79.658373853601717,43.144095067896764],[-79.658376138562403,43.144094499482812],[-79.658384971831666,43.144093536016875],[-79.658387265824146,43.144093285574499],[-79.658389900038898,43.144092997700334],[-79.65839253300453,43.144092710711938],[-79.65839737097663,43.144092474795215],[-79.658402207719291,43.144092238863884],[-79.658406563133383,43.144092026102776],[-79.658408905787795,43.144091912201574],[-79.658414669048256,43.144092326468702],[-79.658423952374761,43.144092994526211],[-79.658425358196098,43.144093095656388],[-79.658441644349395,43.144096258192924],[-79.658991524992956,43.144218883846698],[-79.659997006508732,43.144443102749335],[-79.660278844465438,43.144505949905749],[-79.661045785512883,43.144676965652067],[-79.661335121330922,43.144741481887991],[-79.661985409745526,43.144894592734019],[-79.66249315352951,43.145014138782187],[-79.66252478121767,43.145021585342725],[-79.663271282954511,43.14519463890484],[-79.66346124510774,43.145238675300433],[-79.66367340798061,43.1452878566609],[-79.663723987844307,43.145299581787683],[-79.664886394228475,43.145569032862809],[-79.666720485780033,43.145994154874849],[-79.668170534666672,43.146330235672259],[-79.668180530352473,43.146332551887312],[-79.673135589736049,43.147481006789654],[-79.681162238189998,43.149340832269104],[-79.687906852526055,43.150903082460431],[-79.687906890276452,43.150903100002331],[-79.689159035125869,43.151181520721948],[-79.689431458508466,43.151242093690435],[-79.689516663532913,43.151261038638467],[-79.691463889249249,43.151717533576495],[-79.691537316442862,43.15173823508816],[-79.691652646954793,43.151770750001923],[-79.693844870021479,43.152268997318174],[-79.69403842769195,43.15231252873366],[-79.695335890176139,43.152604322710374],[-79.695335914844691,43.152604319389823],[-79.695335947699064,43.152604335972953],[-79.695705402268359,43.152687421812715],[-79.697785818243659,43.153151696613023],[-79.697785853940545,43.153151695218426],[-79.698773261308915,43.153370997597939],[-79.703959764086719,43.154522753235177],[-79.706420052322287,43.155069006954733],[-79.707748190935149,43.155363865116172],[-79.709384662998374,43.155727152044314],[-79.709693177498238,43.155795637061793],[-79.709730708699922,43.155802056593501],[-79.709768241158386,43.1558084752266],[-79.711488867706578,43.151740211007159],[-79.713209260105941,43.147671915144656],[-79.713209282747016,43.147671891086617],[-79.713694184678261,43.146518409558482],[-79.714179069148301,43.145364924626797],[-79.714179067274401,43.145364896691127],[-79.714315328549219,43.145040739439594],[-79.714315349846203,43.145040720769046],[-79.714338580938119,43.144985451593094],[-79.71466886354871,43.144188553948624],[-79.715008316012174,43.143370281986897],[-79.715347759181782,43.142552008787192],[-79.716270811316662,43.140402194499814],[-79.71632334577815,43.140279835356992],[-79.716323342560983,43.140279812809098],[-79.716323365141548,43.140279791451142],[-79.716323852414959,43.140278600191564],[-79.716360277579767,43.140191713554735],[-79.716381956101998,43.140140002266676],[-79.716868434973961,43.13897951406031],[-79.716972836924626,43.138730457282627],[-79.716972836297728,43.138730428460477],[-79.717092820491459,43.138444254160525],[-79.717092844394514,43.138444228314867],[-79.718383090370779,43.135420636254004],[-79.718383089724412,43.135420608332112],[-79.718383114892589,43.13542058069941],[-79.718384370314155,43.135417634909729],[-79.718941027892086,43.134095610977035],[-79.718949514332664,43.134075456171075],[-79.718957999538262,43.134055301350571],[-79.719973512202117,43.131642144288186],[-79.720986606747601,43.129234889600305],[-79.722727232070355,43.125136819555976],[-79.722944227010885,43.124625890534496],[-79.723026493582651,43.124430195616846],[-79.723026990931473,43.124428980124804],[-79.723027512767544,43.124427769408427],[-79.723037978864227,43.124402970100164],[-79.723037976930527,43.124402944865295],[-79.723038000806753,43.124402919918516],[-79.723903683757413,43.12235151246778],[-79.72390416676609,43.12235033463142],[-79.723904170084936,43.122350293246605],[-79.723904192637448,43.122350272787237],[-79.723904704156496,43.122349083562725],[-79.725111566865124,43.119451349680389],[-79.725280546530627,43.119045457742764],[-79.725854822312385,43.11766600156114],[-79.726117813949983,43.117034249764629],[-79.727324457080343,43.114166156066155],[-79.727885611333008,43.112822900085099],[-79.727886108486643,43.112821684567088],[-79.727886630141981,43.112820472923417],[-79.727892774166065,43.112805769825385],[-79.727898918187122,43.112791066726963],[-79.727898916307623,43.112791038791293],[-79.727898940195928,43.112791012943106],[-79.728386320837899,43.111624574456812],[-79.729265529860797,43.109525246678743],[-79.731106037441393,43.105165400056428],[-79.731373058669263,43.104532818518727],[-79.73137354786509,43.104531624506876],[-79.73137354469975,43.104531599258415],[-79.731374066212368,43.104530387595346],[-79.73160605706731,43.103974605956388],[-79.731606554071917,43.103973390418517],[-79.731607075574971,43.103972178754169],[-79.732083660748117,43.102829269248865],[-79.732084157733524,43.10282805370845],[-79.732084179028817,43.102828034133935],[-79.732084690200182,43.102826845765065],[-79.732338748263061,43.102217476434255],[-79.732944720361587,43.100793710056571],[-79.732944723635697,43.100793670471795],[-79.732944750085679,43.100793639247968],[-79.732946653696843,43.100789165142153],[-79.732947150647817,43.100787949597127],[-79.732947676936078,43.100786741580841],[-79.733044795634498,43.100558418441636],[-79.73341649094732,43.099671874319505],[-79.735158790852196,43.095499910119223],[-79.735523448361405,43.094626654417489],[-79.736774852681037,43.091636906047825],[-79.737122908469502,43.0908053057099],[-79.737987804665565,43.088732026961196],[-79.737987802781959,43.088731999025548],[-79.737987827884822,43.088731973188501],[-79.738112405467348,43.088433328837638],[-79.738112728927049,43.088432534579603],[-79.738112893169017,43.088432134776859],[-79.738112889983086,43.088432110428755],[-79.738113411219402,43.088430898728227],[-79.738222734337739,43.088168944455582],[-79.73826112857185,43.088094357855354],[-79.739862183435932,43.084309993471869],[-79.74168508891907,43.080011704294392],[-79.742471771814891,43.078085088297819],[-79.742472263471797,43.078083872648023],[-79.742472286056852,43.078083849483718],[-79.742472766108207,43.078082660720838],[-79.742834699745771,43.077179964371801],[-79.742835159115344,43.077178885238744],[-79.74283521595008,43.077178748989951],[-79.74283568808967,43.077177525920099],[-79.743002667977763,43.076761098275234],[-79.74300267117016,43.076761062291027],[-79.743002696413157,43.076761029250513],[-79.743374788035268,43.075833052565855],[-79.743374788826401,43.07583301385381],[-79.743374812638365,43.0758329907028],[-79.743743971545669,43.074912296865357],[-79.744412455022015,43.073237217982225],[-79.744557201960177,43.072874499806019],[-79.74455719879073,43.072874474557757],[-79.744618434891521,43.072721021621199],[-79.744670817037999,43.072593688162918],[-79.74467083578908,43.072593672159954],[-79.744842104357872,43.072177338048654],[-79.745245104401221,43.071197663625441],[-79.745648091271931,43.070217987456807],[-79.746489067809208,43.068193107402728],[-79.746569484965434,43.068061887438155],[-79.747096457280534,43.06669662049746],[-79.747104135732613,43.066676728245596],[-79.747104610707382,43.066675538504661],[-79.747104608893423,43.066675506967862],[-79.747104633946591,43.066675482929121],[-79.747105113906315,43.066674289640829],[-79.747184763294925,43.066467837995631],[-79.747626128848225,43.065399068792743],[-79.748067478668588,43.06433029749892],[-79.748123947871221,43.064234837284033],[-79.748382646297003,43.06356890482796],[-79.748382646993051,43.063568870617182],[-79.748382667059829,43.063568850125542],[-79.748384100427799,43.063565160312159],[-79.748384567435352,43.063563937160126],[-79.74838503928099,43.063562717662961],[-79.748400293256537,43.063523443311311],[-79.748750440004585,43.062621893536821],[-79.749463890695395,43.060951732168633],[-79.74958518794385,43.060759997463492],[-79.750244336697136,43.059077255370561],[-79.75029935980946,43.058985830372208],[-79.750936290136337,43.057451959603654],[-79.751196640381096,43.056848736047499],[-79.751522487308222,43.056093742789272],[-79.751848324834725,43.055338747491547],[-79.752286621667665,43.054343584306551],[-79.75230332169879,43.054305664156139],[-79.752582027289677,43.053672837456126],[-79.752676524013452,43.053517816996219],[-79.752883602346998,43.052976536374217],[-79.752883597856098,43.052976515614098],[-79.752931553267544,43.052851164749434],[-79.752963274560045,43.052771981346837],[-79.752998640325828,43.052693759748664],[-79.752998661560341,43.052693741970351],[-79.753010079416271,43.052668490707489],[-79.753463056399681,43.051670518988303],[-79.753463591118106,43.051669337972776],[-79.753463587982338,43.051669310924041],[-79.753464142816554,43.051668106715006],[-79.753500101130655,43.051588754986945],[-79.75389566657438,43.050718514833619],[-79.75397242802218,43.05063236376715],[-79.753976891190092,43.050628547480812],[-79.753990274479648,43.050617102155009],[-79.753997846394682,43.050610626364964],[-79.754007821058465,43.050602096614675],[-79.754017234709622,43.050594046116778],[-79.754018400496761,43.050593048465338],[-79.754029633386821,43.050583442825413],[-79.754044184934628,43.050570998067521],[-79.754054305764555,43.050562343836582],[-79.754062887251621,43.05055500466279],[-79.754071642414544,43.050547516998193],[-79.754078267181853,43.050541852133257],[-79.754080243885085,43.050540160931419],[-79.754092971154321,43.050529276657223],[-79.754097483039587,43.050525418573677],[-79.75409882750337,43.050524267983221],[-79.754100686734901,43.0505226781574],[-79.754101994942516,43.050521559589662],[-79.754103114686657,43.050520592052536],[-79.7545572442138,43.050656736602477],[-79.754805173250972,43.050740478586185],[-79.755397750979967,43.050921979983073],[-79.755503270385546,43.050962208748054],[-79.756292787032748,43.051220407477722],[-79.757082310406602,43.05147860083072],[-79.75759461313649,43.051671555524898],[-79.768497619874296,43.055496987905755],[-79.76860127472311,43.055496212412216],[-79.76872628344826,43.055520610059908],[-79.770630260815793,43.056170431285807],[-79.77088638107513,43.056258188549805],[-79.771160315763936,43.056353163943882],[-79.773882435872721,43.057296894475627],[-79.775761691710187,43.057960322894601],[-79.778351735186206,43.058903528016884],[-79.781016125057306,43.059823423549588],[-79.781139440495409,43.059865799306102],[-79.782890446538005,43.060464710405469],[-79.785055184203003,43.061196127418334],[-79.787027314196138,43.061932395606306],[-79.787828246058439,43.062214090357813],[-79.789763718367439,43.062881846323656],[-79.790268125289245,43.063063669845981],[-79.79051417400477,43.063152362656552],[-79.793413410307409,43.064227173731936],[-79.793504161298955,43.064265140582187],[-79.793596159702219,43.0643021299785],[-79.793688300425316,43.064338130267572],[-79.79378169031996,43.064373063068551],[-79.793876571428953,43.064407111026668],[-79.793971493240946,43.064439088219451],[-79.794067764056578,43.064471169599202],[-79.794164075564311,43.06450118021111],[-79.794260406578672,43.064530200413913],[-79.79435810776566,43.064558244438921],[-79.794605463328963,43.064641895896933],[-79.794777445748053,43.064700058047528],[-79.795118567638212,43.064815418734391],[-79.795249910151796,43.064862816466288],[-79.798423539758744,43.066007745471076],[-79.802484498467209,43.067453078603911],[-79.803588328882995,43.067845905151316],[-79.804458738588394,43.068153302758681],[-79.808369215492561,43.069534227602638],[-79.809030201992428,43.069767625319734],[-79.809691193574579,43.070001019268794],[-79.81121389847651,43.070538590013157],[-79.811978642754312,43.070806715927738],[-79.812077532236572,43.070841387421602],[-79.819969829175903,43.073608025768394],[-79.822492856684335,43.074469571476051],[-79.822673905158098,43.074531392307499],[-79.823743977751548,43.074896766864711],[-79.82415947540008,43.075038634056995],[-79.824289869930894,43.075083185482391],[-79.827818886397907,43.07633549409703],[-79.832064622709368,43.077841928032086],[-79.832365748054599,43.077950682975477],[-79.834932438907899,43.078877628111663],[-79.835292443335362,43.079007634647823],[-79.835472446741136,43.079072637502946],[-79.835652449304007,43.079137640066079],[-79.850556983901299,43.08451843505479],[-79.851266356467818,43.084768934417305],[-79.858132577883154,43.087193261090135],[-79.863252296587177,43.088984721314461],[-79.865036974274119,43.089628983013831],[-79.870977792807039,43.091738318478242],[-79.873281146211255,43.09255227733442],[-79.878141470065515,43.094263856329412],[-79.883160777850904,43.09603189015656],[-79.88814901511634,43.097787695434398],[-79.8925782694117,43.099306180221056],[-79.89398799805916,43.099797071254564],[-79.89686983900782,43.100812360276201],[-79.900597331446221,43.102104499110055],[-79.902696120681568,43.102858604626356],[-79.906232803592275,43.104132670445019],[-79.910888177918679,43.105798529335708],[-79.913832245583592,43.106848922638122],[-79.917881339525678,43.108301545267246],[-79.919165973376039,43.108770778178098],[-79.922050039602368,43.109820494771718],[-79.926463874695671,43.111414453134877],[-79.928602473890706,43.112187561122219],[-79.929906374872772,43.112658895131574],[-79.932746167374489,43.113685346411792],[-79.934406378055996,43.114264161141207],[-79.938453986800482,43.115703474101352],[-79.943419430761878,43.117475386173162],[-79.948143593985549,43.119148153076225],[-79.954459640843424,43.121363864349398],[-79.956869542008405,43.122210487988752],[-79.956886742880613,43.122216530345092],[-79.958893839544444,43.122921607219062],[-79.960900982839533,43.123626649274819],[-79.962601652765784,43.124228924465868],[-79.963507492938064,43.124549703210583],[-79.964302356438409,43.124831174659207],[-79.964467810875306,43.124897686879848],[-79.964515371574095,43.124913155336145],[-79.96456154681043,43.124930592289118],[-79.964606353291856,43.124949007364251],[-79.964651036884248,43.124967421309755],[-79.964694457936062,43.124987804868141],[-79.964736387319917,43.125009165440204],[-79.96477840472788,43.125032597896002],[-79.964818948690422,43.125055926957117],[-79.964858122385237,43.12508032418188],[-79.964895927330844,43.125105699537471],[-79.964921875452404,43.125117717960912],[-79.964940938886357,43.125126547631048],[-79.964942036026045,43.125127097844079],[-79.96498816145187,43.12514750575604],[-79.965035620775268,43.125169006290818],[-79.965081762960935,43.125188423789233],[-79.965129240563073,43.12520884387515],[-79.965176611975636,43.125228272453533],[-79.965224106335171,43.125247702124241],[-79.965272969503218,43.12526615362696],[-79.965320480616086,43.125284592881755],[-79.965369343843051,43.125303044343802],[-79.966283358280194,43.125629037453827],[-79.967605651068311,43.126100628958667],[-79.969183446127062,43.126655863012395],[-79.97356345025149,43.128216960863242],[-79.974131742260653,43.128419532831003],[-79.979911955162166,43.130440291574928],[-79.984324231834989,43.131994724630118],[-79.984964242048306,43.132220177935615],[-79.989913510655768,43.133993991505371],[-79.989993335556321,43.134022598436694],[-79.990088865616571,43.134057240275133],[-79.992161855750567,43.134808928764876],[-79.993460526245826,43.135279785253381],[-79.996821859811718,43.136499919635042],[-80.004973499052667,43.13947172408637],[-80.008000436914472,43.140563088055103],[-80.0085104145316,43.140746949587559],[-80.010026333332689,43.141293460150813],[-80.010427458566696,43.141438035161343],[-80.011777202207341,43.141931367045537],[-80.015639270991613,43.143342751423333],[-80.023148480443581,43.146025288388216],[-80.025918963291943,43.147014813764237],[-80.026057580889145,43.147060027197135],[-80.026194783210443,43.147109190515394],[-80.026204277259822,43.147112983991327],[-80.026327863665102,43.147162370737689],[-80.026425670870495,43.147204809619303],[-80.026459528884104,43.147219500861958],[-80.026540675161797,43.147258440893438],[-80.026586949306861,43.147280646866555],[-80.026710265051889,43.147344729384947],[-80.026830795867411,43.147413830753514],[-80.026945869424182,43.147485857155438],[-80.027001968656649,43.147523343874482],[-80.027058067957782,43.147560830566427],[-80.027166146126831,43.147639730930472],[-80.027247007766505,43.147705522967918],[-80.027322536431853,43.147774151135238],[-80.027369272498902,43.14782047279305],[-80.027559428873829,43.147741136315595],[-80.027596539350867,43.147727494339108],[-80.027636307921313,43.147716846515976],[-80.027656168651916,43.147713008186287],[-80.027676029380089,43.147709169853123],[-80.027718531906501,43.147704488385095],[-80.027759526034899,43.147701865180487],[-80.02780193293944,43.14770321606558],[-80.0278223672141,43.147705866015954],[-80.027842801490593,43.147708515962698],[-80.027883637230133,43.147715886663789],[-80.02790335525755,43.147721051849835],[-80.027923073288349,43.147726217032513],[-80.027961231207541,43.14773959815065],[-80.030180261237007,43.148527565038677],[-80.032306639052052,43.149282572593584],[-80.033519635223797,43.149725530240133],[-80.039057096726324,43.151747434967618],[-80.039401953093375,43.151873336072029],[-80.044783601869312,43.153820465129549],[-80.046354254819207,43.154388671175191],[-80.046417332422863,43.154411682733112],[-80.048226712411577,43.155071743511726],[-80.049135490937061,43.155423011909349],[-80.054672435119386,43.157591498742249],[-80.054877524197451,43.157676217054181],[-80.055092314026965,43.15774606721525],[-80.055314207923956,43.157801928205991],[-80.059961699073057,43.159522896826317],[-80.062548819449205,43.160480786245195],[-80.068815029251837,43.162766173112168],[-80.071909166104149,43.163895349373668],[-80.072337779232853,43.164052121589165],[-80.072766394588271,43.164208891314466],[-80.079179897293415,43.166558905634794],[-80.079901897172462,43.166823290419536],[-80.080870017265113,43.167199686262528],[-80.086029608367269,43.169205470716165],[-80.090191062276574,43.170689651693912],[-80.091442950304966,43.171123731209306],[-80.091653079859839,43.171199563756787],[-80.094734237914679,43.172311441135982],[-80.095925578372714,43.17273878725738],[-80.097116935604419,43.173166121090198],[-80.102357051007147,43.175070636255917],[-80.104889873598381,43.175973222325176],[-80.107422771503849,43.176875753740056],[-80.108915260198842,43.177391931963548],[-80.113995238476747,43.179148636152512],[-80.114343333621264,43.179273929146504],[-80.116760265380975,43.180139838392847],[-80.117000634887972,43.180225951194593],[-80.117530274544222,43.180415693007724],[-80.119130674128826,43.180989005524481],[-80.120955773439519,43.181640622946865],[-80.121687035219921,43.181898873534749],[-80.122289355658694,43.182111582050958],[-80.122891680332629,43.182324286524192],[-80.1233141294787,43.182473472396019],[-80.124169580370506,43.18280483074053],[-80.124399616731409,43.182885894465556],[-80.124827922979279,43.183036825064498],[-80.125572816035373,43.183299312545635],[-80.127225391591097,43.183881621649256],[-80.127650860309615,43.184031534901848],[-80.128736309655977,43.184404493664054],[-80.130515950115651,43.185055864301589],[-80.130551488652983,43.185068868885487],[-80.130764803201416,43.185146943614477],[-80.131009180023966,43.185236390044643],[-80.13185347694747,43.185544664775335],[-80.132092477074664,43.185631926762348],[-80.132292804109667,43.185705069971903],[-80.134498697374198,43.186522879116403],[-80.134784596751146,43.186628868924807],[-80.138071888947138,43.187807186128481],[-80.139388644030859,43.188285276593092],[-80.139695816030937,43.18839411555431],[-80.140546429985406,43.188695517349409],[-80.14100149857866,43.188856756508706],[-80.14263858225614,43.189436790345781],[-80.143028706520852,43.189575012982786],[-80.143385094113853,43.189701275537928],[-80.145125704010923,43.190317933602749],[-80.146358786739967,43.190733202070497],[-80.146503234541314,43.190784244328853],[-80.146587926035608,43.19081417030776],[-80.14962518773757,43.191910152123988],[-80.151371114642544,43.192540102268751],[-80.151534342908135,43.192597895048358],[-80.151724185552027,43.192665111178883],[-80.15293115015146,43.193092436217043],[-80.15304795940979,43.193133791684879],[-80.15344986916503,43.193240417095694],[-80.153920632034342,43.193408866181166],[-80.15539868463361,43.1939211707383],[-80.156364746540717,43.194274440348032],[-80.156402825310096,43.194288768511448],[-80.156439536773092,43.194304077099346],[-80.156652183277544,43.19440973855783],[-80.160227466845456,43.195675257806066],[-80.161571885905275,43.196151090420116],[-80.161620288245942,43.19616821643114],[-80.161751790420567,43.196214756540513],[-80.161849369326418,43.196249290506778],[-80.161975877363844,43.1962926799374],[-80.164703457105517,43.197228133866837],[-80.165081710133578,43.197357851656498],[-80.166435962861684,43.197835948183489],[-80.16779023692871,43.198314028813854],[-80.168044461896514,43.198403772026374],[-80.169592847171984,43.198950347702493],[-80.17033831584763,43.199213481308156],[-80.170928222732556,43.199432705886935],[-80.171020919220908,43.199467155215153],[-80.171329471105764,43.199581819919594],[-80.172799885798341,43.200128239353148],[-80.173629229317541,43.200436419606625],[-80.173658547379162,43.200447089456176],[-80.173687864220341,43.200457759289392],[-80.173908191995977,43.200537963451595],[-80.174646771516237,43.200806820933074],[-80.175667221692038,43.20117827149312],[-80.17668768311232,43.20154971391932],[-80.177070717380531,43.201689129905425],[-80.177255821258669,43.201756755778952],[-80.177934361803906,43.202004650167986],[-80.178728635445879,43.202294817412131],[-80.178944384028185,43.202373635484435],[-80.179160134413564,43.202452452261731],[-80.17977483179358,43.20267700834993],[-80.181714405172514,43.203385524353635],[-80.182152369529277,43.203551086774993],[-80.183107857243144,43.203912278644019],[-80.183703167864309,43.204137310889479],[-80.185431738347702,43.204790697960341],[-80.185813891563399,43.204935144405447],[-80.18640932635482,43.20516020124996],[-80.18727135910747,43.20548601738448],[-80.187907459365746,43.205726432794457],[-80.188494895253669,43.206001678154777],[-80.188962132110987,43.206220599404148],[-80.189290412660228,43.206374411571275],[-80.189618694867633,43.206528222805503],[-80.191307145904659,43.207170688626995],[-80.19209718723846,43.207471290107719],[-80.1935724544133,43.20803259079814],[-80.194401757645082,43.208348106454117],[-80.194418132040212,43.208354335955875],[-80.194443258607976,43.208363498685536],[-80.19487328848416,43.208528331527106],[-80.195421738184834,43.208732454759627],[-80.195559113224107,43.208785371687462],[-80.197574780537636,43.209561782351514],[-80.198283728584514,43.209826088361368],[-80.198479116447061,43.20989890350269],[-80.198587787300482,43.209939400792344],[-80.19869645828706,43.209979898879993],[-80.198720313719434,43.209988461056668],[-80.1988456794831,43.210033460325683],[-80.198938813737826,43.210066890541164],[-80.199024221317671,43.210097546261132],[-80.199375768928064,43.210223729933112],[-80.200011831394619,43.210449282036222],[-80.200055245780121,43.210464676604452],[-80.20013690165338,43.210490190587663],[-80.200176403575639,43.210505504626489],[-80.200215905517837,43.21052081865178],[-80.200253282495026,43.210538594100996],[-80.20029065949403,43.210556369538111],[-80.200361797617461,43.210616441017002],[-80.200419641688185,43.210665284320122],[-80.200501550134135,43.210734450098144],[-80.200583458776677,43.210803614917772],[-80.20061087777276,43.210826768506941],[-80.200638296801301,43.210849921189237],[-80.200675932734455,43.210909164958139],[-80.200680022462109,43.21091971642759],[-80.200716719249925,43.211014398825171],[-80.20073994402793,43.211074323490124],[-80.200763170069848,43.211134249059079],[-80.200809621080239,43.21125409837267],[-80.201051846143557,43.211879063240289],[-80.201065636543859,43.211914646171621],[-80.201211963328234,43.212292176989479],[-80.201293812828879,43.21250335037611],[-80.201746666883622,43.213653121738446],[-80.20200074093303,43.214298182675627],[-80.202084916610119,43.214511893870316],[-80.202127005286712,43.214618748997289],[-80.202169094107774,43.21472560410799],[-80.202280309418057,43.21500497685907],[-80.202899653450046,43.216560714529685],[-80.203035434598178,43.216901774088612],[-80.203099765432526,43.217060365345503],[-80.203252558394979,43.217437037816993],[-80.203347486497677,43.217671057304351],[-80.203396576793949,43.217792074621414],[-80.203448184374423,43.21791929746658],[-80.203480752870021,43.217999485891319],[-80.203576866522937,43.218206497550362],[-80.203602105856334,43.218260858985843],[-80.203614725545478,43.218288039251242],[-80.20362734523394,43.218315220415597],[-80.203759971752575,43.218428396985132],[-80.204797856723346,43.220892686857809],[-80.204834415644839,43.220979488625325],[-80.20605362337254,43.223874029206712],[-80.206073596115885,43.223921439701229],[-80.206844925716098,43.225752519855355],[-80.207501081516554,43.227310098811948],[-80.20841065805466,43.229469109998469],[-80.208422205982387,43.229500560389141],[-80.2084337539101,43.229532011678941],[-80.208460157850567,43.229603926509988],[-80.208488033318517,43.229679847789797],[-80.208489429808694,43.229683652922091],[-80.208500478185215,43.229713744643995],[-80.208526966757745,43.229785887861304],[-80.208594298270057,43.229969271019748],[-80.208629010350109,43.230063814396551],[-80.20877485210471,43.230461020705597],[-80.208804325898768,43.230541295005722],[-80.208998175454056,43.231069246783917],[-80.209015475588643,43.231116364487981],[-80.209212589468578,43.23165319361803],[-80.209300770617247,43.231893349902798],[-80.209354178596726,43.232038799588864],[-80.209379214222139,43.232106981290606],[-80.20942787112503,43.232223966757537],[-80.209458003163405,43.232296414955208],[-80.209495329092263,43.232386160400239],[-80.209560252907622,43.232542259237412],[-80.209627477470647,43.232703889289844],[-80.209732882987666,43.23295731912706],[-80.209765945651768,43.233036811122012],[-80.209817584004483,43.233160968509068],[-80.20984957867978,43.2333061718669],[-80.209854408798819,43.233328091074867],[-80.209875158971698,43.23342226113953],[-80.209879034028077,43.233439845205616],[-80.210136335583741,43.233916628213485],[-80.210143762631631,43.233930389100891],[-80.21018060768094,43.234012703029009],[-80.210261218050519,43.23419278740753],[-80.210273008684112,43.234219125513022],[-80.21030466977264,43.234289858726562],[-80.210336332176396,43.23436059103912],[-80.210381417096059,43.234473024755097],[-80.210458747978237,43.234665875670636],[-80.210566702740763,43.234935096627837],[-80.210644478614,43.235129055346867],[-80.210650897821154,43.235145063111872],[-80.210875030252552,43.235686533673501],[-80.210978124134243,43.235935590740176],[-80.21107135574816,43.23616082358447],[-80.211090920619327,43.236208088923824],[-80.211110486751707,43.236255354268152],[-80.211120287806935,43.236281125670516],[-80.211130090090165,43.236306897980882],[-80.21142572475398,43.237084213489254],[-80.211470094060772,43.237200872184118],[-80.211503311374315,43.237288202346662],[-80.211536537030071,43.237375561370762],[-80.211694965391686,43.237805381383353],[-80.211877336686655,43.238300153738408],[-80.212237339745627,43.239276807967329],[-80.212291808950624,43.239414807560131],[-80.212576787588375,43.240136789245874],[-80.21271853628383,43.240495898123449],[-80.212795374158844,43.240709815677164],[-80.212939213032399,43.241110265501263],[-80.213006664622426,43.241298048030565],[-80.213027586481346,43.241356296309462],[-80.213092788587488,43.241474292532949],[-80.213089804446426,43.241500110863718],[-80.213088967744142,43.241565118720111],[-80.213093536125257,43.241631244316494],[-80.213102305829437,43.241696318254291],[-80.213117849306599,43.24176143878676],[-80.213156620598241,43.241897737004251],[-80.213181779258733,43.241986179985567],[-80.213192559176491,43.242024078184706],[-80.21320972756655,43.242068229032455],[-80.213218741936359,43.242114304818365],[-80.213361769474261,43.242218237784193],[-80.213469714831675,43.242470651125558],[-80.213525602834096,43.242601335430052],[-80.2138394654107,43.243335251549205],[-80.214151623066471,43.244065158744334],[-80.214163863308158,43.244093781274749],[-80.214396971014153,43.244638837441343],[-80.214476590611952,43.244825003385706],[-80.214488422214117,43.244852666777895],[-80.214507970511164,43.244898377150548],[-80.214806489324545,43.245684885594791],[-80.214941083360927,43.246039491290034],[-80.215142171400146,43.246569263938881],[-80.215436070526721,43.247399181749699],[-80.215615771251095,43.247906613908988],[-80.215753972624199,43.248296858429832],[-80.216089390197737,43.249243961759937],[-80.216416004923644,43.24992712891126],[-80.216460679561052,43.250044859073604],[-80.216527960005791,43.250222204404935],[-80.218251539551872,43.254578540440349],[-80.218284996732592,43.254689614352884],[-80.218331717098565,43.25484472421055],[-80.218628802751525,43.255597334392128],[-80.218955416011767,43.256424889188331],[-80.219043801831688,43.256648831864752],[-80.219096011457765,43.256781109772106],[-80.219266969234056,43.257214256863712],[-80.220166820878902,43.259494067842184],[-80.220918546395467,43.261398457905841],[-80.221378080443728,43.262562561219859],[-80.221961263871762,43.264039829793582],[-80.221994959220098,43.264127023814247],[-80.222028654662978,43.264214217824403],[-80.223087351344162,43.267088068187988],[-80.223487872338225,43.268175216490498],[-80.223770026648836,43.268941052479171],[-80.224630891728125,43.271277536138108],[-80.225218725982501,43.272726236027204],[-80.225563322826403,43.273611036524045],[-80.225625933171386,43.27377179284364],[-80.225680331336093,43.273911467775982],[-80.22667458490767,43.276464177658056],[-80.226620387180176,43.276851009143499],[-80.226757301764522,43.277075720758155],[-80.227187830279178,43.277782316564952],[-80.227276103314907,43.27817612043772],[-80.227320823049453,43.278292733158679],[-80.227394298469221,43.278484327800946],[-80.227630689674655,43.279080976125584],[-80.228249320130487,43.280642338484924],[-80.22912066745333,43.282841395042055],[-80.231746620934672,43.289467640001483],[-80.232276581335469,43.29080474368412],[-80.232411163774898,43.291144290316986],[-80.232435886346465,43.291206662570396],[-80.232460607735121,43.291269034809893],[-80.232464983044196,43.29128007497139],[-80.232528704328075,43.291443447638798],[-80.232567444361962,43.291542767861451],[-80.232645404913242,43.291742636108992],[-80.232838541914163,43.292237802248657],[-80.232867417332514,43.292311830765051],[-80.232904553381573,43.292407036715183],[-80.233701278423439,43.294449580963111],[-80.233877983877775,43.294902578275511],[-80.235274095987407,43.298481365171362],[-80.235493872760898,43.299044699699913],[-80.235637855701867,43.299413751657738],[-80.237005716830168,43.302919586249494],[-80.238373733799008,43.306425403535407],[-80.238403899163814,43.306513210645093],[-80.238411559041651,43.306535495703656],[-80.238434070778339,43.306601017787166],[-80.238459188144191,43.306674126445493],[-80.238564185336102,43.306979738711249],[-80.238982319885622,43.308196765284627],[-80.239042676889312,43.308372433325225],[-80.239395388010678,43.309398174016543],[-80.23942584552627,43.309477813826092],[-80.239485076669837,43.309637567566647],[-80.240732107461994,43.3128993750733],[-80.240952336877896,43.313474740785118],[-80.241649519941959,43.315296122706549],[-80.243648090229499,43.320516747353828],[-80.243703870230945,43.320693169311888],[-80.243764717134582,43.320869973215423],[-80.243771284963373,43.320891508668673],[-80.243882747990256,43.321178319707563],[-80.24505755130059,43.324201814688251],[-80.245116124128444,43.324360560382665],[-80.245174697244863,43.324519306945326],[-80.245240103216602,43.324689437970186],[-80.245799239695131,43.32613803102651],[-80.245877460615958,43.326335869337207],[-80.245903010591775,43.326400485007497],[-80.247244857206525,43.3299636653677],[-80.247374098554772,43.330306832737634],[-80.247826862354728,43.331509005482872],[-80.24820092912887,43.33250218631251],[-80.2485750091098,43.333495366745829],[-80.248471263493968,43.333512672508718],[-80.247500719643313,43.333674544892098],[-80.244468116737693,43.334180281413502],[-80.244324397208217,43.334206860521668],[-80.244021429757453,43.334262889747272],[-80.243596074607936,43.334341550266636],[-80.243381856674731,43.334381165090207],[-80.243242267093336,43.334406976860357],[-80.243093652814437,43.334434457601802],[-80.242453805402505,43.334540474389293],[-80.239726395989592,43.334980614556805],[-80.238606073446078,43.335161387638145],[-80.238344474304824,43.335203596839825],[-80.238294783627296,43.335214393690023],[-80.237973236111856,43.335284257233276],[-80.23756242372869,43.33535295394681],[-80.237284714912434,43.335399391701593],[-80.23596509141403,43.335618520412012],[-80.233499237555549,43.336028137988222],[-80.23344739285875,43.336036765314496],[-80.233352707856795,43.336052521574075],[-80.233305066695195,43.336059918182109],[-80.230499955040415,43.336495358773],[-80.228933736295616,43.336738452040755],[-80.228400823796093,43.336821160808881],[-80.223479682884118,43.337584779530701],[-80.221716766417686,43.337860177189704],[-80.218536142631166,43.338356969293216],[-80.218433572736529,43.338374789777184],[-80.218431669900028,43.338375120745901],[-80.218114866048751,43.338430162790694],[-80.217735272906808,43.338496112081373],[-80.217355678948749,43.33856206100544],[-80.215854685418634,43.338822821593347],[-80.213486650119989,43.339305729546091],[-80.213362892117289,43.339327023176978],[-80.213245209788852,43.339347271625336],[-80.212899160597416,43.33940670832434],[-80.212513422922711,43.339472960854067],[-80.212050288114298,43.339552504392586],[-80.211278653796441,43.339685027432758],[-80.208815798000941,43.340107970075714],[-80.207156412765571,43.340392893406062],[-80.204381819500639,43.340869242978691],[-80.200846153351833,43.341477496765819],[-80.200642900251481,43.341512459927294],[-80.200542787269725,43.341529715134207],[-80.200452419194335,43.341545290606902],[-80.199304492319712,43.341743133174887],[-80.194581875985534,43.342579882629622],[-80.193728557235602,43.342731048986096],[-80.191904401939652,43.343054170985901],[-80.191722711651735,43.343086353172346],[-80.191015471631147,43.343210886850869],[-80.190151029524699,43.34336266095297],[-80.189286583203128,43.343514428482578],[-80.189645317636533,43.344614992287354],[-80.190487716372715,43.347199230924673],[-80.190621631445168,43.347610025211786],[-80.190695268908755,43.347835909743182],[-80.191253649057955,43.349548693302154],[-80.191256836623197,43.349558601867201],[-80.191305292736857,43.349708928618192],[-80.191308498538106,43.349718858921257],[-80.191670381595173,43.35089027669693],[-80.191803960496941,43.351322660626217],[-80.191979086338321,43.35188951909813],[-80.1919889689282,43.351921507105935],[-80.192050917697358,43.352119847957447],[-80.192126731141357,43.352362575248016],[-80.192283929054312,43.352420391291318],[-80.192459308858957,43.352491178593048],[-80.192670691645105,43.353212710628739],[-80.192764956582693,43.353497417822815],[-80.193696378069717,43.356384755559041],[-80.194031031921327,43.357422093212691],[-80.194207525081453,43.357975741482541],[-80.195276378377542,43.36132844331047],[-80.196509462565629,43.365195792835749],[-80.196695516698327,43.365779277886972],[-80.196836106140495,43.366220170126596],[-80.197257885385952,43.367542830387386],[-80.197398484065531,43.367983719172379],[-80.197539079836233,43.368424605031088],[-80.197820289636283,43.369306380765146],[-80.198101502457021,43.370188156602573],[-80.19782523009053,43.370326455338265],[-80.197526026962535,43.370473075596202],[-80.198662049222378,43.374608052921801],[-80.199946983358771,43.379284319950543],[-80.199951145296168,43.379297331668702],[-80.200695162152186,43.381623457094008],[-80.200917148314332,43.382301660281421],[-80.201041826162182,43.382682560883588],[-80.201072688236479,43.382781304820909],[-80.201346283694804,43.383656718010485],[-80.201466775291621,43.384042242320483],[-80.201773322258234,43.384985102474545],[-80.201923634826912,43.385447412548459],[-80.202624362048326,43.387573339792162],[-80.202736048757359,43.387930039184212],[-80.202756845995765,43.387996209133838],[-80.202777643278424,43.388062379079287],[-80.203370259525343,43.388059976103456],[-80.203400178470034,43.38809782302139],[-80.203430098674488,43.388135670840491],[-80.203686351761448,43.388935179229158],[-80.204648772011609,43.391827849478567],[-80.20502467258413,43.392957587052457],[-80.205700110860292,43.394987458745021],[-80.206407338393817,43.397112714931836],[-80.206431724604286,43.397193195422581],[-80.202226402271364,43.397849628858779],[-80.201255142464703,43.3980127622849],[-80.19823997313884,43.398519050845003],[-80.19581629642478,43.398917434835283],[-80.194656971717606,43.39910797477097],[-80.194311315825075,43.399164789008502],[-80.189635953316355,43.399931164779439],[-80.18537737217423,43.400615227278614],[-80.181868597566449,43.4011484514674],[-80.180232273510157,43.401408485942348],[-80.175850661499396,43.402130118405132],[-80.171128924038626,43.402907560133109],[-80.169748715935185,43.403134813666],[-80.16912507555034,43.403237481519284],[-80.168501433108489,43.403340145952363],[-80.163973705796153,43.404100511710794],[-80.161065229634417,43.404554283314297],[-80.159443867052076,43.40481783233534],[-80.152666029294693,43.405919282334281],[-80.150659311696074,43.406260234632633],[-80.14479866552881,43.40725576675878],[-80.144349640237976,43.40733200661245],[-80.143087491639491,43.407542639997615],[-80.138343464893481,43.408334208008412],[-80.137395824316272,43.408492306671931],[-80.135244605670195,43.408851169192815],[-80.12902999541781,43.409880658680365],[-80.126132980078239,43.410359020382728],[-80.122601446731167,43.410941213874736],[-80.121061132594761,43.411195105201891],[-80.119947200790193,43.411380672262069],[-80.117340309164064,43.411812030703025],[-80.112879877492432,43.412549938886876],[-80.108401461088178,43.413306953272112],[-80.106802884715648,43.413577125331976],[-80.102345726435047,43.414289586677995],[-80.100456626137131,43.414592304287133],[-80.095400085064597,43.415402418787949],[-80.092091086425214,43.415932424785503],[-80.08248382684684,43.41749101736044],[-80.081813030257521,43.417599807540888],[-80.080776091446268,43.417767971173745],[-80.079916252107807,43.417904945704997],[-80.078556068302191,43.418062014723823],[-80.078702523877226,43.418505038896747],[-80.078848981536439,43.418948062867358],[-80.079201792721292,43.420029508077747],[-80.079433423326122,43.420739491244689],[-80.079658314957754,43.421428797840598],[-80.079980061223992,43.42251107701312],[-80.080224405143085,43.423332969469733],[-80.080505961420329,43.424280003204991],[-80.081018920431205,43.426123986294648],[-80.081063109927925,43.426329575806086],[-80.081073283045512,43.426376905192072],[-80.08123511595862,43.426442856842691],[-80.08154434159816,43.427498614975939],[-80.081931174451682,43.428819286322472],[-80.082466357060895,43.430646338038223],[-80.082629201236301,43.431202402262365],[-80.08282393095125,43.431845882203127],[-80.083069274884224,43.432656600973168],[-80.083550255907298,43.4342458997683],[-80.08370529027026,43.434758156465257],[-80.083760403608792,43.43494025972322],[-80.083770732289807,43.434976359838487],[-80.083775748494375,43.435012417385472],[-80.083775190177619,43.435049420742402],[-80.083767713261864,43.435086368662184],[-80.083762689825647,43.435099924961186],[-80.083754830178464,43.435121292307983],[-80.083751943203794,43.435126407950762],[-80.083745648719983,43.435137562511898],[-80.083736466021065,43.435153832705105],[-80.083735152020651,43.435156161503009],[-80.083732630051003,43.43515952422414],[-80.083725552141956,43.435168961682216],[-80.083719573823046,43.435176932140052],[-80.083711319445769,43.435187935929115],[-80.083706486661114,43.435192868497687],[-80.083700646172986,43.435198828489852],[-80.083694805683677,43.435204788481713],[-80.083689814782133,43.435209881860601],[-80.083684825128799,43.435214974348824],[-80.083682079322969,43.435217776105695],[-80.083679656810006,43.435219788071485],[-80.083665374581074,43.435231643986349],[-80.083657022207262,43.435238577925716],[-80.083648669831533,43.435245511864451],[-80.08363600689961,43.43525323065294],[-80.08362334396449,43.435260949439993],[-80.083611896952064,43.435267926107976],[-80.083539225720557,43.435318744950848],[-80.083232096602927,43.435533514415951],[-80.08312411092929,43.435609026085487],[-80.082481751016985,43.436058207208085],[-80.081801091979102,43.436534156782038],[-80.08142762873895,43.436795296746169],[-80.080940020519833,43.437136244651313],[-80.080443122609694,43.437483681705828],[-80.080154966031571,43.437685162712228],[-80.07980245431709,43.437932270511745],[-80.079449939734587,43.438179377188042],[-80.077715294446179,43.439423317771492],[-80.076732628190086,43.440127967756638],[-80.07591000285872,43.440717836891515],[-80.07507831084186,43.441300895958719],[-80.074246602856846,43.441883948772706],[-80.074153299728636,43.441949352626871],[-80.07314862578454,43.442653598731269],[-80.072431927329262,43.443155968668187],[-80.072007277259132,43.443453619590478],[-80.071775883956889,43.44362368438513],[-80.07142906155498,43.443878581163261],[-80.07108223622626,43.444133477751976],[-80.068726984375033,43.445864360845526],[-80.068291660859728,43.446184265885115],[-80.067988158618633,43.446407296614751],[-80.067288222140689,43.446894152535052],[-80.064979324106858,43.448500067471166],[-80.063376514132742,43.449631819262116],[-80.061773644416704,43.45076354691394],[-80.061223482309742,43.451151981218402],[-80.058575577347099,43.453021389254076],[-80.05851444736291,43.453065907466119],[-80.057941379684323,43.453465668091923],[-80.0567549911312,43.454293242741777],[-80.056749902959126,43.45429679168442],[-80.056556809223878,43.454431482372499],[-80.056541576503832,43.45444135146343],[-80.05652634377887,43.454451220552265],[-80.056499909021539,43.454474053446908],[-80.056478865786573,43.454499902245374],[-80.056471109425715,43.454513839935039],[-80.056463353061261,43.454527777624087],[-80.056458381242535,43.454547291244999],[-80.056297843863817,43.454664892539391],[-80.055750882177122,43.455056695103998],[-80.054667622707115,43.455832624142744],[-80.053179000791928,43.45689650027839],[-80.050474731700945,43.458829011041374],[-80.042282482870974,43.464680952992978],[-80.037464456664296,43.468119012083157],[-80.033938574161269,43.470634639489795],[-80.033849735109541,43.470698021798739],[-80.033836823996211,43.470708345954911],[-80.032510977115749,43.469767901539143],[-80.030070704302716,43.468053341941733],[-80.029700395275142,43.467793217879596],[-80.025981848300191,43.465064458579604],[-80.0241765858203,43.463768825006568],[-80.023982598311676,43.463629595488108],[-80.023158802249881,43.463038272361224],[-80.01963799155682,43.460508908516914],[-80.015777413763217,43.457698458708137],[-80.013937306803413,43.456357712710407],[-80.012681417946482,43.455442663758397],[-80.010865192722761,43.454123774505099],[-80.006214079306318,43.450843517029597],[-80.005871966822596,43.450598687516731],[-80.005529857099916,43.450353856996671],[-80.003992028580285,43.449253181207631],[-80.002883473757393,43.448459715388942],[-80.002457042489269,43.448154531747356],[-80.000033109511449,43.44633952108984],[-79.998921409779314,43.445556413350801],[-79.99686209639512,43.444116674761702],[-79.99595305346071,43.443420132708596],[-79.995824505781869,43.443326554779404],[-79.995517085316067,43.443102763562358],[-79.995118564148598,43.442812649241638],[-79.994812600705529,43.442589913421067],[-79.992975163320409,43.441292431855878],[-79.988670126692909,43.438145556174398],[-79.988625932215541,43.438113249471321],[-79.986532091211558,43.436624844972002],[-79.986402133925083,43.436532454957089],[-79.984981499896932,43.435522468537528],[-79.984746803594703,43.435355605819119],[-79.984437132279439,43.435134841380005],[-79.981870565836147,43.433305049291924],[-79.98070328186823,43.432431224941759],[-79.980655747240974,43.43239973626892],[-79.980606835620094,43.432369315819422],[-79.980559266331312,43.432339897792424],[-79.980508979275257,43.432310455514127],[-79.980458675642069,43.432282003541779],[-79.980408250030862,43.432253460416298],[-79.980356587587664,43.432224996282585],[-79.980304891936129,43.432198512781284],[-79.980253194818147,43.432172119286719],[-79.980200016817591,43.432145622518],[-79.980142902324459,43.432118100138418],[-79.980087058024466,43.432088518064603],[-79.980034070238133,43.432058061011055],[-79.979981099138769,43.432026613605686],[-79.979955928131517,43.432009866122847],[-79.979930757138163,43.431993118634551],[-79.979881930898486,43.431957656211821],[-79.979834587149782,43.431922206994621],[-79.979789870987531,43.431884800249541],[-79.979746547051093,43.431845424956975],[-79.979706066009356,43.431805984971582],[-79.979672176803248,43.431778669591594],[-79.979636910581945,43.431752422432929],[-79.979600270370867,43.431727063434785],[-79.979563630190398,43.43170170442508],[-79.979526990040569,43.431676345403837],[-79.979488972875458,43.431652054600463],[-79.97944958172063,43.431628651954078],[-79.979410190596255,43.431605249294321],[-79.979370781345949,43.431582926978493],[-79.979329873055818,43.431561581744326],[-79.97924291402407,43.431508760477954],[-79.979199451211159,43.431481359492857],[-79.97915598843754,43.43145395849151],[-79.979071797427835,43.431398190378225],[-79.978989000269863,43.431340363653057],[-79.978909043056916,43.431282652271328],[-79.978828995765213,43.431222959076557],[-79.978751808093179,43.43116221084599],[-79.978676012763145,43.431099494046904],[-79.978601576466829,43.431036789336773],[-79.978529891389343,43.430972128202619],[-79.978486603747939,43.430930681756642],[-79.978443421526947,43.430890316755317],[-79.978401492875591,43.430848882417834],[-79.978359702959921,43.430806548871409],[-79.978319133294235,43.430765126645383],[-79.978278702363383,43.43072280521146],[-79.978238289664532,43.430679403406423],[-79.978197736827724,43.430636990810775],[-79.978160041977887,43.430593613264577],[-79.978120986800391,43.430550313592015],[-79.978080524336477,43.430509882714155],[-79.978037185820185,43.430471497112748],[-79.977992488494877,43.430433099349813],[-79.97794652256438,43.430396671182514],[-79.977899057627411,43.430361220073621],[-79.977873949651041,43.43034447269239],[-79.977848841688541,43.430327725305737],[-79.977797143411877,43.430294217264112],[-79.977744158342659,43.430263759167069],[-79.977689814467681,43.430233288896886],[-79.977633954914737,43.430204786001582],[-79.977371206688844,43.430077366311693],[-79.977308569832587,43.430047812168652],[-79.977248685616004,43.43001621161612],[-79.977188816623837,43.429983710735257],[-79.977130324743754,43.429950141622243],[-79.977074583991651,43.429914616137978],[-79.97702034236832,43.429878113561927],[-79.976966134173381,43.42983963030639],[-79.976915897261563,43.429800102037788],[-79.976865799113213,43.42975967455547],[-79.976818436926479,43.429718191013272],[-79.976410471404407,43.429410463492012],[-79.976004825795471,43.429111939696547],[-79.972984535473273,43.426935337994713],[-79.96954771918243,43.424462532251987],[-79.969247716253733,43.424246716366753],[-79.967202564591389,43.422807124814661],[-79.96567748218132,43.42173354430544],[-79.964545952807939,43.420936967833768],[-79.960453276445065,43.41805553008286],[-79.959325024559973,43.417261114036449],[-79.95489246863059,43.414165331949661],[-79.953878293379361,43.413467315363391],[-79.953434325144528,43.413161697083609],[-79.952812757918821,43.412724979892594],[-79.950029549885386,43.410769362814321],[-79.948621466148978,43.409779947495494],[-79.94721342828521,43.408790515140645],[-79.946889610791658,43.4086254549212],[-79.946702480001363,43.40846360866702],[-79.9466382131492,43.408408025254474],[-79.946543741463699,43.408336133083999],[-79.946260327747396,43.408120456112748],[-79.945010137032796,43.407214542744825],[-79.93868094443016,43.402627663296848],[-79.938644161975489,43.402605351248731],[-79.938020426959241,43.402171942921456],[-79.938016395627429,43.402169142942469],[-79.937349485194019,43.401705707383044],[-79.934788788825699,43.399926180018817],[-79.932619883690009,43.398429886136512],[-79.932190927459786,43.3981339425154],[-79.929667274860435,43.396392674679646],[-79.928232327484849,43.395402575031902],[-79.926797426879062,43.394412457699353],[-79.922871455772579,43.391671619975455],[-79.922391883923538,43.391337361287817],[-79.920979662689049,43.390353192017464],[-79.918155895894742,43.388374451258535],[-79.917281933766162,43.387761986417708],[-79.913157221031767,43.384977510918965],[-79.91034547782931,43.382956010392533],[-79.907649344950784,43.381017124456527],[-79.906927153092028,43.380488238824583],[-79.905303212129041,43.379298891656212],[-79.904869837390976,43.378987512211729],[-79.904842705903761,43.378972305082236],[-79.895873444908418,43.372669823534608],[-79.894197603288362,43.371465599366971],[-79.891947704761151,43.369848744436901],[-79.891859213694573,43.369785719635907],[-79.886708361882427,43.366117289056497],[-79.886492532406862,43.365959477089625],[-79.886403460393225,43.365894347954772],[-79.886314388570199,43.365829218751919],[-79.884925490498432,43.364858989633127],[-79.884845052442785,43.364801200121342],[-79.883593556077457,43.363900600198022],[-79.883458686229133,43.363804612833128],[-79.883367784508096,43.363754467509729],[-79.88327688293748,43.363704322115289],[-79.883232276241387,43.363666878363688],[-79.883182165955319,43.36363343283309],[-79.882723414150689,43.3633047927433],[-79.882264525725716,43.362977139950907],[-79.881805678623195,43.362647504736877],[-79.881348298984264,43.362318872509732],[-79.880890820754601,43.361989156945619],[-79.880433469215532,43.361659530823069],[-79.879977356518538,43.361329914991941],[-79.87952137214981,43.361000298586148],[-79.879065287565965,43.360669688880961],[-79.878609331323247,43.360339078602415],[-79.878352474426109,43.360140443308794],[-79.878225141893523,43.360079534642558],[-79.876192143531028,43.358613970209127],[-79.875821054143287,43.358346444676783],[-79.875644530078461,43.358219176792744],[-79.871225350968345,43.355044349478995],[-79.870928429167577,43.35483915459551],[-79.868992312639705,43.353451365090265],[-79.868301903806383,43.352956433597221],[-79.868095795662029,43.352788841026381],[-79.867350722233766,43.352279196909436],[-79.867309566690793,43.352249496972682],[-79.86704291804817,43.35205707011626],[-79.865063198700383,43.350627706141381],[-79.862538779695853,43.348810742991823],[-79.862162139612991,43.348543354437467],[-79.860563454047366,43.347408357588037],[-79.860333701906441,43.347220417433171],[-79.860269094585391,43.347167567642245],[-79.860247363998681,43.347149791517865],[-79.860194430422723,43.347111886534435],[-79.860089465613129,43.347036723902427],[-79.860008969195903,43.346979081900592],[-79.860053999034221,43.346889403563559],[-79.860052761286113,43.346805559019579],[-79.860051523538985,43.346721714474391],[-79.860006376237379,43.346591890483793],[-79.859944606313817,43.346414259185536],[-79.860003701474469,43.346099570515207],[-79.859959452175971,43.345851128276088],[-79.859937333891182,43.345726936474257],[-79.859974130845799,43.345503115290846],[-79.859987433258212,43.34534979425171],[-79.859996086926245,43.345250057305421],[-79.860004086027189,43.345209817867399],[-79.860023627933927,43.345111522112191],[-79.860034809904633,43.345055275691323],[-79.86007698917679,43.344955787376584],[-79.86012646216372,43.344839103029479],[-79.860162467407648,43.344754181753125],[-79.860176115671578,43.344721991846313],[-79.860182939781168,43.344705897792458],[-79.860189762670359,43.344689802825513],[-79.860192603968542,43.34468037828313],[-79.860209685137633,43.344623694492171],[-79.860234724586363,43.344540608855894],[-79.86024387086114,43.344510258700176],[-79.860257903325845,43.344450803564087],[-79.860271936995503,43.344391348437668],[-79.860232884418934,43.344267062628887],[-79.860293101230937,43.344165287672581],[-79.860297616411728,43.344157659085987],[-79.860291678024808,43.344076499606871],[-79.860362163106686,43.344001960925773],[-79.860434319068418,43.343890394578679],[-79.860494730264833,43.343796986571881],[-79.860517240145128,43.343763677421215],[-79.860610746036002,43.343625307658954],[-79.8606887402848,43.343567312708345],[-79.860686562830821,43.343528056861636],[-79.860691883026035,43.343523424852705],[-79.86073468673581,43.343486151476071],[-79.860766854429471,43.343429341444725],[-79.860761750533626,43.343323386656003],[-79.860822908464144,43.343180357019818],[-79.860779997784334,43.343122164267719],[-79.860815738050448,43.343023993683474],[-79.860785361662323,43.342915364042547],[-79.860845742721338,43.342872241744686],[-79.86089860684821,43.342657359526747],[-79.860952345726702,43.342538657046788],[-79.861006084391406,43.342419954536815],[-79.861009619127444,43.342415395674379],[-79.861186515060851,43.342187218977067],[-79.861184998783713,43.342060375382658],[-79.861185297924834,43.342038037435067],[-79.861187865093243,43.341880183574553],[-79.861206781098403,43.341753628980001],[-79.861267780975766,43.341674220196552],[-79.861316438066481,43.341682233298229],[-79.861337183782894,43.341603970625435],[-79.861509822812479,43.3414691108959],[-79.861644211859399,43.34136412960423],[-79.861654943830985,43.341355746138859],[-79.86168075831425,43.341337565589967],[-79.861737527894903,43.34129758272703],[-79.861846918833947,43.341220538093943],[-79.861885747272765,43.341193191726752],[-79.861929930781955,43.341143478468275],[-79.861955827632215,43.341114341166076],[-79.862011868087791,43.34105128782204],[-79.862035118491463,43.341025127149656],[-79.862067997851398,43.340995071513738],[-79.862132102245567,43.340936470906868],[-79.862405324551929,43.340686707108979],[-79.862696412459584,43.340471420055671],[-79.862815877599147,43.340383064231879],[-79.863220656770238,43.340096801379772],[-79.863415875220539,43.339958738778236],[-79.863814254377843,43.339570348369669],[-79.864072711713462,43.339261942722466],[-79.86413699316094,43.339185238382917],[-79.864196410492994,43.339114337688805],[-79.864267137781809,43.339029940859028],[-79.86428210183108,43.339012084170079],[-79.864508689128726,43.338836464775412],[-79.864703285937409,43.338685638961927],[-79.864809791681424,43.338603089002085],[-79.86503968919061,43.338424902712852],[-79.865272358383464,43.338196782260638],[-79.865284904128671,43.338184482400877],[-79.865374884304671,43.338096263514331],[-79.865411134165527,43.33806072241039],[-79.865485994853955,43.337987326033456],[-79.865644654368111,43.337831931590735],[-79.865699600588343,43.337778115814928],[-79.865754546711059,43.337724300011125],[-79.865969223962423,43.337516673882782],[-79.866211639888505,43.337282216244709],[-79.866245610872213,43.337249360816493],[-79.866670486225331,43.337111949195275],[-79.867165203910176,43.336951946833416],[-79.867330608648018,43.336853519572884],[-79.867930996652746,43.336514944979861],[-79.868106592360647,43.336241195391487],[-79.868089203650342,43.336207851777317],[-79.868204814551831,43.335905589089236],[-79.868189519343062,43.335585603976668],[-79.868368109489651,43.33571155173162],[-79.86837876666128,43.335719048042058],[-79.868493757125748,43.335418246620932],[-79.868503126225789,43.335412532345288],[-79.868957835495976,43.335135201646594],[-79.869392818724549,43.334630066652707],[-79.869971921695523,43.334264796738388],[-79.87013492619603,43.334140963480358],[-79.870948892802318,43.333522587326769],[-79.871043461658957,43.333439345436851],[-79.871260418474392,43.333243502314076],[-79.87135736950782,43.33315727167934],[-79.871367517712926,43.333147554268649],[-79.871738194272226,43.332469945168668],[-79.871814061597348,43.332331255942577],[-79.872013771253194,43.332153927260222],[-79.8723012781942,43.331882046417057],[-79.872878125865341,43.331427725706362],[-79.873432453384083,43.330915629074497],[-79.873773356933668,43.330600691537526],[-79.874071543727197,43.330459892963269],[-79.874783051311596,43.330113275918883],[-79.875462432768884,43.329675456454495],[-79.876129480596575,43.329316584426316],[-79.876611916797629,43.329163087982025],[-79.87716913515095,43.329076869444805],[-79.877980533562692,43.328958165263046],[-79.878329915855431,43.328857424315785],[-79.87870944789907,43.328808082762379],[-79.879040487810798,43.328676097986161],[-79.879084095671317,43.328747027688458],[-79.879668063087266,43.32859422256476],[-79.879771411262425,43.328558179747048],[-79.879705836885364,43.32845151880143],[-79.88004665693488,43.328360784527703],[-79.880228736889762,43.32832672427741],[-79.880633273347229,43.328249779331927],[-79.881209293711862,43.328170687356142],[-79.881404728441538,43.328369079276463],[-79.881530816975442,43.328497063878473],[-79.881912760167353,43.328488218453799],[-79.88216262493772,43.328484002187487],[-79.882220349539509,43.328483027529572],[-79.882668550530028,43.328290645244351],[-79.88298177475059,43.328503226377116],[-79.883090102909819,43.328579307819673],[-79.88336092212441,43.328769505559954],[-79.883442164103144,43.32882656048713],[-79.883729225849734,43.329028170611963],[-79.883740062996935,43.329035780712857],[-79.883750890445839,43.329043381713589],[-79.884085353561929,43.329278275775039],[-79.884152668773353,43.329325554119002],[-79.884361982640627,43.329166040732012],[-79.884417345751771,43.329194044420163],[-79.885327713402347,43.328529026669798],[-79.886544286301415,43.327601446763836],[-79.888046348751928,43.326522611948747],[-79.888428691360829,43.326247990603889],[-79.888558056595372,43.326154166060761],[-79.888721380693624,43.326017643473421],[-79.889436813453841,43.325491270652634],[-79.88949866315771,43.325415830250641],[-79.892138915051305,43.32353124529746],[-79.892534464713123,43.323215365095919],[-79.8927671938944,43.323039934921795],[-79.895262407297395,43.321159075343871],[-79.896762940698054,43.320038820521042],[-79.90034390571401,43.317344309361914],[-79.900654871786742,43.317118881139244],[-79.904473180619377,43.314360168668784],[-79.90877822990096,43.311226912408181],[-79.910710907020359,43.309879043641104],[-79.911932792701251,43.309006072357874],[-79.912523827438449,43.308552906114542],[-79.912591012044359,43.308501391725272],[-79.911765388407474,43.30792005002273],[-79.911710648986741,43.307881505835788],[-79.911527945108006,43.307750976622387],[-79.911313860978922,43.307596923088965],[-79.909880571632655,43.306563707477061],[-79.909605958808413,43.306365740487841],[-79.908765170540377,43.305759610475675],[-79.907924398986268,43.305153474398878],[-79.906278037997268,43.303996454741771],[-79.905962161293601,43.303774456495162],[-79.904776871853599,43.302941415433359],[-79.904321430469324,43.302621314474159],[-79.903859515978255,43.302279262382164],[-79.903828180415161,43.302256058176688],[-79.903604895893196,43.302116174086436],[-79.903283750052097,43.301890091064003],[-79.901315450345933,43.300504374096462],[-79.901051803357561,43.300316528201023],[-79.9008141912513,43.300147229985257],[-79.900525575453329,43.299944066638545],[-79.900253451487387,43.29975251038033],[-79.900204796231279,43.299718260279455],[-79.898914652730383,43.2987709485636],[-79.898554232293478,43.298502744424781],[-79.898013962827307,43.298100698430972],[-79.897805456079041,43.297945535906109],[-79.897581365215615,43.29779247751668],[-79.897289574923789,43.2975931779078],[-79.897095642591268,43.297460716319428],[-79.896497829693473,43.297052387628916],[-79.893663777603763,43.295116505859681],[-79.893447298566528,43.294968625718354],[-79.893263753889229,43.294843242900853],[-79.892911133934845,43.294602358429778],[-79.892135031581589,43.294058116187664],[-79.892105413426123,43.294037345799502],[-79.891479130157904,43.293598150875198],[-79.89135432739269,43.293510629233253],[-79.891288610701579,43.293030281593651],[-79.890621234101999,43.292551115872818],[-79.889953869234972,43.292071945444597],[-79.88991668181437,43.292044989649298],[-79.889386919519097,43.291665312389981],[-79.888940413424422,43.291345302260204],[-79.888871159538652,43.291295668269527],[-79.88883594004507,43.291270426791087],[-79.888828235186949,43.291264904197455],[-79.888810714277454,43.291252347347722],[-79.888671513482763,43.291152580784981],[-79.888370469827066,43.290936817035139],[-79.888151409723349,43.290779812541786],[-79.887819607056556,43.29054199427469],[-79.887487806976551,43.290304175063632],[-79.887457748965517,43.29028263199843],[-79.887356474482146,43.29021004462092],[-79.887392777385784,43.290123724693508],[-79.887394788928304,43.290110684094117],[-79.887406474520489,43.290035025566155],[-79.887398574870829,43.289918829926059],[-79.887333860959359,43.289829523787041],[-79.887259058588171,43.289792509607423],[-79.887228496975339,43.289730795080587],[-79.887269860006853,43.289685572460826],[-79.887289505850703,43.2896219665068],[-79.887355666398577,43.289541705357706],[-79.887393301598991,43.28944110639226],[-79.887253963012796,43.289411111036067],[-79.886947145537704,43.289345062354045],[-79.886560500426143,43.28926187901628],[-79.886529784861551,43.289256357364934],[-79.886500070031587,43.289250035040524],[-79.886470355207905,43.289243712708462],[-79.886439667585279,43.289236660534996],[-79.886411075104988,43.289229628752544],[-79.886381386583864,43.289221865928788],[-79.886351836098186,43.28921329403375],[-79.886323146680482,43.289204820560769],[-79.886294595299333,43.28919553801709],[-79.886266043927009,43.289186255466362],[-79.886233330226474,43.289175401605853],[-79.886202737957561,43.289163127670399],[-79.886173159576444,43.289149332830561],[-79.886145717416142,43.289133307654915],[-79.886119412389448,43.289115762777215],[-79.886081565905315,43.289086273536505],[-79.886054001988171,43.289056120847277],[-79.886029473867708,43.288999844964081],[-79.886001973306023,43.2888911265579],[-79.886003140130356,43.288863666903829],[-79.886010560832048,43.288832590712261],[-79.88605342275288,43.28867912076236],[-79.886230463909484,43.288204415229664],[-79.886235927535509,43.288188710505636],[-79.886241391158649,43.288173005781282],[-79.886245745609273,43.28815729025564],[-79.886249128914642,43.288140754865161],[-79.886251511504753,43.288125020137528],[-79.886252798067289,43.288108554374446],[-79.886254071486576,43.288092808845768],[-79.886253386193076,43.288076323881029],[-79.886252687757391,43.288060559150729],[-79.886250894939693,43.288043973355713],[-79.886250209647329,43.288027488390824],[-79.8862463069526,43.288011692457779],[-79.886240432407945,43.287995877322892],[-79.886232586014899,43.287980042985829],[-79.886222493365224,43.287965717544289],[-79.886211539678555,43.287951293671604],[-79.886197352168963,43.28793845912157],[-79.886182167240193,43.287926245173651],[-79.88616485765499,43.287915631348206],[-79.886146535864114,43.287906448387496],[-79.886130268093439,43.287899536560502],[-79.886113987182469,43.287893344965688],[-79.886097568247052,43.28788796243213],[-79.886080288274087,43.287882481464983],[-79.886062855488376,43.287878619822536],[-79.886044438424122,43.28787465854559],[-79.886026992497975,43.287871517132167],[-79.886008547504616,43.287869086347726],[-79.885990102512778,43.287866655560322],[-79.885971631231087,43.287865665238868],[-79.885875010695088,43.28787147748691],[-79.885100607934007,43.287922460774404],[-79.884976119962303,43.287935564416642],[-79.884942105451401,43.287941986203236],[-79.884909050541708,43.287949858060323],[-79.884875980820183,43.287958540171182],[-79.88484399229209,43.287968763584466],[-79.884812003753439,43.287978986988669],[-79.884780974809942,43.287990660465518],[-79.884750916975094,43.288003153810898],[-79.884720832807005,43.288017087616474],[-79.884691857792021,43.288031032229945],[-79.88466384072251,43.288046516947823],[-79.884428515224045,43.288162091185249],[-79.884322814119841,43.288212836202227],[-79.884285540623665,43.28822895089521],[-79.884247294344874,43.288244335723697],[-79.884207980022168,43.288257458987275],[-79.884167692920244,43.288269852384403],[-79.884126462667226,43.28827989538766],[-79.884084149566007,43.288288487086099],[-79.884041986031747,43.288295639503374],[-79.883998742947128,43.288301160555925],[-79.883955526194384,43.288305241124235],[-79.883912335776586,43.288307881208361],[-79.883866135116136,43.288306619952266],[-79.88381994598285,43.288304728472895],[-79.883772662499808,43.288302015886877],[-79.883726488192622,43.288299314106737],[-79.883680341882368,43.288295081811114],[-79.883634195578878,43.288290849496946],[-79.8835880756302,43.28828517669659],[-79.883543064861286,43.288279514704918],[-79.883496972927432,43.288272311371188],[-79.883485174711694,43.288270395291413],[-79.88296528420473,43.288201206676],[-79.882064608909502,43.288072916514544],[-79.881793001886081,43.288035774036203],[-79.88175110053794,43.288028610969391],[-79.88170904791771,43.288022977178272],[-79.881666996955133,43.288017253342602],[-79.881625067591685,43.288011620725797],[-79.88158298860067,43.288007427355289],[-79.88154090796597,43.288003323998531],[-79.881497829864145,43.287999841188778],[-79.881455859282553,43.28799645923938],[-79.881413739066346,43.287994516535967],[-79.881370631278884,43.287992654203372],[-79.881119569952148,43.287977862215264],[-79.88107918338099,43.287975486121837],[-79.880056576710629,43.287949719407123],[-79.878261401749882,43.287935188510822],[-79.878203444068873,43.287936511016099],[-79.87765408585696,43.28794868031278],[-79.877617085627321,43.28794984799331],[-79.877580085396517,43.287951015661854],[-79.877543071919348,43.287952903550782],[-79.877507044362488,43.28795480110383],[-79.87747003088127,43.287956688969068],[-79.877433004151527,43.287959297054627],[-79.877395962516076,43.28796271538954],[-79.877359908455105,43.287966053360769],[-79.877351403117387,43.287967003595604],[-79.877322853564181,43.287970191904236],[-79.877286907831362,43.287974341323419],[-79.877065886911254,43.287904732097623],[-79.876896228857262,43.287784670187825],[-79.876825050851934,43.287734312143705],[-79.876718111908616,43.287658652194381],[-79.876690347545747,43.287639007166767],[-79.876048491844728,43.287184844018441],[-79.875818755541289,43.28702228571035],[-79.875546481942564,43.28682962620865],[-79.875122301076814,43.286529474391109],[-79.874893664770013,43.28636768861552],[-79.874882518801073,43.286377765797056],[-79.874867100938232,43.286391706218687],[-79.874848308371227,43.286408179730955],[-79.874841655445152,43.286411355913756],[-79.874835002518381,43.286414532096167],[-79.874822175565498,43.286424927703372],[-79.874781322256126,43.286458036154571],[-79.874746096368057,43.286483352507069],[-79.874624239545497,43.286587776713766],[-79.87454723303027,43.286646268797213],[-79.874469089006766,43.286706280404239],[-79.874407792007347,43.286741695296861],[-79.874312506587273,43.286782088313316],[-79.874263885399586,43.286801869956939],[-79.874215264180691,43.286821651579473],[-79.8741182292286,43.286849961141613],[-79.874014950571109,43.286875958020623],[-79.873915695826227,43.28691099895466],[-79.873815400248091,43.286949001048562],[-79.873765752009902,43.286967646800235],[-79.873716103741714,43.286986292529953],[-79.87361181053916,43.287013809823165],[-79.873509585710337,43.287042788117716],[-79.873406567636209,43.287061313252245],[-79.873303260339469,43.287095503326782],[-79.873201033570268,43.287124571370896],[-79.873149463639393,43.287133788187901],[-79.873097893693398,43.287143004981473],[-79.872993653376071,43.287174304132975],[-79.872889263115383,43.287207042436258],[-79.872787079196925,43.287233769353819],[-79.872683811177481,43.28726579816685],[-79.87258057280188,43.287289543011404],[-79.872473390706602,43.287313248884217],[-79.872375231735674,43.287342266244202],[-79.872273019096525,43.287370523187988],[-79.872162757298867,43.28738744500594],[-79.87205493655587,43.287385661370237],[-79.871950766852649,43.287413088317315],[-79.871898432750669,43.287463627820891],[-79.871801159437453,43.287504719491068],[-79.871694937539985,43.28752312143191],[-79.871636974313276,43.287521424037244],[-79.871579011090404,43.28751972661324],[-79.871519639644319,43.287504193313467],[-79.871417342682648,43.287483644111873],[-79.871303596257221,43.287469014864286],[-79.871193875151519,43.287456676363796],[-79.871092549310561,43.287436946863757],[-79.870979995471785,43.287417826801146],[-79.870870441075439,43.287396485107031],[-79.870768256119831,43.287369903396154],[-79.870662865381178,43.287343379984947],[-79.870573920421691,43.287320710735358],[-79.870524374377467,43.287307119871876],[-79.870474828355697,43.287293528987171],[-79.87037462889829,43.287266246170496],[-79.870269460068528,43.287234411916195],[-79.87016727398931,43.287207919702382],[-79.870053765066075,43.287180505126585],[-79.869957896207211,43.287139037572409],[-79.869862122380226,43.287099101646731],[-79.869770415538852,43.287059205830481],[-79.869681874796683,43.287014748920285],[-79.869580995381384,43.286970980399268],[-79.869484154614881,43.286928782478967],[-79.869386218018477,43.286892516633387],[-79.869281063705358,43.286859961250606],[-79.869189537742955,43.286810341864076],[-79.869100997790554,43.286765884511027],[-79.869011442041526,43.286723037859822],[-79.868932395389308,43.286665167456015],[-79.86885338892823,43.286605136307529],[-79.868781572085069,43.286542925081235],[-79.868720260799989,43.286472533553869],[-79.868660853028913,43.286405852679202],[-79.86859518509786,43.286344422519285],[-79.868541254937355,43.28632137769317],[-79.868508086244447,43.286335321741717],[-79.868474917536489,43.286349265780423],[-79.8683917987602,43.286404721748234],[-79.868314053026239,43.286442942121937],[-79.868311942977215,43.286443731651403],[-79.868260067458735,43.286469421530136],[-79.868175894280995,43.286521895411092],[-79.868115132062627,43.28658810771072],[-79.868060434740613,43.286659602628049],[-79.868024072950931,43.286732719714855],[-79.867979575723282,43.286805846313399],[-79.867985291797993,43.286829944981974],[-79.868008577750828,43.286850435644276],[-79.868008785597468,43.286892398807765],[-79.868015594950151,43.286970535469941],[-79.868014175752123,43.287047059920681],[-79.86799324316911,43.28712564237096],[-79.867974227243479,43.287207215281185],[-79.867953336293709,43.287283547001827],[-79.867919941409241,43.287362816492426],[-79.867877428431086,43.287441905671777],[-79.867821579146963,43.287515640192552],[-79.867758568495958,43.287590024153175],[-79.867697791380593,43.287656956431903],[-79.867633904751671,43.287725388661016],[-79.86755474035121,43.287780162792586],[-79.867466568000168,43.287828814637827],[-79.867374108462002,43.287882646584968],[-79.867275028821155,43.287907958585812],[-79.867179215498481,43.287870181114236],[-79.867153084060718,43.287836965718412],[-79.867104247750049,43.287811719541061],[-79.867051787381243,43.287815702158831],[-79.866990832214469,43.287839050380803],[-79.866940218303839,43.28784980463449],[-79.866830013000367,43.287810443567906],[-79.866720345309105,43.287801883206484],[-79.866664469602512,43.287823840860334],[-79.866641236839854,43.287853595718545],[-79.866638539477421,43.287892648638753],[-79.866647016810248,43.287933973378799],[-79.866599561423754,43.288000316713521],[-79.866556079706044,43.288018615231792],[-79.866460914287273,43.288052159435757],[-79.866406310676709,43.28811843184301],[-79.866355705317375,43.288188435709365],[-79.866292718940997,43.288261378366848],[-79.866232870287391,43.288331290553451],[-79.866176930026739,43.28829696903442],[-79.86616908784643,43.288304410071405],[-79.866161245664216,43.288311851107828],[-79.866089253380707,43.288371917942804],[-79.866020271722292,43.288435796482489],[-79.865947350100527,43.28849279247337],[-79.86587016621381,43.288553618098454],[-79.865783976095656,43.288608231279895],[-79.865695495535633,43.288666693626219],[-79.865479031739412,43.288819874691249],[-79.86543891820638,43.288875755064019],[-79.865386394461638,43.288942767966603],[-79.865330624467944,43.289011999770175],[-79.865274854346652,43.289081231544323],[-79.865212864449262,43.289160126466136],[-79.865150918547656,43.289230017264494],[-79.865092164055071,43.289293996709837],[-79.865039626169946,43.289361729669125],[-79.864981676553995,43.289435441929804],[-79.864927070082715,43.289501713583114],[-79.864858904419876,43.289574604029511],[-79.864803229691333,43.289645277236346],[-79.864740337065854,43.28971299732283],[-79.864678403451791,43.289782167617297],[-79.86461448440059,43.289852038529553],[-79.864554700916287,43.289918258606612],[-79.864492865706495,43.289982117105467],[-79.864433053484376,43.29004986760085],[-79.864369301388621,43.290110735506182],[-79.864299193347591,43.290175322161666],[-79.864223213727442,43.290230845942226],[-79.864183620480077,43.290261968586073],[-79.86414402719231,43.290293091215581],[-79.864050727531691,43.290338717984739],[-79.863969529312172,43.290396440894035],[-79.863888346022492,43.29045335348615],[-79.863810339238114,43.290505164997654],[-79.863727129214283,43.290558365485644],[-79.863641836488483,43.290617488204539],[-79.863563787375,43.290671550255958],[-79.863484659093515,43.290723980715697],[-79.863396353510424,43.290779381456282],[-79.863313058912965,43.290837083060218],[-79.863225794314829,43.29088952252107],[-79.863140527474613,43.290947204395223],[-79.863061520041853,43.290999725805214],[-79.862981321072013,43.291056647530205],[-79.862937667525642,43.291083992495082],[-79.862894013940263,43.291111337442736],[-79.862815923272862,43.291167559649558],[-79.862738845274492,43.291222351148356],[-79.862694219791592,43.291248920970425],[-79.862649594269968,43.291275490774524],[-79.862563384922609,43.291324158319107],[-79.862481337294128,43.291374397958293],[-79.862388078381926,43.29141768258841],[-79.862297814911315,43.291465589244602],[-79.862214573730952,43.291520319078472],[-79.862131389473547,43.291571987880232],[-79.862042150862038,43.291624406789396],[-79.862009922662736,43.291640564399927],[-79.861964821446875,43.291692611995011],[-79.861872532553392,43.291736716260026],[-79.861784292891727,43.291788424544876],[-79.8617000513985,43.291843864406673],[-79.86161385561077,43.291891720956755],[-79.861534874197602,43.291942710790714],[-79.861476099844666,43.292007408504276],[-79.861474791382335,43.292024684157866],[-79.861455178817721,43.292031962673029],[-79.86142946201025,43.292029455535555],[-79.861412252033119,43.292020279689098],[-79.861390725658055,43.292017814259147],[-79.861329513245209,43.292048000312576],[-79.861256791226765,43.292093829648365],[-79.86118275154422,43.292150811422012],[-79.860895555448536,43.292347581612063],[-79.860931039876164,43.292374948577965],[-79.860908110083997,43.292388226989225],[-79.860891605437345,43.292394095637313],[-79.860843866749988,43.292362824707958],[-79.860759721091384,43.292413042202675],[-79.860735436086472,43.292393260493675],[-79.860286487132768,43.292670178830861],[-79.859506997273257,43.293153875184039],[-79.859520079876333,43.293172825083388],[-79.859436044756123,43.293217009669469],[-79.859348970328796,43.293258912752236],[-79.859329360079897,43.293259437535056],[-79.85853436454731,43.293747474803226],[-79.858378939369459,43.293848349882211],[-79.858223513678666,43.293949224742413],[-79.858269438245372,43.293965441104845],[-79.85824885505626,43.29399311451197],[-79.858246170388,43.293996724635583],[-79.858212163316196,43.294002418168809],[-79.858184670038654,43.294048697046208],[-79.858200515051408,43.294078119910694],[-79.858177290048161,43.294166402443018],[-79.858112305256171,43.294233287522971],[-79.858040747884615,43.294269311495199],[-79.857975941686007,43.294333226789064],[-79.85792426776122,43.294400244671053],[-79.857854313337029,43.294462577717873],[-79.857790437147131,43.294529473681514],[-79.857788667286314,43.294564753707505],[-79.857768505782147,43.294601290778999],[-79.857703604338823,43.294663674195256],[-79.857645932561454,43.294728380913703],[-79.857573952959072,43.294786911660537],[-79.857549260173045,43.29478891613654],[-79.85751294659336,43.294805842064733],[-79.857475773390746,43.294816006007657],[-79.857427470096255,43.294821466446244],[-79.857372132546033,43.294814160222387],[-79.857335562851475,43.294792093984725],[-79.857311165087054,43.294778343455192],[-79.857279089085793,43.294786217086539],[-79.857250962591792,43.294807006627416],[-79.857238995486455,43.294817377316647],[-79.857227028377039,43.294827748004586],[-79.857206869648522,43.294857531616309],[-79.857189507459296,43.294909134093984],[-79.857154108729276,43.294989100653304],[-79.857115657225023,43.295067505927321],[-79.857053793806585,43.295132170455219],[-79.856972611267651,43.295188357721337],[-79.856883433789832,43.295236991274571],[-79.856797298605358,43.295281152909944],[-79.856712046553795,43.295337389357115],[-79.85662079177601,43.295378438146486],[-79.856529629763443,43.295421108602582],[-79.856444518996511,43.295469782469183],[-79.856364434538307,43.295519947253979],[-79.856029269555847,43.295755214944059],[-79.856067640955899,43.295786394175245],[-79.855963619034469,43.295857389813101],[-79.855921014765372,43.295828419333439],[-79.855068633359664,43.296414997836173],[-79.854665549727272,43.296661882610472],[-79.854494950803797,43.29676637237781],[-79.854506008203501,43.296781520659543],[-79.85380019565396,43.297111398138625],[-79.852891167024126,43.297535221283603],[-79.851858944070642,43.298012637959687],[-79.851426896478543,43.298205993899934],[-79.850994846169542,43.298399348170442],[-79.851347077394422,43.298844107174446],[-79.851332482483443,43.298859718481324],[-79.851318074483316,43.298858853414188],[-79.851298485649906,43.298864689691413],[-79.851314555649836,43.298882049702819],[-79.851313130560385,43.298905357065053],[-79.851252231747466,43.298918252167738],[-79.851146743086588,43.298902875410576],[-79.851154880549373,43.298850460870959],[-79.850685394727606,43.298301691550265],[-79.850636691269472,43.29832821564117],[-79.850749965773545,43.298473426071901],[-79.85072183536235,43.298494213949255],[-79.850709241375469,43.29850831451779],[-79.850696703346344,43.298519444159481],[-79.850628118065671,43.298560805980564],[-79.849873824747021,43.298915107129254],[-79.849742991723772,43.298976559994522],[-79.849749928721536,43.298987885396173],[-79.848696888686362,43.299474788846467],[-79.848014850499453,43.299795865196849],[-79.8479806420995,43.299811998874766],[-79.847886428425696,43.299852380526069],[-79.847792121969334,43.299891140353566],[-79.847589962417487,43.2999874327379],[-79.847557777851605,43.300007368573262],[-79.84757514838509,43.300066793250615],[-79.847677844565794,43.300125636926566],[-79.847722809504916,43.300081787791854],[-79.847797015816212,43.300121614950463],[-79.847751952281939,43.300170685733789],[-79.848070194309742,43.300344977100657],[-79.848199820432058,43.300335747348221],[-79.848284566837165,43.300254839878612],[-79.848329366221193,43.30027852262765],[-79.848248645066576,43.300361721792456],[-79.848318401962487,43.300421763940207],[-79.84833060564597,43.300487169488669],[-79.848510551444988,43.300588030901096],[-79.848400755962956,43.300689666810193],[-79.847965533147629,43.300448915434465],[-79.847708930527858,43.300653434020219],[-79.847592344589629,43.300572749565646],[-79.847840504934794,43.300377871057037],[-79.847352522354072,43.300104349699126],[-79.846636482705719,43.300440195458243],[-79.846481791556556,43.300512749642706],[-79.846411815570093,43.300516546104298],[-79.846331566075449,43.300522490018793],[-79.846301872989883,43.300521470134754],[-79.846218355297012,43.300478576588112],[-79.846177577322635,43.300463938088285],[-79.846167615413847,43.300449610469727],[-79.846178258381769,43.300427926941282],[-79.846137477831974,43.300354759121504],[-79.846093783318054,43.300279220715446],[-79.846006196696223,43.300236376005181],[-79.845932303089015,43.300180072598003],[-79.84585320359777,43.300125247374162],[-79.84576984175763,43.300074160971434],[-79.845682452167509,43.300027446063673],[-79.845571430015696,43.300030827731419],[-79.845524772711244,43.300053273236131],[-79.845478115372714,43.300075718721345],[-79.845382621627778,43.300124999842879],[-79.84530351725634,43.300181199733743],[-79.845225426113586,43.300235969078855],[-79.844829677260634,43.299975344188617],[-79.844399712129146,43.300323707040981],[-79.845170288699023,43.300833663501848],[-79.845288576874609,43.3009119444935],[-79.845272372965937,43.300953831924097],[-79.845334987141186,43.300961217466316],[-79.845371163753569,43.30105612998296],[-79.845391869641176,43.301102081896524],[-79.845338686084474,43.301143596004088],[-79.845258484573748,43.30119906441552],[-79.845178435153969,43.301253003540182],[-79.84510038511533,43.30130552207735],[-79.8450140198767,43.301360928073905],[-79.844925740178965,43.301413253138463],[-79.844840345417254,43.301469479208983],[-79.844760295274028,43.301523418030179],[-79.844677096325753,43.301574353500648],[-79.844595864890351,43.30163206216335],[-79.844528970237889,43.301694417863821],[-79.844463047940096,43.301757503708743],[-79.844391975582369,43.30181909675747],[-79.844325136795248,43.301878481415031],[-79.844274508204109,43.301947754703306],[-79.84423421131082,43.302011819720278],[-79.84417440738261,43.302077308394402],[-79.844097271625699,43.302133527322454],[-79.844052608773708,43.302161214983947],[-79.844007945881273,43.302188902627407],[-79.843931681665126,43.3022511632673],[-79.843852629483607,43.302304391171027],[-79.843767400117059,43.302358276930484],[-79.843690347245428,43.302410084212831],[-79.843597029280502,43.302454883564366],[-79.843490611554685,43.302488294748102],[-79.843382267136519,43.302512771892012],[-79.843289063163425,43.302551539128231],[-79.843194734292936,43.302591105315152],[-79.843090367288426,43.302626878037501],[-79.84298997549034,43.302661070069199],[-79.842885794381843,43.302687029579225],[-79.842786567083479,43.302659822520553],[-79.842759103214661,43.302645227475573],[-79.842735345454415,43.302656242706313],[-79.842659477321035,43.302697526012253],[-79.842610447043583,43.30271166216027],[-79.842561416743806,43.302725798286986],[-79.842445544160626,43.302763615059732],[-79.842393424376368,43.302778125047283],[-79.842341304567739,43.302792635010761],[-79.842235957166778,43.302821553607075],[-79.842126375807283,43.302852680366485],[-79.842026118344009,43.302886242594376],[-79.84193199687644,43.302921307585528],[-79.841831603962731,43.302955498585646],[-79.841726141519615,43.302990448560593],[-79.841629895084864,43.303027022546281],[-79.841530553127114,43.303064285455307],[-79.841428300297338,43.30309251429064],[-79.841321907666583,43.303124482983549],[-79.841221736542096,43.303153453083411],[-79.84112249333073,43.303185494027382],[-79.841020098150423,43.303221194788541],[-79.840909614845643,43.303247808988274],[-79.840806517265278,43.303268554970323],[-79.840695117775155,43.303291467831642],[-79.840587887057509,43.303309110190725],[-79.840485818208379,43.303327615187079],[-79.840373418646735,43.303351237955248],[-79.840270199160514,43.303371892171825],[-79.840177046713279,43.303407775944116],[-79.840089901881356,43.303451914662425],[-79.839985461442538,43.303491375640746],[-79.839888090070616,43.303528657104614],[-79.839783579169691,43.303571809027318],[-79.839679985811969,43.303612088723334],[-79.839578856083847,43.30363951688922],[-79.839475192256984,43.303683487528204],[-79.839382992439511,43.303727574410324],[-79.839299628443555,43.303786788402341],[-79.839228563950513,43.303847567885434],[-79.839162519076936,43.303916682410609],[-79.839095600963063,43.303979845064262],[-79.839079693507259,43.30400588668217],[-79.839073972993063,43.304034372872529],[-79.839078622672019,43.304062153922807],[-79.839087260132544,43.304068274612113],[-79.839095897594802,43.304074395300773],[-79.839115203115824,43.304083595758286],[-79.839045947565566,43.304159430996357],[-79.838976691841978,43.304235266189522],[-79.839615878262023,43.304337741103552],[-79.839654445339505,43.304306616658025],[-79.839706649155218,43.304316961190601],[-79.839741374068467,43.304332260942374],[-79.839752177406183,43.3043541614242],[-79.839645853641485,43.304382347356466],[-79.839530811897163,43.304382710879409],[-79.839426674440588,43.304399663169953],[-79.839330354194288,43.304439926301285],[-79.839315275292506,43.304474260495788],[-79.839304814169125,43.304486220355201],[-79.839200863213946,43.304493359430502],[-79.839088889361562,43.304494474006212],[-79.838975147164462,43.304478371931552],[-79.838869465466047,43.304472796794997],[-79.838758279023267,43.30448436425759],[-79.838674999078663,43.304539076389489],[-79.838639642332083,43.304615255585666],[-79.838666878750431,43.304693601141722],[-79.838698407627419,43.304766677623277],[-79.838733903458603,43.304845107027617],[-79.838726269289495,43.30492228809036],[-79.838679656952877,43.30499385075823],[-79.838646681209298,43.305003240766865],[-79.838598457589725,43.304997528462614],[-79.838492732178253,43.304994203657316],[-79.838401478297669,43.305033797093458],[-79.83832251681622,43.305030023599407],[-79.838220049989104,43.305010973772383],[-79.838165753542398,43.305003668832057],[-79.838111457109235,43.304996363866096],[-79.83800561854747,43.30499898042823],[-79.837900707848348,43.30500466784904],[-79.837789647202428,43.305009572318369],[-79.837774910354256,43.305025900789268],[-79.837845077121855,43.305064162558466],[-79.837848416232575,43.305050689744995],[-79.837854708528752,43.305044000311916],[-79.837873170336493,43.305045718672901],[-79.837979096448478,43.30503851083013],[-79.838082535707954,43.305058291111997],[-79.838084015714273,43.305090632288241],[-79.838080376550025,43.305119859927878],[-79.838077895056657,43.305140094832801],[-79.837979519946103,43.30512630896758],[-79.83787299877639,43.305106497276569],[-79.837781245418938,43.305068736522131],[-79.837703213701701,43.305016167681131],[-79.837622920317855,43.304965826924295],[-79.837553619638996,43.304940360205741],[-79.837450252823814,43.304916798293512],[-79.837343045820845,43.304932997121249],[-79.837245879639724,43.304965776158731],[-79.837143479254067,43.305001473377565],[-79.837050279603076,43.305039605230817],[-79.8369681360236,43.305092796902137],[-79.836897124337398,43.305150603971185],[-79.83683828363462,43.305216728869581],[-79.836795873901991,43.305287613144806],[-79.836793371791771,43.305367097389691],[-79.836786649175508,43.305448069471893],[-79.836749980195989,43.305482994134849],[-79.836715878983398,43.305493182542399],[-79.836681951172721,43.305494278163636],[-79.836656481888483,43.305485014600265],[-79.836640228966957,43.305477375545046],[-79.836607543199051,43.305465067080767],[-79.836576681796259,43.305467004267811],[-79.836565055553223,43.305481833459723],[-79.836579204433747,43.305548070384035],[-79.83661685200093,43.305623460792809],[-79.836657581518821,43.305698882537705],[-79.836680734039504,43.305777907368373],[-79.83666488001856,43.305801067745726],[-79.836610793324638,43.305831222897879],[-79.836507676241979,43.305852685148061],[-79.836419102395809,43.305809823088843],[-79.836429823194564,43.305732583553798],[-79.836487598308096,43.305664196908275],[-79.836440771919243,43.305591684557804],[-79.836419549226108,43.305514930434356],[-79.836387094926096,43.305438782392862],[-79.836283107320185,43.305454202574147],[-79.836191878831528,43.305492353780039],[-79.836105837636552,43.30553650066912],[-79.836011386191061,43.305582002616653],[-79.835963840673088,43.305650583183791],[-79.835891854937913,43.305707659347533],[-79.835781802698932,43.305717794734981],[-79.835676675791234,43.305734733529604],[-79.835566285369723,43.305756120884531],[-79.835467150186702,43.305782124984816],[-79.835410260756603,43.305804056940232],[-79.835438602575138,43.305934100297151],[-79.835290313544519,43.305951409630325],[-79.835275169968824,43.305879219456628],[-79.835247247503233,43.305888659944557],[-79.835224272202794,43.305910216831933],[-79.835186617576625,43.305945040906025],[-79.835116726444838,43.306002137910532],[-79.835036394108059,43.306063630763951],[-79.834960354417532,43.306119854637004],[-79.834960811000656,43.306147593128621],[-79.834977886201344,43.306170278302275],[-79.834976381621274,43.306249052294383],[-79.834996507003893,43.306325075137025],[-79.835002181663356,43.306402391494302],[-79.835005882201486,43.30647977778613],[-79.835015595760993,43.306558666046207],[-79.83499878564588,43.306580195640613],[-79.834981380175179,43.306574795733773],[-79.834960279743498,43.306549818434767],[-79.834952516674278,43.306530199603998],[-79.834942677368844,43.306503085892956],[-79.834921963891233,43.306457852418895],[-79.834900893627562,43.306379658860735],[-79.834880868088675,43.30629841441305],[-79.834824603716626,43.306229497103232],[-79.834754908796882,43.306166565983681],[-79.834680204459843,43.306101242610936],[-79.834599025771709,43.306045668114152],[-79.834522997253373,43.305991586761756],[-79.83444699639449,43.305936064921347],[-79.834340146430094,43.305933445173714],[-79.834323506582223,43.305946061957506],[-79.834229319283523,43.305984091389604],[-79.834227813746637,43.306062865363309],[-79.834188315977983,43.306136029461918],[-79.834093171353672,43.306172518257753],[-79.833987841869458,43.306199988688711],[-79.833883501944371,43.306175693275279],[-79.833829275975333,43.306109857787526],[-79.833772011280942,43.306041740163799],[-79.833681719432207,43.306088813359445],[-79.833585478884814,43.306124570197142],[-79.833506246418438,43.306180040178738],[-79.833509888234346,43.306260397403172],[-79.833520738575601,43.306337766621304],[-79.83344053333947,43.306392506273873],[-79.833385705008752,43.306358180160082],[-79.833264550429661,43.30640718932554],[-79.833246847703592,43.306475352829111],[-79.833230252257692,43.306485628736993],[-79.833129062296948,43.306509358718102],[-79.833040906291572,43.306554292115685],[-79.832982116905953,43.306617444047717],[-79.832893919293895,43.306664537984446],[-79.832817738117058,43.306721569383697],[-79.832727558239952,43.306762699995943],[-79.832638317152302,43.306812754566216],[-79.832574837121925,43.306850375694651],[-79.832528420600497,43.306859716778789],[-79.832495801363237,43.306850379303569],[-79.832450506690179,43.306801112564472],[-79.832177470015878,43.306945368238168],[-79.832256062436528,43.307026490794442],[-79.83222495537413,43.307041210675152],[-79.832177594381221,43.306990391967425],[-79.832161672591823,43.306965467034573],[-79.832064471153885,43.306999772053089],[-79.83201826827441,43.307023702388022],[-79.831972065358855,43.307047632703778],[-79.831882598240668,43.307102997022028],[-79.831800447416654,43.307156184878544],[-79.831771791011562,43.307203886106151],[-79.831733192678101,43.307233116607343],[-79.831694594307606,43.307262347094934],[-79.831641107448434,43.307267428503032],[-79.831587620580876,43.307272509885991],[-79.831475733963714,43.307262362275388],[-79.831372330285674,43.307247078630695],[-79.831267999508029,43.307273746347704],[-79.83117162458926,43.307316343182194],[-79.831123415441169,43.307309817469552],[-79.831028263686051,43.307288584841885],[-79.830924875614656,43.307272490547987],[-79.830816257431962,43.307252650851808],[-79.830702514194783,43.307236450495346],[-79.830597058208397,43.307218894044091],[-79.830493517754462,43.307204328565646],[-79.830436624640797,43.307197353582644],[-79.830379731540717,43.307190378571484],[-79.830271236969296,43.30717053962185],[-79.830162483468214,43.307164204657539],[-79.830070148488488,43.307208282605551],[-79.829963512445318,43.307194405340063],[-79.829857581797029,43.307201605701458],[-79.829751507760591,43.307216278225035],[-79.829641285437987,43.307228657076763],[-79.829536031922103,43.307200566464743],[-79.829512594223871,43.307188260577867],[-79.82945987696975,43.307153233834377],[-79.829407727616683,43.307082194914578],[-79.829370313370077,43.307001491899378],[-79.829339896796014,43.306980200096817],[-79.829295899674179,43.30696624299997],[-79.829257959853834,43.306964323866239],[-79.829149819775168,43.306977443919649],[-79.829044688978897,43.306994376567609],[-79.828937462422545,43.307011287659364],[-79.828911691232577,43.307017777142036],[-79.828814544988433,43.307049108477884],[-79.828714022295898,43.307089319597459],[-79.828613636580783,43.307128811671916],[-79.828515223168836,43.307168323860381],[-79.828424096811347,43.307207190252861],[-79.828319591930835,43.307242857985166],[-79.828287367903641,43.307264318717486],[-79.828261993000027,43.307301517426232],[-79.828244781181766,43.307395167874908],[-79.828257705157142,43.307473369218748],[-79.828257120978506,43.307555124005326],[-79.828245346177653,43.307635323419227],[-79.828264283151512,43.307715027083745],[-79.828291703403153,43.307789595052448],[-79.828314859617933,43.30786790121482],[-79.828323594029115,43.307945969578554],[-79.828332254094761,43.308027909109448],[-79.828338014288846,43.308106757403863],[-79.828312774385353,43.308188259588604],[-79.828239678161808,43.308251262482635],[-79.828148296991898,43.308296879401951],[-79.828044114019832,43.308322104964404],[-79.827931909547573,43.308328428843524],[-79.827815817213548,43.308331741283382],[-79.827702813351635,43.308328331896377],[-79.827627096126747,43.308309546771092],[-79.827574437858459,43.308271458243411],[-79.827557724827372,43.308230046350538],[-79.827523264546073,43.30815612639833],[-79.827509426115057,43.308074223765942],[-79.827531477369476,43.307991878665057],[-79.827571954976875,43.307919537349896],[-79.82755587563652,43.30790289429698],[-79.827516926172223,43.307895741630759],[-79.827455402925082,43.307889077876538],[-79.827349427550772,43.307898526575116],[-79.827241328715857,43.307909394119122],[-79.827136922364204,43.307939839170196],[-79.827039616210044,43.307979361435294],[-79.82694204293891,43.308026354603435],[-79.826853939136868,43.308068222219333],[-79.826759641834101,43.308111556994042],[-79.826658057088011,43.308155537284982],[-79.826562535686506,43.30820480230026],[-79.826471160583552,43.30825645094766],[-79.826374609332561,43.308307956359528],[-79.826289226367379,43.308368580794451],[-79.826202934699552,43.308418750631716],[-79.82612156072085,43.308482477611662],[-79.826048418583881,43.308547729748987],[-79.825968089430049,43.308608405816742],[-79.82588383572579,43.308661567812031],[-79.825797399454174,43.308719209580261],[-79.825708860536082,43.308783583058897],[-79.82562055198494,43.308835982864821],[-79.825532250023727,43.308881629303805],[-79.825444144029106,43.308923495801878],[-79.825365793379589,43.308990224767093],[-79.825314007194976,43.309066951375556],[-79.825285795262204,43.309142479385159],[-79.825220845204527,43.30920484364691],[-79.825118704854887,43.309226305633359],[-79.82500572222996,43.30922811639978],[-79.82495000728926,43.30923992514716],[-79.824894292327528,43.309251733867107],[-79.824864910299567,43.309279165787061],[-79.824828531657403,43.309356140528841],[-79.82475350815362,43.309410116884692],[-79.824675471059692,43.30940931494176],[-79.824604789777894,43.309449108734348],[-79.824519604737432,43.309499288661392],[-79.824418232998823,43.309532013528013],[-79.824310697070757,43.309564674936922],[-79.82419545834577,43.309574745836485],[-79.824089292131617,43.309593914389197],[-79.823984650485571,43.309636330094563],[-79.823883075116882,43.309679587640147],[-79.823780586272633,43.30971905381611],[-79.823769687090802,43.309702373467417],[-79.823735741160931,43.309704275460113],[-79.823632272880303,43.309736978064777],[-79.82352875410929,43.309778684542025],[-79.82342318282177,43.309818118687872],[-79.823320851515902,43.309849391988756],[-79.823212458484164,43.309875290178731],[-79.823114167497053,43.309908045584883],[-79.823011794189128,43.309941479252586],[-79.822961720549372,43.309954830824751],[-79.822911646888102,43.309968182374718],[-79.822807278356748,43.309996372721834],[-79.822704019273218,43.310024574394113],[-79.822617692796086,43.310076271908635],[-79.822592050014777,43.310076007918845],[-79.822505969465382,43.310063866079759],[-79.822403609478926,43.310096578979575],[-79.822303127882407,43.310140566736649],[-79.822211828182034,43.31018158743862],[-79.82210344801878,43.310206764348059],[-79.822075956288799,43.310193694830865],[-79.821885021183306,43.310292308226799],[-79.821934407667399,43.310340090501249],[-79.82159034848452,43.310545900175889],[-79.821581667517975,43.310567601580964],[-79.821600676424424,43.310598502735985],[-79.821627662018187,43.310688825626457],[-79.821527540737307,43.310714087081045],[-79.821477509228828,43.310642256014219],[-79.821208293186274,43.310746094579784],[-79.821208983373765,43.31076780250006],[-79.821178871975434,43.310781809263787],[-79.821072789780359,43.310796473631555],[-79.820981472618087,43.310838303567628],[-79.820878096411803,43.310872445335661],[-79.820211872813957,43.311101221950629],[-79.820239981237435,43.311139780963202],[-79.820221270840918,43.311150843556682],[-79.820189165947525,43.311159516848782],[-79.820074996981248,43.311165092381678],[-79.819965005740499,43.311171431265059],[-79.819847768555846,43.311176254554404],[-79.819732591026579,43.31117659673771],[-79.819620620643107,43.311176881861208],[-79.81951553763443,43.311190834735676],[-79.81941936806372,43.311222078087717],[-79.819312203036858,43.311235288924145],[-79.819198925541883,43.311252128388716],[-79.819090544028057,43.311277212374605],[-79.818986389481424,43.311294145828377],[-79.818882118058852,43.311317110983524],[-79.818781994655907,43.311342370006336],[-79.818677825966944,43.311360023391103],[-79.818575519364245,43.311389761923081],[-79.818475397464425,43.311414930647466],[-79.818363989067237,43.311437101237864],[-79.818258542488067,43.311469778522287],[-79.818163256945681,43.311506252549158],[-79.818090188200628,43.311567088108184],[-79.818040474466429,43.311587194599149],[-79.817990760699772,43.311607301068051],[-79.817968373949711,43.311598065210362],[-79.817940336325137,43.311613173088944],[-79.817912298686736,43.311628280960448],[-79.817899694415374,43.311642377763953],[-79.817878683416666,43.311663951437019],[-79.817773815836105,43.311717614699731],[-79.817577248080951,43.311578264224266],[-79.81755324998872,43.31159489951164],[-79.817529251883386,43.311611534793776],[-79.81759195713822,43.311665489639459],[-79.817551322011184,43.311694334080954],[-79.817521399603663,43.311698526946323],[-79.817451096207947,43.311724813475813],[-79.817344713673108,43.31174847575501],[-79.817246496238411,43.311783477979191],[-79.817203921904721,43.311855073528903],[-79.81716051415161,43.311925129680262],[-79.817103259107625,43.311908059301608],[-79.817073074623195,43.311925756060752],[-79.817047718872942,43.311961511720902],[-79.81699909309954,43.311982709547941],[-79.816906682083555,43.312029837544166],[-79.816822489193612,43.312079211561603],[-79.8167402889773,43.312133918776972],[-79.816676241703789,43.312199979315047],[-79.816590046106001,43.312250863199466],[-79.816483156513215,43.312249757104276],[-79.816370261599246,43.312240394679897],[-79.816334254114835,43.312246775376423],[-79.816292742588445,43.312263544291731],[-79.816256106069076,43.312245156130921],[-79.816232208798382,43.312262917741961],[-79.816241246280612,43.312324601933597],[-79.816172769158626,43.312358380294469],[-79.816079400359143,43.312403966941538],[-79.815976134195921,43.312432162443216],[-79.81586488565064,43.312445958079103],[-79.815755550210071,43.312462834939886],[-79.815648565011898,43.312472982674386],[-79.815531382781984,43.31247483062338],[-79.815425713467803,43.312461670173739],[-79.815317777790668,43.312463613676805],[-79.815210589634788,43.312484204096037],[-79.815184489188255,43.312558220663526],[-79.815106399088023,43.312610718157053],[-79.815007025689255,43.312647957592333],[-79.814910559405959,43.312694231544953],[-79.814800903080894,43.312727582364026],[-79.8147097598372,43.312766437591719],[-79.81461851498031,43.312810514291336],[-79.814510186647823,43.312832622995408],[-79.814444866345667,43.312754687447942],[-79.814436882609513,43.312740377607845],[-79.814416402861852,43.312740885663317],[-79.814382367491987,43.312747286187964],[-79.814330767506476,43.31275647608409],[-79.814302618184101,43.312777254729873],[-79.814298229359991,43.312793687425966],[-79.814329367192798,43.312828497403054],[-79.814281841635292,43.312843762519002],[-79.814311860148152,43.312885404300111],[-79.814261144809791,43.312899825934068],[-79.81415789100231,43.312927299558623],[-79.814050679919248,43.312942666051491],[-79.813945263005806,43.312922843536604],[-79.813839569485438,43.312917245132951],[-79.813750165050976,43.312968093584814],[-79.813656793540147,43.313013678216983],[-79.813551795441853,43.313023034196227],[-79.81344958523097,43.313047546528168],[-79.813373517103599,43.313103755645322],[-79.813275142192296,43.313140283571407],[-79.813181931262548,43.313177585359455],[-79.813184736641034,43.313191841548303],[-79.813196671268997,43.313212225474615],[-79.813206524547326,43.313288865792579],[-79.813212031953768,43.3133226897383],[-79.813193377448371,43.31333078027707],[-79.813162877653141,43.313313895527642],[-79.813119419512958,43.313272204018759],[-79.813090115225322,43.313250919462178],[-79.81299335532934,43.313255137827198],[-79.812941366142198,43.31326211695783],[-79.812889376943644,43.313269096064694],[-79.812859803985489,43.313255282377604],[-79.812788986657878,43.313250765377042],[-79.812685338936063,43.313241405262083],[-79.812669796400954,43.313247997261691],[-79.812670495826538,43.313269075002772],[-79.812680276544498,43.313292408098818],[-79.812612103166146,43.313310429633646],[-79.81251282882225,43.313342445324068],[-79.812431697052077,43.313392658277401],[-79.812330254681839,43.313428343131903],[-79.812226349509913,43.31343851964489],[-79.81213163358214,43.313394764639426],[-79.812139420160975,43.313311554090895],[-79.811311972365203,43.313160415921658],[-79.811218732158494,43.313199156519609],[-79.811183116659564,43.313286579970104],[-79.811155654035545,43.313272067421117],[-79.811104659113724,43.313256499833813],[-79.811064560506367,43.313257613741172],[-79.811028398771953,43.313265521921743],[-79.81105201372911,43.313211740556],[-79.811039948177651,43.3131981084044],[-79.810914774942276,43.313192304781936],[-79.810805744126384,43.313193422233738],[-79.810689701673496,43.313193656263508],[-79.810582649109548,43.313200827075107],[-79.810469711325354,43.313193619453521],[-79.810366347211399,43.313176066111424],[-79.809869743003233,43.313082385334667],[-79.809479621465371,43.313010791343764],[-79.809443266878517,43.313085420199151],[-79.809420757634129,43.313076181395886],[-79.809320739912692,43.313045155228338],[-79.809215494747136,43.31301029266406],[-79.809121731297594,43.312974739158157],[-79.809046717609704,43.312919931155051],[-79.808948760860275,43.312884423884682],[-79.808841293882139,43.312862324196082],[-79.808727282733656,43.312859605913722],[-79.808625086783138,43.312883303676543],[-79.808555476424701,43.312867541029796],[-79.808452363238771,43.312837202212719],[-79.808338981970124,43.312802254073304],[-79.808231765203573,43.312767370059795],[-79.80813074108039,43.312731109766219],[-79.808031603450345,43.31269928123961],[-79.807928548892676,43.312665971083128],[-79.807828395260614,43.312635662551472],[-79.807725233478877,43.312601540690885],[-79.807611897085479,43.312564341178373],[-79.807224846018599,43.312443246875752],[-79.80683531736625,43.312814400249223],[-79.806820098438223,43.312804426589913],[-79.806614864227853,43.313001914469254],[-79.806564039916609,43.312971399205082],[-79.806464501863829,43.313067158591736],[-79.80640799499065,43.313119064968951],[-79.806376512175945,43.313152503180902],[-79.806366516646591,43.313190667887135],[-79.806428036870813,43.31325434129775],[-79.806500834615903,43.313315160887932],[-79.806585845078985,43.313382050827485],[-79.806664837517886,43.313441404193178],[-79.806742750458938,43.313499215479652],[-79.806820476808383,43.313572872645302],[-79.80689231895515,43.313632151253152],[-79.806980456551514,43.313696822401184],[-79.80707069905209,43.313754762079235],[-79.807166213234112,43.313814287430532],[-79.807253666156029,43.313857250437088],[-79.807343192271546,43.313907708712328],[-79.807442814212195,43.313958992550901],[-79.807529346413261,43.314004917222384],[-79.80762904084591,43.314052509818836],[-79.807738237496025,43.314093448032054],[-79.807838437461427,43.31412150600233],[-79.807943678338987,43.314150336785488],[-79.808060188111938,43.314183066798932],[-79.808165561172842,43.314205145398319],[-79.808280346604818,43.314225160906133],[-79.808392856591581,43.314248034022647],[-79.808493823559786,43.314287355005369],[-79.808601189127458,43.314314766602955],[-79.808693785240621,43.314365976158761],[-79.808763504310789,43.314426762232131],[-79.808633350293888,43.314511669346928],[-79.808602687622297,43.31450315585105],[-79.808509936736854,43.314466171681914],[-79.808412862136919,43.314435895745198],[-79.808310572612214,43.314413759459697],[-79.808201993579218,43.31439164758492],[-79.8081018283048,43.314368092533243],[-79.807994286894655,43.314349683110322],[-79.807874474577346,43.314328174200135],[-79.807772046306596,43.314306846389499],[-79.807650377692227,43.314279374938998],[-79.807537892534796,43.314248937591287],[-79.807418388705614,43.31421167358674],[-79.807326655254712,43.314173168306063],[-79.807226617458682,43.314136827461006],[-79.807133013746707,43.314093079922763],[-79.807048635776198,43.314044205945947],[-79.806954289088807,43.313981721200349],[-79.806868188911096,43.313920042767563],[-79.806787997975917,43.313865179280008],[-79.806702030259672,43.313796748745936],[-79.806628157341464,43.313740420306935],[-79.806551107231854,43.313682617948409],[-79.806473063853858,43.31363146848458],[-79.80638600131698,43.313562305927356],[-79.806307171129319,43.313494669945122],[-79.806228149015524,43.313436846784562],[-79.806149157014161,43.31337749312226],[-79.806071283669979,43.313311397725457],[-79.806028526597515,43.313240446295595],[-79.806005441279737,43.313159885346352],[-79.805992528986678,43.313082492123208],[-79.805998337178764,43.312999981703058],[-79.806015320457959,43.31291983906992],[-79.806056783156876,43.312849046515872],[-79.806112518887787,43.312779843662213],[-79.806176682080817,43.312708477632412],[-79.806246960205215,43.312633393512648],[-79.806309955349434,43.312564986691612],[-79.806370838617198,43.312497368196439],[-79.806430677308896,43.312432710244195],[-79.806495856004091,43.312359823866956],[-79.806562917270924,43.312291549380731],[-79.806620827017994,43.31222462007743],[-79.806609985022291,43.312198934223382],[-79.806479716081185,43.312132292341616],[-79.806399591193184,43.312080490780929],[-79.806319512257986,43.312026348478874],[-79.806238352090389,43.311970754117752],[-79.806158229382802,43.311918862365033],[-79.806077217557061,43.311855705674795],[-79.805998167789781,43.311799412815319],[-79.805910845718998,43.311743663844076],[-79.805837946403472,43.311688155447854],[-79.805752690513202,43.311633958690884],[-79.805671640565734,43.311579085434545],[-79.805589553493206,43.311520509452272],[-79.805515561045041,43.311464179029578],[-79.805442648316003,43.311409390597952],[-79.805367821363816,43.31135161064573],[-79.805280528730691,43.311294420781209],[-79.805196348350123,43.311235732602384],[-79.805121625913543,43.311172640936555],[-79.805046896770733,43.311103606194358],[-79.804980546001559,43.31102862594738],[-79.804926377327817,43.310961246677891],[-79.804867014989028,43.310894623511395],[-79.804788027571803,43.310835268937453],[-79.804781392332799,43.310808906510573],[-79.804794161747964,43.310786528758761],[-79.804801797367546,43.310761846234001],[-79.804754144391481,43.310676616056469],[-79.804724839289605,43.310598961292904],[-79.804703954767405,43.310513200450892],[-79.804696398928485,43.310426858551423],[-79.804669115704399,43.310353006784467],[-79.804623391622712,43.310270047827963],[-79.804590944824511,43.310195421711413],[-79.804577196848001,43.310110455793598],[-79.804542954146655,43.310026806407997],[-79.804524896463917,43.309947828435632],[-79.804501828407339,43.309866546964471],[-79.804474722131019,43.30978369251234],[-79.804454662104007,43.309706224356418],[-79.804423364408677,43.30962332607443],[-79.804402406491917,43.309541346279708],[-79.804387540296887,43.30946312200232],[-79.804364354345267,43.309387872268225],[-79.80433702104385,43.309310328048802],[-79.804324324871573,43.309228344564332],[-79.804336085541053,43.309150488695749],[-79.804306765779643,43.309073644057058],[-79.804324706301799,43.308995042393796],[-79.804299564006627,43.308918961784372],[-79.804281595185287,43.308835482447044],[-79.804264647672596,43.308756516025689],[-79.80424155037403,43.308676764943328],[-79.804217452782851,43.308597723755291],[-79.804171737363305,43.308520707646338],[-79.804131164734002,43.308439243051602],[-79.804090548080168,43.308360029102218],[-79.804004179731606,43.308312572749912],[-79.803907263717747,43.30827482090892],[-79.803836644382656,43.308210240528012],[-79.80378247765357,43.308142950754913],[-79.803719125250183,43.308072503348662],[-79.803660017736405,43.307993095825935],[-79.803605955580977,43.307920494415136],[-79.803559241081985,43.307844187961649],[-79.803507049177753,43.307776828669404],[-79.803456009267464,43.307707320328838],[-79.803400917233191,43.307636959164633],[-79.803346783277647,43.307568048715524],[-79.803292868471615,43.307487974971409],[-79.803241049503242,43.307407923132253],[-79.803191954353466,43.307339875738386],[-79.803139960749803,43.307268736465133],[-79.803078794005515,43.307193809326158],[-79.803029787541504,43.307121260545884],[-79.802984942527999,43.307050286062143],[-79.802929749140958,43.306985146205804],[-79.80287868226597,43.306917078035603],[-79.802824710324685,43.306839974945987],[-79.802783978003845,43.306766792309972],[-79.802724833643595,43.306695668031573],[-79.802673929818511,43.306619317346524],[-79.802620737816923,43.306552757572177],[-79.802575865408684,43.306483223353496],[-79.802553845684386,43.306398980942646],[-79.80249974204196,43.306328629680394],[-79.80244563852311,43.306258278393159],[-79.802394705354004,43.306183458034717],[-79.802348993994457,43.306106441213785],[-79.802290750338415,43.306039738335471],[-79.802234610002245,43.305966394134231],[-79.802179550972468,43.305894501947705],[-79.802125639141778,43.305814427665887],[-79.802077730204616,43.305742610318198],[-79.802032887285407,43.305671635469388],[-79.801991230606532,43.305595381330626],[-79.801948390312617,43.30552289666192],[-79.801896707356605,43.305436092250346],[-79.801845908157588,43.305354519676122],[-79.801803442587811,43.305269252502804],[-79.801760837946404,43.305184794259553],[-79.801708111000082,43.305100950301792],[-79.801666366673572,43.305029197364497],[-79.801614547103839,43.304943111746965],[-79.801559620596265,43.30486455731856],[-79.801512817730739,43.304786718307263],[-79.801475544531442,43.304700785058152],[-79.801426835570084,43.304613291231107],[-79.80137713294701,43.304532450290409],[-79.801329314324988,43.304456131317949],[-79.801285533660348,43.304381385410842],[-79.801243892920752,43.304304410793598],[-79.801205436645787,43.304222246935595],[-79.80115986091073,43.304138477671991],[-79.801119220800501,43.304060793136365],[-79.801074617299534,43.303977754387681],[-79.801017642765999,43.303896837051141],[-79.800966845987574,43.303815264093991],[-79.800925234337271,43.303736848940922],[-79.800887839310136,43.303650914209769],[-79.800860593651976,43.303575531090694],[-79.800815960759522,43.3034940226906],[-79.80076924658421,43.303411772089049],[-79.80072887937645,43.303326526495525],[-79.800687372779905,43.303242799702062],[-79.800659988344208,43.303168225479546],[-79.800635969999405,43.303085492462273],[-79.800620014789871,43.303006535839167],[-79.800603045161338,43.30292900929313],[-79.800575033513155,43.302842452494801],[-79.800547693637171,43.302765627585138],[-79.800527626562598,43.302688878944245],[-79.80051372286303,43.302612194940338],[-79.800488676304042,43.302531612179251],[-79.800466660776763,43.302447369360394],[-79.800449808319001,43.302363901048643],[-79.800422636325152,43.302284826741072],[-79.800411961414838,43.302200702856766],[-79.800430879670628,43.302179110413164],[-79.800524095372239,43.302141098630329],[-79.800630609474098,43.30210394659067],[-79.800734218791689,43.302057759498709],[-79.800831743711129,43.302013759639806],[-79.800931226579038,43.301970500584368],[-79.80102653244613,43.301926477293058],[-79.801113865449935,43.301874086210972],[-79.80120918992553,43.301835375612569],[-79.801301492802466,43.301793571736916],[-79.801406028841797,43.301750365228258],[-79.801501354710965,43.301711564354598],[-79.801601674183274,43.301675877254141],[-79.80171236368291,43.301639488312844],[-79.801817860027654,43.301603855262293],[-79.801927528291273,43.301562953165828],[-79.802030266288071,43.301510812798838],[-79.802126695944708,43.301465989951829],[-79.802226279535589,43.301417508211337],[-79.802322781366684,43.301368994110994],[-79.802418031843061,43.301333973567139],[-79.802516480440573,43.301293043462827],[-79.802615784262358,43.301258785553173],[-79.80270690173792,43.301220750013549],[-79.8028042282222,43.301180438227689],[-79.802920091432512,43.301144192314624],[-79.803014247748024,43.301108349414775],[-79.803119977340202,43.301060741619999],[-79.803226664619189,43.301014584467531],[-79.80333334255937,43.300975180488649],[-79.803436815518182,43.300935742878146],[-79.803539243974726,43.300899265730038],[-79.803639693355763,43.300856824820464],[-79.80371479869396,43.300799081220518],[-79.803740201542325,43.300761077823225],[-79.803759589496622,43.300715447730788],[-79.803759058828604,43.300692210581232],[-79.803727589907609,43.300618314695768],[-79.803681732578255,43.300548860588904],[-79.803634753632764,43.300480025044891],[-79.803564995349774,43.300422296848481],[-79.803497436826007,43.300359278969864],[-79.804335968589058,43.300035692492315],[-79.804212994057693,43.299862510944365],[-79.804172639500138,43.299877126518275],[-79.804276713832849,43.300020755849395],[-79.804153452035777,43.300069802218545],[-79.804046356385513,43.299923079653809],[-79.80400706697958,43.299939957431555],[-79.80411000166896,43.300085105759301],[-79.803685595153297,43.300244999245699],[-79.803578593588199,43.300099807996823],[-79.803544373557997,43.300115928241183],[-79.803647321547984,43.300260356759544],[-79.803517941575905,43.300306997271832],[-79.80330997935296,43.300016677569957],[-79.80351394949362,43.2999384915083],[-79.803494894755048,43.299910558312064],[-79.803275582001334,43.299991555283825],[-79.80324573794087,43.29994171826695],[-79.803455805969364,43.299860624632018],[-79.803436890433261,43.299831882477442],[-79.803241341525293,43.299901872386755],[-79.80321941695648,43.299869406866094],[-79.803614832463438,43.29971668556604],[-79.803216160467713,43.299157416892129],[-79.801651118475107,43.296961820585992],[-79.801649206508912,43.296958739022273],[-79.801646183478354,43.296955735861857],[-79.801643146302979,43.296953452913222],[-79.801638999831496,43.296951158341301],[-79.80163496247026,43.296949585272586],[-79.801630909195794,43.296948822442069],[-79.801625746625177,43.296948047988081],[-79.801621679205567,43.296948005369096],[-79.801616502489694,43.296947951126548],[-79.801612406779128,43.296949348930958],[-79.80160818604503,43.296950835470199],[-79.801604088565867,43.2969523233008],[-79.798514586255862,43.298534677537468],[-79.7982700560854,43.298274767945713],[-79.797891061706835,43.29787191366416],[-79.795480073488804,43.299095087029144],[-79.795388323126801,43.299141633811359],[-79.793205456732366,43.300248982749295],[-79.792796266305231,43.299783453195161],[-79.793183925981083,43.299587824739262],[-79.794218858177302,43.299066476811134],[-79.794227767727278,43.299033614287126],[-79.794213461390797,43.298996454976312],[-79.794233041573179,43.298972619402853],[-79.794296738511136,43.298937272944464],[-79.794322062762873,43.298903502919615],[-79.794328281889037,43.298869531484591],[-79.794326518433152,43.298821518927085],[-79.794319307974121,43.298768406428465],[-79.794333918322934,43.298721556977362],[-79.79433231319824,43.298665532085607],[-79.794301182315095,43.298575158931421],[-79.794321052603223,43.298474247903663],[-79.794280327296875,43.298382783101182],[-79.79422439066883,43.298306203527638],[-79.794194825969385,43.298273835815721],[-79.794162528286876,43.298242519820761],[-79.794145254287187,43.298218295683967],[-79.794171775792663,43.298192552314219],[-79.794210345449869,43.298180982978835],[-79.794255778359499,43.298171466976633],[-79.794280824770468,43.298151741043426],[-79.794292525857998,43.298114855914534],[-79.794287790538533,43.298073745483492],[-79.794253612101087,43.298000358680632],[-79.794195439401108,43.297899705400631],[-79.794150568895688,43.297812158819674],[-79.794100156022196,43.297730586795502],[-79.79405534449279,43.297640069312415],[-79.793994218340728,43.297545417796648],[-79.793930198767058,43.297453707219169],[-79.793874660425217,43.297357043528073],[-79.793821927743508,43.297249423909534],[-79.793759526617293,43.297150706792166],[-79.793679332031942,43.297047839982412],[-79.793601874673968,43.296949954462796],[-79.793526851465998,43.296866141586392],[-79.793455936803866,43.296780300968436],[-79.79337552600893,43.296688417149319],[-79.793306026311328,43.296599619879679],[-79.793261042674104,43.296524137769879],[-79.793198083685184,43.296447475475347],[-79.793117579720516,43.296366575977906],[-79.793079432022552,43.296282071385171],[-79.793026388594512,43.29619650913024],[-79.792999642867983,43.296166800163689],[-79.792967378440679,43.29613096031234],[-79.792951433821358,43.296113248566108],[-79.792950030895298,43.296111691288736],[-79.792887192042102,43.296028997071311],[-79.792816422080335,43.295942167079353],[-79.792766106543098,43.295849609982277],[-79.792706044226179,43.295769916455612],[-79.792642053686805,43.295683157916841],[-79.792576586418065,43.295602506811861],[-79.792519335892337,43.295517800348442],[-79.792457977241881,43.2954351215161],[-79.792396697149968,43.295348481498699],[-79.792331189268168,43.295263687750037],[-79.792279742280272,43.295166075961745],[-79.792240377907987,43.295074624760304],[-79.792197089228608,43.294982141606091],[-79.792165943676778,43.294892758161922],[-79.792127682636092,43.294820318069895],[-79.792071689401965,43.294740667172846],[-79.792028142788865,43.294661237754632],[-79.791981843522265,43.294577637173056],[-79.791946392411816,43.294500274220212],[-79.791892231338522,43.294396600561683],[-79.791840349060095,43.294321044997758],[-79.791789803042619,43.29424649402123],[-79.791735205719775,43.294164876708884],[-79.791663058577143,43.294073078954931],[-79.79160479014152,43.293971432794642],[-79.791556117449048,43.293870788443783],[-79.791512944501662,43.29376633024733],[-79.791464330955037,43.29366271499304],[-79.791408937156177,43.293559118112071],[-79.791354201859278,43.293484522665132],[-79.791246925715242,43.293299246820602],[-79.791190617559337,43.293235620164914],[-79.791143219794264,43.29313913117484],[-79.791090459955797,43.293039523954164],[-79.791052360045811,43.292959071176952],[-79.791004647011817,43.292878516766869],[-79.790955776377828,43.292787955097872],[-79.790905268182712,43.292705390104523],[-79.790860509704501,43.292618833847719],[-79.79082651061907,43.292570967528107],[-79.790792511265266,43.292523117403327],[-79.790735403394095,43.292431478049195],[-79.790708273153783,43.292351141135072],[-79.790664530003639,43.292275581029841],[-79.790634331713605,43.292213220666916],[-79.790594832463114,43.292128790948134],[-79.790549692878713,43.292055287066397],[-79.790506291054584,43.291968745009292],[-79.790466692211368,43.291889356713583],[-79.790413499128874,43.291811715576706],[-79.790365768178475,43.291732151193123],[-79.790328984646763,43.291653783118868],[-79.790282490041875,43.291580264794888],[-79.79021052832536,43.291479373501062],[-79.790143193549667,43.291418691207895],[-79.790081526226899,43.291351945765783],[-79.790035249903468,43.291267444148637],[-79.789977969460466,43.291190840101642],[-79.789923794928214,43.291088155815174],[-79.789892733124645,43.290994810603415],[-79.789867278015578,43.290898463172908],[-79.789834721480744,43.290812125643306],[-79.789799594743428,43.290718647345628],[-79.789738481937064,43.290623993604534],[-79.789692128064843,43.290543453002641],[-79.789634929060966,43.290462797609059],[-79.789573738195742,43.290372104934193],[-79.789515060611393,43.290291433830362],[-79.789450876621828,43.290208723421408],[-79.789401751420712,43.290131214897087],[-79.789343135009318,43.290047482816846],[-79.789280430389823,43.289964787969218],[-79.789209468837868,43.289882005674009],[-79.789171532262273,43.289793539949464],[-79.789130902376698,43.28970414524553],[-79.789076710894079,43.28960245085247],[-79.789074210500871,43.289523454829684],[-79.789038006869447,43.289416007888356],[-79.788998293632631,43.289342560820351],[-79.788947796189817,43.289265938012626],[-79.788895843202411,43.28919434229428],[-79.788838244545005,43.289127729290989],[-79.788772389024089,43.289061028815134],[-79.788686574562178,43.288968994330929],[-79.788607579503562,43.288881174086129],[-79.788565513268381,43.288789692918563],[-79.788542375632815,43.288713359722649],[-79.788511619015026,43.288611012824816],[-79.788467000923788,43.288511490571544],[-79.788408862688826,43.288403811059041],[-79.788363907130716,43.288321303714007],[-79.788307865643688,43.288244621879436],[-79.788259800549952,43.288182161608596],[-79.788164518516425,43.288089035917722],[-79.788094081422926,43.288048309536073],[-79.788033237204218,43.288008675261509],[-79.787991594817484,43.287964201914662],[-79.787961183202512,43.287912824051176],[-79.787905677152978,43.287809224198831],[-79.787874283884022,43.287732803363923],[-79.787845855969437,43.287683959651048],[-79.787817427777796,43.287635132135961],[-79.787782642007954,43.287524728306074],[-79.787754316028739,43.287430420965201],[-79.78771512756424,43.287336898929887],[-79.787666305436019,43.287244355304857],[-79.78763640601619,43.287161016758084],[-79.787565787879032,43.287061218521977],[-79.787482369031807,43.286985326583675],[-79.787428488191168,43.286942704270551],[-79.787390718562804,43.286914299791405],[-79.787354424381164,43.286879877919539],[-79.787314203029837,43.286838390875545],[-79.787280976034438,43.286786082519939],[-79.787262746063476,43.286735824124456],[-79.787225871024091,43.286662406508057],[-79.787185068892157,43.286581923714643],[-79.787156526003713,43.286498599419389],[-79.787128206602176,43.286410234958126],[-79.787091371270336,43.28633483672283],[-79.787042094663164,43.286265249509576],[-79.786981809301736,43.286197616554645],[-79.786922800907902,43.286133959097832],[-79.786828776073818,43.286039855106935],[-79.786773893706396,43.285973269848171],[-79.786696380660203,43.285879430943986],[-79.786618685561322,43.285788561544557],[-79.786572303314912,43.285716033340513],[-79.786529825215311,43.285645527532971],[-79.786478415015921,43.28554692289444],[-79.786432208790558,43.285459358958292],[-79.786377964585725,43.285360724200956],[-79.786334831019673,43.285261216822114],[-79.786258451595828,43.285172432170349],[-79.786198268414623,43.285099757348156],[-79.786117908421303,43.285012821303908],[-79.786075092944017,43.284959330274916],[-79.786046118703041,43.284904005149528],[-79.786003144012753,43.284858526422227],[-79.78596968105218,43.284818191173031],[-79.785935401563279,43.284750743652509],[-79.785922777700492,43.284697573047453],[-79.785896414494417,43.284647318127874],[-79.785859284459846,43.284586863845881],[-79.785827397519185,43.284535469728851],[-79.785805160118642,43.284482287096196],[-79.785788489556367,43.284428083016572],[-79.785736963349393,43.284335419777136],[-79.785669062542226,43.284235649180452],[-79.785613305709916,43.284145012003336],[-79.785534480616434,43.284049177363386],[-79.785434675793923,43.283967076878319],[-79.785368814773548,43.283907307817188],[-79.785320936962563,43.283835753700657],[-79.785230243592352,43.283710798253345],[-79.785197265093274,43.283652368836854],[-79.785148130716948,43.283575848813996],[-79.785098934152913,43.283496266572513],[-79.785048405105201,43.283421712684373],[-79.78499927288793,43.283345102572852],[-79.784955521556142,43.283270620643286],[-79.784902281880093,43.283196037891493],[-79.784846328191691,43.283115393251563],[-79.784787742525111,43.283030758630169],[-79.784738709512339,43.282949196971323],[-79.784686945942894,43.282868596772786],[-79.784630853028347,43.282794974069112],[-79.784581741542567,43.282717373494776],[-79.784535360857703,43.282638811422451],[-79.784490557584064,43.282555313609087],[-79.78443201237269,43.282468698234602],[-79.784365213046598,43.28238190505305],[-79.784297017201411,43.282297168026872],[-79.78423151765594,43.282219393100789],[-79.784176781343731,43.282145784588558],[-79.784124739463124,43.282079228219104],[-79.784058005042013,43.281995407035204],[-79.783992420553304,43.281915740116801],[-79.78391900474324,43.281820862298375],[-79.783871088978515,43.281751378190449],[-79.783821859112876,43.281679809048605],[-79.783753546416008,43.281601013431448],[-79.783701864180827,43.281516451647946],[-79.783651359962292,43.281440816843862],[-79.78359718290055,43.281339209934153],[-79.78354585986817,43.281236642855255],[-79.783480716363968,43.281134919248679],[-79.783429235819241,43.281040274417805],[-79.783370933939338,43.28094159501169],[-79.783305634361724,43.280853916694632],[-79.783241389552884,43.280775164036939],[-79.783158164007205,43.280690266417807],[-79.783077914547562,43.280598286830461],[-79.78300709054146,43.280509559061493],[-79.782938959652668,43.280421760357868],[-79.782865645953606,43.280321930443435],[-79.78279207402575,43.280235064244735],[-79.782725317120494,43.280146379580977],[-79.78267226413351,43.280062703178395],[-79.782618850466221,43.279997122001873],[-79.782569439192102,43.27992861191057],[-79.782497282813836,43.279838789092821],[-79.782428140236433,43.279739993789391],[-79.782364195763279,43.279646296316095],[-79.782299877325627,43.279577537353923],[-79.782240899865059,43.279512887257575],[-79.782186352602139,43.279436218240654],[-79.782138521448033,43.279362682249541],[-79.782065166104005,43.279258889373821],[-79.782005173236087,43.279177209790269],[-79.781956067920319,43.279099608115466],[-79.781888420738653,43.278993894917853],[-79.781840750144653,43.278912346481192],[-79.781794415311154,43.278831802748826],[-79.781739825025426,43.278751171062773],[-79.781673156728431,43.278664377661016],[-79.781613263765493,43.278577746440902],[-79.781555943404257,43.278498076079103],[-79.781502428825718,43.278431502794639],[-79.78143558152972,43.278353711868618],[-79.781372640626302,43.27828397655221],[-79.781315099823672,43.278215379283751],[-79.781260370540664,43.278141769410723],[-79.781215355691913,43.278069253528294],[-79.781167506981674,43.27799670742796],[-79.781104643025159,43.277916977757442],[-79.781030636098947,43.277852166849812],[-79.780946959202424,43.27779022431956],[-79.78088662950492,43.277725559096773],[-79.780856209045481,43.277675169674254],[-79.780831388069032,43.277615925450924],[-79.780817631174216,43.27754572359499],[-79.780802341950547,43.27749054296094],[-79.780740101971233,43.277385787153108],[-79.780686709692773,43.277313181748134],[-79.780630688685761,43.277242619332881],[-79.780585571792727,43.277169111607698],[-79.780529670553676,43.277086394307517],[-79.780446574213016,43.276995463019041],[-79.780384949808493,43.276927812225516],[-79.780306082721495,43.276834944935636],[-79.780237760106928,43.27675713756004],[-79.780183036113939,43.276689560246631],[-79.780122809018238,43.276619853170516],[-79.780069758081126,43.276530232553931],[-79.780013716009847,43.276454627069057],[-79.779967449246811,43.276377054789336],[-79.779904487753143,43.276302365936921],[-79.779851240396766,43.276228771179262],[-79.779801164393547,43.276132158638319],[-79.779720700116584,43.276045306929035],[-79.779641753331617,43.275950367278398],[-79.779569724631088,43.275854600939418],[-79.779493592390097,43.275760681715028],[-79.779420289799717,43.27566084964765],[-79.779382055521026,43.275588405380162],[-79.779325019771278,43.275494779885776],[-79.779274484436471,43.275421213796129],[-79.779206443673516,43.27532945177807],[-79.779120480830699,43.275246502939794],[-79.779060355351803,43.275171843884479],[-79.778966398890006,43.275075753028815],[-79.778909204016927,43.274990139653021],[-79.778863441638308,43.274938616997439],[-79.77885259343428,43.274926402687527],[-79.778851750976784,43.2749254545203],[-79.778851714824057,43.274925413613921],[-79.778783194511064,43.274857688312295],[-79.778714735568784,43.274786902084244],[-79.778646299156065,43.274721158591902],[-79.778603277613541,43.274678648017876],[-79.778571239743982,43.27463535427281],[-79.778541817826834,43.274602983937058],[-79.778510001545456,43.274548616968836],[-79.778462578355146,43.274455093691174],[-79.778417349753113,43.274393559914856],[-79.778417369563968,43.274392569628127],[-79.778369526987348,43.274320022386377],[-79.778310639738251,43.274251319143509],[-79.778258547079417,43.274181787996753],[-79.778195853609375,43.274100077511179],[-79.778122436199752,43.274006186353517],[-79.778059343158972,43.273944461581159],[-79.777996830351711,43.273853748383033],[-79.777915117213809,43.273761839497091],[-79.777843073930455,43.273667062385321],[-79.777764133085697,43.27357212147227],[-79.777691910056248,43.273486346873597],[-79.777613031610969,43.273394468061625],[-79.777551855462221,43.273304759397782],[-79.77749340985099,43.273214089387508],[-79.777425413825185,43.273120345763999],[-79.777354608343686,43.27303152455881],[-79.777285098842981,43.272945688659085],[-79.777234667171385,43.272867170258252],[-79.77718148725512,43.272790513403606],[-79.777116022401188,43.272705801185126],[-79.7770492463507,43.272625036902582],[-79.776972856297306,43.272538226784256],[-79.776897867380839,43.272455303546707],[-79.776821682100703,43.27236444347546],[-79.776741207116416,43.272278580011616],[-79.776656846968052,43.272183670401347],[-79.776586063509512,43.272093858446276],[-79.776507269661053,43.271997927719703],[-79.776430762102649,43.271917058967503],[-79.776357268807715,43.271827217877942],[-79.776290754474616,43.271733489414515],[-79.776225553554269,43.27163572292411],[-79.776177634503384,43.271567225960474],[-79.776109906222231,43.271466460862399],[-79.776032266550246,43.27137450414628],[-79.775951954555396,43.271280627824588],[-79.775867577140488,43.271186707933836],[-79.775789940473445,43.271100784120307],[-79.775719318339185,43.271003049351968],[-79.775671402146145,43.27093446215568],[-79.775611324759623,43.270857820761691],[-79.775545747252778,43.270785082448548],[-79.775492366799568,43.270712474681027],[-79.775430916591205,43.270636718945951],[-79.775374905416314,43.270560120960276],[-79.775320253636565,43.270489480495776],[-79.775256012210761,43.270417746818154],[-79.77519164773453,43.270346011786096],[-79.775131472211655,43.270274321577901],[-79.775078295336343,43.270197753796552],[-79.775031775404088,43.270127200280491],[-79.774975665868922,43.270055553535492],[-79.774919679663626,43.26998390808329],[-79.774867635967709,43.269912304833568],[-79.774804749056358,43.269840675451434],[-79.774725758192119,43.269748703354637],[-79.774642902870227,43.269652817849462],[-79.774575728381762,43.269586094899012],[-79.77451001435746,43.269520288010703],[-79.774445651689064,43.269448552569855],[-79.774360023268912,43.26934966564432],[-79.774286778159308,43.269247759773634],[-79.774233764023961,43.269163179294878],[-79.774180326890885,43.269093541789204],[-79.7741000206926,43.26899966420121],[-79.774026695107153,43.26890180933853],[-79.773950679297926,43.26880293509037],[-79.773888277136663,43.268707268274014],[-79.773811977732507,43.268616404929794],[-79.773742520003495,43.268534619424258],[-79.773700127980163,43.268461138109942],[-79.773649525570633,43.268391530742917],[-79.773592044179196,43.26832085909254],[-79.773540085043408,43.268251327173395],[-79.773469250978735,43.268164484197634],[-79.773387452706729,43.268077523592034],[-79.773314940257279,43.268006780643532],[-79.77324811461078,43.267928985057736],[-79.77319194766774,43.267860398344389],[-79.773127612004316,43.267793614932515],[-79.773059286786378,43.267716883693424],[-79.772990882162304,43.267644113558219],[-79.772930570765254,43.267579444249797],[-79.77284976942795,43.267516536069387],[-79.772810069542317,43.267444073798799],[-79.772751356059146,43.267367355455846],[-79.772677831947036,43.267279582661637],[-79.772616669029546,43.267189871426204],[-79.77254047667347,43.26709999886392],[-79.772480548039383,43.267016333841624],[-79.77242347094797,43.266925675850842],[-79.772367749146937,43.266835032377301],[-79.772310676153111,43.266750317368711],[-79.772250666737335,43.266670703398148],[-79.772196161192269,43.266587006389983],[-79.772129173681321,43.266511279442753],[-79.772056604800468,43.266443506575065],[-79.771980113728617,43.266368577961813],[-79.771900930722111,43.266292719938079],[-79.771827045157067,43.266216918743396],[-79.771753284776267,43.266141028799161],[-79.771701411017105,43.266067444897828],[-79.771630299623439,43.265994644864918],[-79.771565985712073,43.26592696033812],[-79.771498939944934,43.265854203888509],[-79.771426292863765,43.265790391773876],[-79.771366026577184,43.26572365106496],[-79.771292184054673,43.26565190202561],[-79.771225122652922,43.26558607874243],[-79.771164934663048,43.265515466813859],[-79.771106205141308,43.265439737934216],[-79.771061128119129,43.265365236262575],[-79.77101746787848,43.265287688251483],[-79.77097230956123,43.265217237713877],[-79.770928651358716,43.265145722732761],[-79.770880864596592,43.265071191868309],[-79.770820780763287,43.264995448283628],[-79.770768825746188,43.264919882075318],[-79.770693631617604,43.26484802807056],[-79.770613077150117,43.264773144900012],[-79.770535109840722,43.264698289482382],[-79.770454352842279,43.264627366020719],[-79.770381829715589,43.264557521521375],[-79.770291466162021,43.264492527710139],[-79.770213421608489,43.264427666283652],[-79.770103659846654,43.264371468292389],[-79.76998961474979,43.264387260481719],[-79.769899808269088,43.264429246329371],[-79.769822278780921,43.264473435197971],[-79.769769139566904,43.264462868598798],[-79.769770066062662,43.264416865346831],[-79.769882847942199,43.264323080442651],[-79.769841818467498,43.264249612311005],[-79.769773542986258,43.264170808564245],[-79.769707919672243,43.264101037848206],[-79.769646401578186,43.264029330254616],[-79.769590282099784,43.263958761248894],[-79.769525872829007,43.263896027031279],[-79.769449589321837,43.263811103890824],[-79.769367681012952,43.263730172223397],[-79.769262233259312,43.26372903760447],[-79.769173880276199,43.263766176073574],[-79.769098734748212,43.263759334344712],[-79.769091348360945,43.263716213130479],[-79.769160806944029,43.263668966397965],[-79.769208057088292,43.263635437685338],[-79.769169557578863,43.263571001075306],[-79.769107859241174,43.263508295792391],[-79.769047817217157,43.263430660757038],[-79.768976915212818,43.263347776213713],[-79.768918391652349,43.263268176451987],[-79.768856913604708,43.263188454811946],[-79.768799444190321,43.263123813879702],[-79.768722574932113,43.263061935576928],[-79.768645647547686,43.263009061141723],[-79.768532513667964,43.262985872012671],[-79.768431946277175,43.263017745811908],[-79.768363595095536,43.263010076305321],[-79.768374212713766,43.262960125366135],[-79.768471239445788,43.262902190357124],[-79.76847117605908,43.262901728641893],[-79.76846657629909,43.262868372200771],[-79.768460382205959,43.262823463769379],[-79.768459300997662,43.262815978354581],[-79.768391008913866,43.262738164089413],[-79.768320025096642,43.262659420341691],[-79.768245099816212,43.262574511010939],[-79.768168613028024,43.262493726903976],[-79.768103114960184,43.262417923555397],[-79.768030756888606,43.262340155323507],[-79.767950977812177,43.262288240200583],[-79.767887627869243,43.262307547876162],[-79.767774437831463,43.262354412761816],[-79.767735157638768,43.26233489993367],[-79.76773287071758,43.26231389470199],[-79.767794115360772,43.262264579291895],[-79.767874535057587,43.26221141836885],[-79.767846984515671,43.262154032750296],[-79.767774788693259,43.262068252055244],[-79.767700936603248,43.261997401016551],[-79.767632484754984,43.261927598615742],[-79.767569474580881,43.261862897355108],[-79.767473089814715,43.261821878557427],[-79.767361620501489,43.261850662442427],[-79.767321632311379,43.261866259574063],[-79.767290279179576,43.261856917117512],[-79.767347883742261,43.26178649207089],[-79.767399258351091,43.261750037043974],[-79.767351761863608,43.261661460706684],[-79.767285998996741,43.261592767620783],[-79.767206426460206,43.261536802153863],[-79.76709117088474,43.261545644917646],[-79.767012673312337,43.261570731829217],[-79.766981806968204,43.261543385440959],[-79.767072379658856,43.261463320885639],[-79.767038111890017,43.261396948155465],[-79.766987582769644,43.26132436706618],[-79.766926212357532,43.261245636029059],[-79.766866376997058,43.26115800700579],[-79.766798088769505,43.261080191814727],[-79.76673408882364,43.260997470319246],[-79.766665860917172,43.260916684197113],[-79.766605744526572,43.260843009053097],[-79.766522327165134,43.260770073093148],[-79.766431064405339,43.26075008924829],[-79.766322690150957,43.260759905911392],[-79.766262818493786,43.260741251016384],[-79.766274650567425,43.260698336902756],[-79.766313726842796,43.260660759199176],[-79.766259334663729,43.260572108016937],[-79.766196549137177,43.260496422862872],[-79.766116084515701,43.260411542405564],[-79.766042316339764,43.260336729185255],[-79.765953865954273,43.260244648863228],[-79.765887216743792,43.260152893752071],[-79.765797126352282,43.260074932753497],[-79.765727241996032,43.260009165785256],[-79.765644879844274,43.259951188117235],[-79.765536892023746,43.259948041657964],[-79.765449919160943,43.259984111627162],[-79.765403721388907,43.259965603872786],[-79.765416867025507,43.259924775068136],[-79.76551393345683,43.259864771918487],[-79.765536241775806,43.25983998004606],[-79.765513780418985,43.259802225565871],[-79.765491318762074,43.259764487286034],[-79.765425945675972,43.259676707675936],[-79.765362292878365,43.259576970545702],[-79.765273822770808,43.259485970022055],[-79.765193340730306,43.259402079217224],[-79.765097811233431,43.259319016392077],[-79.765019800597017,43.259253071201826],[-79.764919475690021,43.259200031646252],[-79.764821479877099,43.259171959759541],[-79.764709528236963,43.259224778017511],[-79.764598790607252,43.259217548927637],[-79.764633782059761,43.259180918168639],[-79.76470358281513,43.259116659200913],[-79.764644745407423,43.25904695792466],[-79.764585866227378,43.258979329013897],[-79.764503850620429,43.258904335659736],[-79.764434090965622,43.258832536190056],[-79.764356403950686,43.258750655084064],[-79.764277359166726,43.2586628180524],[-79.764185959958439,43.258582770583828],[-79.764133918333684,43.258512152866459],[-79.764069560416104,43.258447435087774],[-79.76400936941657,43.258377719752573],[-79.763945091907928,43.258309040769014],[-79.763835306843461,43.258254817476185],[-79.763727340709991,43.258311639858974],[-79.763669877893662,43.258308047240682],[-79.763684544305264,43.258265164016635],[-79.763832718121193,43.258175729534216],[-79.763811562741736,43.258143534729733],[-79.763754162329235,43.258069887415353],[-79.763680319689243,43.257999033848016],[-79.763598002259414,43.257939074174701],[-79.763504580345398,43.257886017945658],[-79.763423639300242,43.257831115575016],[-79.763341827084702,43.257746218568627],[-79.763258620090042,43.257663287422844],[-79.76317699056402,43.257569387719712],[-79.763107760671588,43.25747157000081],[-79.763051799715072,43.257399918895779],[-79.762957713167665,43.257312817819617],[-79.762860935304928,43.25722478709978],[-79.762784871628256,43.257129866766988],[-79.762705730923201,43.257046979197483],[-79.762633063309096,43.256985142209494],[-79.762543123922939,43.25690015670034],[-79.762469019698429,43.256842356113282],[-79.762378837225469,43.256763310848712],[-79.762265376444972,43.256690046659116],[-79.762169815017529,43.256608962018014],[-79.76209037122139,43.256541108342226],[-79.762004437709848,43.256459137263512],[-79.761938729301832,43.256394403652124],[-79.761866063236226,43.256332566188902],[-79.761769045846648,43.256256507999112],[-79.761683113163301,43.256174536685151],[-79.761612167415194,43.256094708575482],[-79.761531127338628,43.2560388132813],[-79.761413701825632,43.256027546691598],[-79.761208028203342,43.25610933176997],[-79.761170329863006,43.256078938296817],[-79.761401246178053,43.255961318379477],[-79.76133778149476,43.2559196603762],[-79.761267908477038,43.255853800727586],[-79.761233445541777,43.255821821494372],[-79.761186042527427,43.255777906131527],[-79.761101486243803,43.255694958782641],[-79.761005947989446,43.255612882909716],[-79.760926629087194,43.255538996718791],[-79.760857162241848,43.255453151103907],[-79.760793439044448,43.255357462663909],[-79.760708478525814,43.255294500753521],[-79.760601899029879,43.255216266910118],[-79.760506219749473,43.255141212640304],[-79.760444781616812,43.255066529379945],[-79.760361541988829,43.254985576748204],[-79.760288796994317,43.254927789467423],[-79.760221656815915,43.254867001343655],[-79.760143471818168,43.254804112452092],[-79.760069534979493,43.254738298056118],[-79.760005145112075,43.254675558616725],[-79.759931168383417,43.254611724700212],[-79.759840992465939,43.254532677484995],[-79.759737206231264,43.254456544163489],[-79.759643913605188,43.254397543156266],[-79.759553273082531,43.254347485346187],[-79.759455632999675,43.254302394098488],[-79.759417348116088,43.254300988351723],[-79.759352180462642,43.254337290228321],[-79.759310657626742,43.254361872492233],[-79.759308293415003,43.254344828235098],[-79.759360234822765,43.254280378749975],[-79.759322139649541,43.25420288652515],[-79.759309912518873,43.254198341661578],[-79.7593085796168,43.254197246656368],[-79.75922162345897,43.254129579616581],[-79.759139781994193,43.254064849456704],[-79.759081769668626,43.253991463258252],[-79.758999729251016,43.25393654580585],[-79.758940517297958,43.253867648797176],[-79.758865620810141,43.253812808763016],[-79.758801207547805,43.253751329023274],[-79.758716287885477,43.253686565153714],[-79.758646716573821,43.253624308983682],[-79.75855320862992,43.253576020168246],[-79.758491037374625,43.253555805460337],[-79.758432188572442,43.253523650722208],[-79.758401203274033,43.253478291585608],[-79.75831519116538,43.253418828246637],[-79.758246651622571,43.253354331892837],[-79.758160731313595,43.253290367154605],[-79.758089006836855,43.253231058769046],[-79.758018605057245,43.253161229367834],[-79.757935489901939,43.253110801756087],[-79.757874109286988,43.2530456625528],[-79.757798595449628,43.252972805994176],[-79.757786462011509,43.252963669660097],[-79.757783399372016,43.252962825987701],[-79.75770660943796,43.252904272756197],[-79.757631975132341,43.252836648283093],[-79.757561528566882,43.252769069250419],[-79.75748880349569,43.252710560026152],[-79.757405888922932,43.252650319237176],[-79.757335197002433,43.252588770452469],[-79.757251112528607,43.25253761144446],[-79.757177219139592,43.252482060830907],[-79.757107606816916,43.252421964364608],[-79.757032943110843,43.252361903006957],[-79.756948812951194,43.252306961364212],[-79.756868036716199,43.252238549273116],[-79.756788154846959,43.252180682179912],[-79.756692436386146,43.252144343873397],[-79.75662820275744,43.252122665002908],[-79.756598963400606,43.252094523058226],[-79.756548222123584,43.252015181545531],[-79.756472465658078,43.251954387574699],[-79.756399804885362,43.251892816801522],[-79.756322171153201,43.251821376938899],[-79.756242519374055,43.25175225626414],[-79.756157757281471,43.251680018409374],[-79.756085065998732,43.251619977877688],[-79.755994490091751,43.25157919263286],[-79.755877730409964,43.251565946601723],[-79.755779857400427,43.251532645644481],[-79.755680955215482,43.251501494501468],[-79.755601167094426,43.251439125314704],[-79.755534665867572,43.251377621002305],[-79.755452709152934,43.251318919985927],[-79.755367580067102,43.251264776715409],[-79.755276661651465,43.251192471212541],[-79.755184635005691,43.251120153575592],[-79.755114007898641,43.251061665663627],[-79.755045413845465,43.251000138285903],[-79.754960685390287,43.250926369129019],[-79.754906332624969,43.250873280882239],[-79.754815896455654,43.250831775857677],[-79.75474096908782,43.250827178218181],[-79.754671649634957,43.250855688325728],[-79.754584039571569,43.250874994673268],[-79.754564128647345,43.250842541542646],[-79.754628521491711,43.250807944802851],[-79.754568209271753,43.250745066581317],[-79.754469750943144,43.250686185174459],[-79.754469518880072,43.250685966537944],[-79.754396260714373,43.250617130301997],[-79.754392093360764,43.250613501103295],[-79.754355324213464,43.250581485658607],[-79.754328640035538,43.250558251428124],[-79.754319621440132,43.250550399380536],[-79.754318553872992,43.250549470188993],[-79.754235597649199,43.250491567820369],[-79.754157584664526,43.250438941880049],[-79.754070595696845,43.250379464689786],[-79.75399302717571,43.250305052439458],[-79.753911363400888,43.250232126295913],[-79.753829731026812,43.250157669660084],[-79.753745836264997,43.250091472511471],[-79.753653919722183,43.250019965244476],[-79.753567963006915,43.249958247776867],[-79.753497369865983,43.249892195397216],[-79.753429841263184,43.249832929794373],[-79.753337482911263,43.249783118450623],[-79.75323227073055,43.249753517231916],[-79.753134464541816,43.249717153183688],[-79.753118620891769,43.249690687145957],[-79.753053078093188,43.249630722602383],[-79.752974434653083,43.249560800217409],[-79.752900794989088,43.249499216532783],[-79.752819826745025,43.249440614441255],[-79.752731763322245,43.249379593734986],[-79.75265099572475,43.249317211794875],[-79.752556866689389,43.249251622523467],[-79.752467603511974,43.24919509080916],[-79.752387623203973,43.249142442196742],[-79.752300759085344,43.24907098894537],[-79.752222964637269,43.249013861780021],[-79.752138782766735,43.248961887522007],[-79.752041410446637,43.248952631005174],[-79.751987195976923,43.248995531510857],[-79.751940521582497,43.249019064409282],[-79.751905157473558,43.248989413693621],[-79.751948012211614,43.248953863062219],[-79.751866292009268,43.24888390633788],[-79.751766868757841,43.248824291698789],[-79.751679577349208,43.248779847000215],[-79.751582156150263,43.248724756331889],[-79.751489815764359,43.248668190264631],[-79.751413007833747,43.248611073314613],[-79.751329919056403,43.248559920802563],[-79.751222399978133,43.248492653472717],[-79.751129242342017,43.24843391709512],[-79.751020707194115,43.248368169256494],[-79.750915188592529,43.248305515808688],[-79.75082211065785,43.248242908087761],[-79.750746487852197,43.248176078701761],[-79.75066056625748,43.248106885632907],[-79.750564531495812,43.248038302391812],[-79.750486541377413,43.24798486377334],[-79.750395585761282,43.247914895145385],[-79.750303646964156,43.247844825656763],[-79.750226703297315,43.247788426787196],[-79.750149881085036,43.24773211923835],[-79.750068842342671,43.247677206289808],[-79.749971394903071,43.247623554687159],[-79.74987303790499,43.247566201188512],[-79.74978581067613,43.247512751176139],[-79.749698660713534,43.2474615530828],[-79.749615483096719,43.247408867572275],[-79.749528257910868,43.247361360397882],[-79.74944183230312,43.247316923451002],[-79.749349434978953,43.247269359590376],[-79.749258976920487,43.247223347636975],[-79.749138053048199,43.247167277508041],[-79.749134990822114,43.247166433608285],[-79.749027923516891,43.247131495536053],[-79.748914175395981,43.247122057253655],[-79.74885429330844,43.247134909091379],[-79.748807787598693,43.247102073986042],[-79.748720993960461,43.247081674656911],[-79.748618145890291,43.247039218523547],[-79.748513063941161,43.247009614383785],[-79.748402289858845,43.247005340735221],[-79.748311770234707,43.246962388910561],[-79.74822747101345,43.246916443538559],[-79.748125547550217,43.246883001646175],[-79.748038337593755,43.246828830122055],[-79.747928347647502,43.246786295194553],[-79.747825653297014,43.246742399300032],[-79.747711474669089,43.246699908353399],[-79.747615753689033,43.246664372818749],[-79.747506825183876,43.246618157235702],[-79.747411336910972,43.246571278325291],[-79.747295234609354,43.246526514754699],[-79.747203670386739,43.246486522117529],[-79.747088509318914,43.246443929741979],[-79.746979488837596,43.246408247990516],[-79.746856029000043,43.246367905654751],[-79.74673583400083,43.246324537406437],[-79.746619703137725,43.246281213567059],[-79.746520904705619,43.246245643392136],[-79.746407622110311,43.246213606258799],[-79.746288750013122,43.246201858065966],[-79.746172111866912,43.246183290768087],[-79.746064801377841,43.246208407709723],[-79.745984508247787,43.246273530898385],[-79.745932601152987,43.246347969826985],[-79.745882940196168,43.246420992628387],[-79.745818671588623,43.246497547105172],[-79.745762237118143,43.246498459056269],[-79.745756957059442,43.2464556294711],[-79.745790915262319,43.246403505223228],[-79.74584771842953,43.246336593834386],[-79.745881246712656,43.246299412423603],[-79.745810757871538,43.246234887195946],[-79.745725507767702,43.246187398775149],[-79.74562169291093,43.246144208978407],[-79.745506531774424,43.246101705054528],[-79.745397590466496,43.246062240745609],[-79.745293759427071,43.246019860884296],[-79.745192007968299,43.245972191048864],[-79.745116240158509,43.24596685752276],[-79.745081510839782,43.246008527816649],[-79.745036438710699,43.246002000236871],[-79.745048369199949,43.245972866297407],[-79.744960272380482,43.245914090363954],[-79.744847190901709,43.245872328960253],[-79.744742206010983,43.245832187077404],[-79.744627509445166,43.245773118964244],[-79.744520785622697,43.245721702084275],[-79.744402763704443,43.245668630304039],[-79.744308262681642,43.245621849683566],[-79.744213547257473,43.245585511928013],[-79.744099404030663,43.245547520044944],[-79.743990358142113,43.24550724283506],[-79.743886358840498,43.24547314404812],[-79.74375977906314,43.245440958260943],[-79.743648068307351,43.245428475566747],[-79.743538896972439,43.245448257007382],[-79.743434772811682,43.245468183837389],[-79.743356694449659,43.245521353444111],[-79.743269518610319,43.245567669614864],[-79.743190517722553,43.24561776741816],[-79.743172472946057,43.245698610234278],[-79.74314542234363,43.245762155365341],[-79.743105061578092,43.245730195873428],[-79.743111807339488,43.245653731189755],[-79.743096941829975,43.245573967469888],[-79.74299008082167,43.24552930107906],[-79.742890641264566,43.245477152319793],[-79.742777423175454,43.245442140792633],[-79.742674348764496,43.245411022577109],[-79.74255609759139,43.245369202079168],[-79.742433397441999,43.245346062041989],[-79.742316915928399,43.245320018744835],[-79.742203327973201,43.245303011715208],[-79.742089306562974,43.245307070491222],[-79.742072388719222,43.245333087720589],[-79.742027973224708,43.245396441611646],[-79.741972232198108,43.245411586535056],[-79.741982163137209,43.245377928638938],[-79.741946747243517,43.245303251433938],[-79.741834593048921,43.24526446875727],[-79.741717065619312,43.245241384851184],[-79.741605586334089,43.245223680060057],[-79.741501142195801,43.245211275215745],[-79.741379272261412,43.245195707018361],[-79.741271549307271,43.245192990816257],[-79.741152016560918,43.245213466362721],[-79.741028992803166,43.245206079248604],[-79.740914787939928,43.245219049354979],[-79.74079531697933,43.245242496715186],[-79.740694287728644,43.245261644710396],[-79.740586238247744,43.245274772303951],[-79.740476958674265,43.245299772277015],[-79.740357178729141,43.245332220342156],[-79.740248711600557,43.245365603290217],[-79.740128085389529,43.245391288369625],[-79.740014989528618,43.245398236732463],[-79.739903474943333,43.245430055005606],[-79.73978290971786,43.245452768885364],[-79.739665007320198,43.245495682206304],[-79.739566884015318,43.245529178482975],[-79.739465267264393,43.245576773342798],[-79.739363895439226,43.245612484784886],[-79.739258708404549,43.245636087966197],[-79.739145439895296,43.245657350823592],[-79.739095283406115,43.245700289964077],[-79.739088904039164,43.245758749311754],[-79.739094926508542,43.245866870483276],[-79.739069981863693,43.245929627447069],[-79.73901519983184,43.245898227897626],[-79.739000057900711,43.245838090560362],[-79.738986010768258,43.245772652597182],[-79.73889734809876,43.245741599821436],[-79.738786224883199,43.245700664430721],[-79.738746191552949,43.245652949024716],[-79.738628835535323,43.245621579636563],[-79.738509230046631,43.245597749153291],[-79.738399922169108,43.24557034025618],[-79.738392826004187,43.245568010844053],[-79.73835008077252,43.245550250588778],[-79.738347925927428,43.245553198326448],[-79.738303286690666,43.24555558738809],[-79.738242125103383,43.245558784671587],[-79.738125552147054,43.245537238381338],[-79.738007824472504,43.245517930373133],[-79.737901579418889,43.245497308217082],[-79.737792351942701,43.245466027663461],[-79.73767890451812,43.245442264267837],[-79.737575539039796,43.245425365460484],[-79.737458670930536,43.2454181324917],[-79.737353715991858,43.245430480776072],[-79.737251653741083,43.245451865464567],[-79.737163581293586,43.245493664792683],[-79.737113380331976,43.245514848443463],[-79.737063179001083,43.245536048276193],[-79.736965947920481,43.245568021393971],[-79.736860225109965,43.24556982540436],[-79.736744001535385,43.245579077176572],[-79.736635121841474,43.245584628029853],[-79.736528973598283,43.245553380281898],[-79.736423807252365,43.245528266386785],[-79.736306080483956,43.245514899650011],[-79.736243078699488,43.245583268582088],[-79.736243319375134,43.245619289500127],[-79.736189080250583,43.245662992665373],[-79.736129298979307,43.245623252296589],[-79.736026289223162,43.245589157301495],[-79.735910825379406,43.245567621010942],[-79.735837286592925,43.245597513820016],[-79.735796099612784,43.245653337126235],[-79.735742218899674,43.245578453925056],[-79.735633959243273,43.245554025478043],[-79.73553934054722,43.24560853767057],[-79.735508948467839,43.245642689163994],[-79.735446584366898,43.245578967743164],[-79.735348825541323,43.245541148274221],[-79.735246600591736,43.245522729196878],[-79.735129810870504,43.245511712797594],[-79.73502641622494,43.245496252094604],[-79.7349229582844,43.245483852150038],[-79.734796481643428,43.245494519315109],[-79.734690805532168,43.245494070695102],[-79.734585974832086,43.245500384753861],[-79.734560661182684,43.245533151449131],[-79.734513154294717,43.24554910419667],[-79.734477729103602,43.245570503293422],[-79.734428148428734,43.245639019715988],[-79.734390558045718,43.245717393719254],[-79.734335868279857,43.24578279201554],[-79.734287661961005,43.245826561031436],[-79.734257107763042,43.245814967210947],[-79.734248896924527,43.245765351245701],[-79.734258795857173,43.245685860443196],[-79.73416647459625,43.245635313656784],[-79.73405824710953,43.245603410286556],[-79.733948460316498,43.245605166624294],[-79.73387780545491,43.245583912652755],[-79.733847468843877,43.245574787481345],[-79.733750649609178,43.245539228189557],[-79.733687873929682,43.2455489784994],[-79.733645390191697,43.245613791235947],[-79.733612638685955,43.245660702582114],[-79.733527434822619,43.245659038820186],[-79.733443283591868,43.245707632117941],[-79.73341963722001,43.24571340332902],[-79.733377863641152,43.245696372342074],[-79.733384170104529,43.245641694430077],[-79.733354922050225,43.245567082883952],[-79.733248712152516,43.245538892962188],[-79.733140392045016,43.245517432992266],[-79.733079741556793,43.245495960669082],[-79.733078879519539,43.245495951120709],[-79.732969400791077,43.245494738424732],[-79.732896948632089,43.245489973806244],[-79.732882379915196,43.245467841274866],[-79.732849562822295,43.245464416162704],[-79.732842209262955,43.245492338890386],[-79.732724582279801,43.245486083178271],[-79.732712351456868,43.245481895610872],[-79.732620838848632,43.245540942081774],[-79.732576568158578,43.245626535161811],[-79.732546237456063,43.24570516909035],[-79.732508145462887,43.245694751913817],[-79.732515471843897,43.245602806458685],[-79.732523053253246,43.245569843721853],[-79.732424382267993,43.245510760876137],[-79.732300544219498,43.24547732855558],[-79.732182061261383,43.245447020612389],[-79.732102733385304,43.24544713178782],[-79.732052394789477,43.245498620150357],[-79.73197373806083,43.245525752367953],[-79.731944311816463,43.245495440941454],[-79.73194916383072,43.245457495473019],[-79.731886187931636,43.245393765331379],[-79.731771935337591,43.245361432815351],[-79.731661143375462,43.24535822330192],[-79.731576612328524,43.245407261243145],[-79.731531318199643,43.24547681444507],[-79.731497875161836,43.2455094903043],[-79.731446031992064,43.245496939263802],[-79.731423691186166,43.245451668664892],[-79.73146023753894,43.245405970627232],[-79.731475902249329,43.24538120171615],[-79.731450562800546,43.245343911026602],[-79.731373877027195,43.24528201045338],[-79.731268126382076,43.245231762604135],[-79.731166271403666,43.245195604992745],[-79.73114999556995,43.245190471929476],[-79.731139849992459,43.24521638257076],[-79.731112595338814,43.245212028164858],[-79.731117240404899,43.245184075501115],[-79.731001486355098,43.24515883916434],[-79.730924893814475,43.245223002322035],[-79.730867388998988,43.245287377223811],[-79.730825023263918,43.245215861121338],[-79.730837665685897,43.245134960326276],[-79.73073856149685,43.245096851852807],[-79.730618704900522,43.24506751754874],[-79.730573799420071,43.245059005115415],[-79.730550591046921,43.245120788984366],[-79.730475265777315,43.245123914960828],[-79.73036537083631,43.245142775330834],[-79.730267414001872,43.245114673351111],[-79.730168809535186,43.245052528645779],[-79.730063122020979,43.244999308876828],[-79.730058159916823,43.244977282646197],[-79.729946618338431,43.244944978406735],[-79.729933134168007,43.244864778101665],[-79.729826110979118,43.244816584937041],[-79.729739447935742,43.244772581597147],[-79.729706754888895,43.244763213948374],[-79.729609906607365,43.24481220368915],[-79.729606048571512,43.244737062770497],[-79.729500277896776,43.244687893610454],[-79.72939736034229,43.244637765544788],[-79.729294488241976,43.244579533783039],[-79.729186134278663,43.244524302574142],[-79.72910092968597,43.244475361542484],[-79.729008808076472,43.244433277099759],[-79.72889068265647,43.244385951091346],[-79.728776744373306,43.244338671497204],[-79.728678892541154,43.244305617712484],[-79.728584021526046,43.244259540358918],[-79.728479608984799,43.244210295304285],[-79.728372546888082,43.244164082249526],[-79.728259882083833,43.244114835293523],[-79.728155383413991,43.244075674097822],[-79.728049450224376,43.244034425804031],[-79.727947286339557,43.244013299512517],[-79.727920386646105,43.244057032672011],[-79.727806388427354,43.244006779937223],[-79.727692140663038,43.24397444339774],[-79.727582934733348,43.243960262008628],[-79.727466269973149,43.243978954240561],[-79.727424891776081,43.244055482909026],[-79.727363441924638,43.244119902210549],[-79.727313829622062,43.24413636881745],[-79.727288263402315,43.244181107166142],[-79.727251570999769,43.244168632761948],[-79.727287056145485,43.244103024154732],[-79.727208834157636,43.244050107354738],[-79.727096314291998,43.243999870363666],[-79.727004092287601,43.243956792686099],[-79.727001383102234,43.243956762533877],[-79.726951730537422,43.244040222500232],[-79.726916391009311,43.244027853091644],[-79.726951791462724,43.24397223871199],[-79.726804975849376,43.243924591221287],[-79.726817811585136,43.243899701408488],[-79.726671037508993,43.243850073203646],[-79.726590461468092,43.243975240072302],[-79.726654264857928,43.243998912033426],[-79.72664288864587,43.244018775519471],[-79.726457775141242,43.243970701215282],[-79.726466319074433,43.243950806212091],[-79.726546768202823,43.243967730055864],[-79.72658637900868,43.243905139104797],[-79.726577441368505,43.243872983347302],[-79.726459504001397,43.24382268541428],[-79.726467944756465,43.243807741772521],[-79.726347154653496,43.243758402462319],[-79.72633029813538,43.243781176399246],[-79.72630721142265,43.243771914749431],[-79.726324211724432,43.243748151914808],[-79.726297063797247,43.24373281198018],[-79.726200653322522,43.243695720070896],[-79.726109951423553,43.24365067759603],[-79.72600664256457,43.243619541751393],[-79.725907525854041,43.243576386392903],[-79.72580982321,43.243536308253461],[-79.725723164942238,43.243492301019749],[-79.725657675267968,43.243549560795053],[-79.725585059548081,43.243487790823998],[-79.725487359139208,43.243447622388182],[-79.725393741370226,43.243406598907974],[-79.725302873430181,43.243369568005384],[-79.725226342862598,43.243300640569558],[-79.725118848187293,43.243269457270877],[-79.725104220862107,43.243250294598646],[-79.724958847539142,43.243198608757858],[-79.724967286690955,43.24318375525354],[-79.724834245926743,43.243137249286498],[-79.724807285131249,43.243177919483649],[-79.724785697257346,43.24316768373437],[-79.724798554301486,43.243141803881436],[-79.724696249291327,43.243121663614659],[-79.724573209605509,43.243115339171666],[-79.724454922230464,43.243081963850301],[-79.724345158805946,43.243029683839062],[-79.724249188407541,43.242971614552637],[-79.724162781975465,43.242915632871011],[-79.724063582303501,43.242882470055662],[-79.724034599724035,43.242890160806205],[-79.72394112761701,43.242848147258208],[-79.723829073580035,43.242834830967375],[-79.723798921592348,43.24283953710389],[-79.723766251197262,43.24282917750687],[-79.723668970337073,43.242769022060543],[-79.723608756362779,43.242703337163221],[-79.723529164141667,43.242651393052405],[-79.723427800372448,43.242586239323082],[-79.723344165461327,43.242533259460629],[-79.723261739549599,43.24248137357997],[-79.723179294975054,43.242430387887993],[-79.723085973691227,43.242375318701583],[-79.72298621454928,43.242304149433252],[-79.722908017426661,43.242250329504984],[-79.722832472232042,43.242193387536176],[-79.722759966319245,43.24212657443222],[-79.722656080361972,43.242058420343923],[-79.722552052684136,43.241991165034719],[-79.722446688474975,43.241928937259786],[-79.722352138254607,43.241867910731052],[-79.722261633034876,43.241807829767474],[-79.722175376854622,43.241744824694145],[-79.722067452229894,43.241669601386747],[-79.721950066809953,43.241593281762199],[-79.721860687301827,43.241544198630649],[-79.721779679547126,43.241495299031506],[-79.721687610076273,43.241445285246492],[-79.721565976700845,43.241371889258026],[-79.721452426375436,43.241306597558697],[-79.721361755295973,43.241254528091247],[-79.721258328696123,43.241229329652221],[-79.721163677175255,43.241173253516891],[-79.721130113112537,43.241140912027859],[-79.72112015637623,43.241098749368753],[-79.72117898342475,43.241030342061208],[-79.721240599214994,43.240964036951205],[-79.721295362431434,43.240895584148326],[-79.72134289160924,43.240849111641829],[-79.721343665484966,43.240812111516028],[-79.721297495846883,43.240793586236755],[-79.721245448696251,43.240796966376443],[-79.721057973391183,43.240991980269513],[-79.721007252681147,43.24106146866292],[-79.7209018916584,43.240999239495189],[-79.720818011773403,43.240952288098697],[-79.72073594807263,43.240883295760845],[-79.720627629231444,43.240827066318928],[-79.720511057241936,43.240776777512927],[-79.720380925765141,43.240715261273081],[-79.720268626921523,43.240655024954023],[-79.720180478394909,43.240611987339243],[-79.720050450011442,43.240551462378704],[-79.719954214298212,43.240506443130982],[-79.719862023411665,43.240462369528792],[-79.719764520188718,43.240413193833511],[-79.719666973760724,43.240366088622132],[-79.719562613462415,43.240320888054129],[-79.719439462565845,43.240255486875299],[-79.719344540793386,43.240212462829263],[-79.719211785685445,43.240146953870571],[-79.719118305509895,43.240099803677126],[-79.719011697330004,43.240032606283592],[-79.718898029110505,43.239967310720367],[-79.718773398742456,43.239907925313226],[-79.718650145757366,43.239847474651938],[-79.718545914938886,43.239790298527517],[-79.718426533887424,43.239744928635048],[-79.718315115321758,43.239701628847179],[-79.718206587999504,43.239661422904994],[-79.718077542035871,43.239612972830081],[-79.71796495490598,43.239566688095955],[-79.717866056746885,43.239519566194637],[-79.717768828539633,43.2394574252966],[-79.717679391349449,43.239411399795884],[-79.717592871376922,43.239361354875946],[-79.717503619915576,43.239312359811649],[-79.71738540961239,43.239269973466349],[-79.717294656646601,43.239227984966028],[-79.71720115670864,43.239181913529066],[-79.717083575932662,43.239109548712918],[-79.716981866337562,43.239067347025156],[-79.716930196435811,43.239052810340134],[-79.716902756679616,43.239057455042051],[-79.716877876617176,43.239069242062733],[-79.716853397098888,43.239061943882454],[-79.716793771988421,43.239033270762114],[-79.71673270931538,43.239008543493092],[-79.716690898793487,43.238976108174491],[-79.716672149343026,43.238959869674481],[-79.716602984205039,43.238928027862329],[-79.716502816826562,43.238876928527723],[-79.716409255660025,43.238833827263413],[-79.716325382235681,43.238786872636254],[-79.71619677846509,43.238723387766342],[-79.716092215377373,43.238682233807175],[-79.715991734987497,43.238646078097851],[-79.715871983497181,43.238612677456352],[-79.715809482066035,43.238591985597822],[-79.71575377214397,43.238576322473548],[-79.715685771393638,43.238553587795991],[-79.715635625025385,43.238531053564749],[-79.715550042591815,43.238501007770857],[-79.715491563172804,43.238482341909872],[-79.715416831916045,43.238457550481726],[-79.715299894089526,43.238419228326769],[-79.7151855576694,43.238391920849956],[-79.715106114331391,43.238397961966704],[-79.715066404801263,43.238394544372568],[-79.714941446510707,43.238351089190104],[-79.71481488036369,43.238319681930072],[-79.714711149156699,43.238303478716219],[-79.714647104726751,43.238291773454563],[-79.714587017712674,43.238285155190624],[-79.714550100594906,43.238283659758487],[-79.714523079323058,43.2382684084915],[-79.714490749911008,43.238242021938149],[-79.714468000361151,43.238222766610605],[-79.7143543195983,43.238158456884797],[-79.714256866197857,43.238107296040489],[-79.714143078020413,43.23805397047348],[-79.714011119660981,43.238015478139026],[-79.713957803419461,43.238014878686002],[-79.713940818937999,43.238037739420555],[-79.713932440356544,43.238049621293378],[-79.713919958594829,43.238057495018523],[-79.713892854259797,43.238046204679762],[-79.713856378551782,43.238023733336327],[-79.713815776978919,43.237998334123887],[-79.713729197817656,43.237951347164916],[-79.713623601507081,43.23789505164843],[-79.71350035586326,43.237834685557601],[-79.713434129901671,43.237797922371279],[-79.713388112756064,43.237772372045455],[-79.713284098852327,43.237711141500135],[-79.713196147141531,43.237659186181709],[-79.71308634069959,43.237609866368629],[-79.712988866509676,43.237559784756485],[-79.71295632395173,43.237549423506991],[-79.712919322051007,43.237551978652107],[-79.712894631374041,43.237554762368198],[-79.712800885296375,43.237520660639518],[-79.712682681804651,43.237478269506362],[-79.71255512250616,43.237429829926548],[-79.712446332098182,43.237396639118174],[-79.712425223247678,43.237422334665105],[-79.712384220649014,43.237421873092714],[-79.712355677129182,43.237414618245118],[-79.71232580582631,43.237400234830737],[-79.712300119090457,43.237385988564469],[-79.712311542250816,43.237364055965671],[-79.712309339599827,43.237339988961502],[-79.712287926663961,43.237315795731895],[-79.712251324951339,43.237299355519838],[-79.712184700241053,43.237281586765995],[-79.712065268372015,43.237233238146338],[-79.711974380056105,43.237192144352129],[-79.711880966817091,43.2371481405876],[-79.711787305399028,43.237110076969067],[-79.711750472538853,43.23710461957112],[-79.711719203472285,43.237092291306723],[-79.711714333928413,43.237066213246884],[-79.71170773454655,43.23705209178415],[-79.711673986009032,43.237034693020021],[-79.711560077092884,43.236981453565114],[-79.7114447701221,43.236936122270322],[-79.711322547183784,43.236891703442872],[-79.711187990580797,43.236848136015325],[-79.711076430495538,43.236817884203724],[-79.710955287293046,43.236786533780794],[-79.710831351851198,43.236759113770376],[-79.710719856653597,43.23672580078766],[-79.710602693561938,43.236698456866321],[-79.710457899677365,43.236684848447297],[-79.710396735640828,43.236665159210041],[-79.710346594708724,43.236642532672917],[-79.7102866579459,43.236628890277977],[-79.710176707621216,43.236586589612635],[-79.710116960868547,43.236563944698915],[-79.710088482602089,43.236553628466517],[-79.709903806008441,43.236486532634181],[-79.709920900142748,43.23645268815315],[-79.709788015291551,43.236394190342629],[-79.709675083341452,43.236364822146356],[-79.709588424224606,43.236321883203217],[-79.709607565992101,43.236261048150666],[-79.709575888515204,43.236250605652479],[-79.709547757073537,43.2362413737468],[-79.709509446729513,43.236305954534657],[-79.708571082870378,43.23602720746775],[-79.708406719000635,43.23597231464047],[-79.708292350925973,43.235941037901412],[-79.708185026473132,43.235902817031992],[-79.708077804360698,43.23586558772076],[-79.707967687673232,43.235831297121237],[-79.707854801960693,43.235794003625138],[-79.707743308299371,43.23576077780271],[-79.707634567324973,43.23572551192192],[-79.707526012401289,43.235687276530854],[-79.707413169100079,43.235648002071756],[-79.707281343447733,43.235609503468957],[-79.7071479566889,43.235574949081133],[-79.707041734829289,43.235548715683557],[-79.706927449516513,43.235519419520969],[-79.706796474931892,43.235498939127318],[-79.706694291149404,43.235479774629333],[-79.705925069761321,43.235421008992063],[-79.704927607197675,43.235677875756757],[-79.704767585773396,43.235755394086311],[-79.704677247594645,43.235799123794983],[-79.704642759904686,43.235816742372073],[-79.704552764227344,43.235861736500631],[-79.704494074419102,43.235859090771477],[-79.70440830871172,43.23583812918077],[-79.704348545816813,43.235816381528728],[-79.704320306319644,43.235789047923255],[-79.704319524211158,43.235762025346453],[-79.704274883169234,43.235741529501112],[-79.704220219410331,43.235734877181841],[-79.704090680897011,43.235716390964804],[-79.704017882371957,43.235728622777202],[-79.704000789919078,43.235756433330685],[-79.703992091090726,43.235783348484347],[-79.703982168509228,43.235798273689987],[-79.703928875401814,43.235796679322448],[-79.703889063320915,43.235798209201185],[-79.703850474957477,43.235811729014209],[-79.703824006561348,43.235834480778124],[-79.703787808255484,43.235863065289863],[-79.703763096900971,43.235866837303846],[-79.703738599295363,43.235860526614069],[-79.70371592177716,43.235832265390215],[-79.703712368154768,43.235808182908812],[-79.703656875849262,43.235782521282836],[-79.703615835346255,43.235778094126267],[-79.703570940673089,43.235769571212948],[-79.703538235600831,43.235761186447583],[-79.703423569865663,43.235749891618255],[-79.703318447962516,43.235735733359945],[-79.70320503170845,43.235729404991112],[-79.703182903156687,43.235739149180141],[-79.703158358603659,43.23579893139344],[-79.703145685012387,43.235815806341087],[-79.703058609390311,43.235792756934622],[-79.702943284843116,43.235812520827636],[-79.702836789476237,43.235799246108492],[-79.702725783987077,43.235806992636974],[-79.702587719317108,43.23580146464527],[-79.702467640996474,43.235784073498905],[-79.702334044623839,43.235759507097235],[-79.702192107991152,43.235744930127822],[-79.70209564103169,43.235711779255453],[-79.701980999716071,43.235693549736538],[-79.701872870228044,43.235699256122821],[-79.701754417333532,43.235732939498355],[-79.701646545035004,43.235720729491575],[-79.701550183564223,43.235682626842241],[-79.701507471479104,43.235635137198905],[-79.701694420666485,43.235206031301431],[-79.701687823531557,43.235133919836919],[-79.70166083413217,43.235134784076244],[-79.701641239945445,43.23513537117087],[-79.70143584262081,43.235592273565281],[-79.701469817574363,43.235604635359991],[-79.701426530123598,43.235642233260009],[-79.701403345193157,43.235637917978949],[-79.701373472419078,43.235629564750731],[-79.701324497040318,43.235616042110472],[-79.701283708074939,43.235605583909859],[-79.701184323880668,43.235576451202924],[-79.701065766008583,43.235557095744589],[-79.7009963303136,43.235602320555358],[-79.701004233978011,43.235682460959886],[-79.700971359104003,43.235682087601276],[-79.700970138284617,43.235612018167352],[-79.700923787645053,43.235602487176635],[-79.70080867707216,43.235612165326032],[-79.700787541062454,43.2356389389657],[-79.700741371010636,43.235690460948952],[-79.700683233737834,43.235719785769938],[-79.700633770617173,43.235729218951327],[-79.700573328137423,43.23573951788272],[-79.700508927676097,43.235744819300592],[-79.700456926001877,43.235746209495758],[-79.700377465097887,43.23574737771628],[-79.700312833076367,43.235763571924146],[-79.700262141767865,43.235767047971621],[-79.700194974418679,43.235769255316761],[-79.700133431949794,43.23576756633561],[-79.700100829448417,43.235760172256249],[-79.700076410119081,43.235813922163445],[-79.700051997146645,43.235803649634775],[-79.700060235188587,43.235734768243674],[-79.700038662513379,43.235660414542231],[-79.699990488647757,43.235672924552844],[-79.699868589909485,43.235677482042846],[-79.699750815600225,43.235679204825658],[-79.699650457325532,43.23563799358773],[-79.699632853437492,43.235631850436626],[-79.699619987463677,43.235657727376861],[-79.699591509721643,43.235705397978094],[-79.699570708801346,43.23572218012697],[-79.69955678706998,43.235733997924996],[-79.699547005838738,43.235805923287806],[-79.699521231626562,43.235859656770344],[-79.699496734464418,43.235853346077896],[-79.699511592532147,43.235797506580056],[-79.699511258678285,43.235749508419019],[-79.69939433635281,43.235711170178739],[-79.699291012870887,43.235681991034447],[-79.699237698973619,43.235681384747082],[-79.699196191594481,43.235698921849369],[-79.699206951081905,43.235772071285865],[-79.699149141406309,43.235855425577292],[-79.699123395248094,43.235844147185439],[-79.699169949791326,43.235774621989862],[-79.699166524370355,43.235744597810658],[-79.699033504146499,43.235693019492551],[-79.698981906667086,43.235675413968679],[-79.698931449068922,43.235667906507537],[-79.698896080009419,43.235657418160635],[-79.698835133489041,43.23562773104296],[-79.698775434175076,43.23560309884045],[-79.698722589725023,43.235580437354045],[-79.698679076632416,43.23556490467309],[-79.698658974143839,43.235606727310838],[-79.698634454222258,43.235601494922378],[-79.698631519548115,43.235548425507737],[-79.698590838410453,43.235532925013914],[-79.698541438372843,43.235539386499319],[-79.698481124161447,43.235543651820947],[-79.698455123398247,43.23554434646131],[-79.698457412919439,43.235500430205242],[-79.698245751518186,43.235481003756547],[-79.698170717356206,43.235598199703617],[-79.698150424775491,43.235648933712667],[-79.698119175047708,43.235641645411683],[-79.698149674846604,43.235556899359189],[-79.698081513631067,43.235542166457442],[-79.698038016516065,43.23553167627454],[-79.698005185870073,43.235529230614787],[-79.69795877058759,43.235522760141656],[-79.697958791674409,43.235521769878851],[-79.697916823430802,43.235630337485858],[-79.697886866825712,43.235625943503955],[-79.69792179049324,43.235524320180431],[-79.697854009394717,43.235497525344677],[-79.697761705089377,43.235523488195703],[-79.697370661084065,43.2355130023616],[-79.697370939947618,43.2356270934539],[-79.69733393870186,43.235629642663859],[-79.697335012360284,43.235515657921553],[-79.697280178937632,43.235517014421575],[-79.697195260503676,43.235520008332436],[-79.697170290668694,43.235668840517491],[-79.697138812445658,43.235666500959688],[-79.697158449176513,43.235513646924396],[-79.69705186588881,43.235510361792144],[-79.69697185085559,43.235537544544535],[-79.696909234299355,43.235649838560796],[-79.696884737523092,43.235643526412971],[-79.696922132187211,43.235558949288169],[-79.696867932193058,43.235536360647714],[-79.696766029911174,43.235504132960159],[-79.696705916768948,43.235562518909106],[-79.696678893248205,43.235611194954565],[-79.696650273516283,43.235601865168888],[-79.696656560662632,43.235566909029032],[-79.696525184772383,43.235565411946695],[-79.696448450445374,43.235571561022994],[-79.69641630187725,43.23566421184924],[-79.69637818032173,43.235655763305772],[-79.696404532990911,43.235575022513586],[-79.696344132231886,43.235583338678573],[-79.696219415298543,43.235592992762776],[-79.69616726397237,43.235601402866436],[-79.696129889359142,43.235684989467913],[-79.696128492732996,43.235686954552683],[-79.696113865820408,43.235731810666145],[-79.696078387782833,43.23572645371182],[-79.696116445907037,43.235610818647658],[-79.696071471581163,43.235600310877629],[-79.695963105690851,43.235617084601571],[-79.695842432612039,43.235627684834895],[-79.69574944368668,43.235685694524676],[-79.695633043165017,43.235692291198788],[-79.695519328360007,43.23569999893288],[-79.695445302565133,43.235706178225549],[-79.695404007318572,43.235713721295632],[-79.695339606506693,43.235719019797259],[-79.69529845549603,43.235725573971628],[-79.695206599334398,43.235730469173859],[-79.695008134664405,43.235733247570955],[-79.694953295413299,43.235740635950286],[-79.694967484902577,43.23577978763722],[-79.694938667628335,43.235785491901694],[-79.694914342023623,43.235771167217571],[-79.694856670812598,43.235778523237506],[-79.694821321616075,43.235767134301355],[-79.694791749499316,43.235744735656091],[-79.694778401435457,43.235729635751838],[-79.694800975407659,43.235629852570057],[-79.694743727233458,43.235623166230759],[-79.694681008017284,43.235803532398236],[-79.694655121912191,43.235862306960058],[-79.694635060789139,43.235902058304852],[-79.694616690498748,43.235931833870119],[-79.694599741735175,43.235952711131652],[-79.694553929549173,43.235987216052536],[-79.694516714619411,43.235999757884322],[-79.694454787733989,43.236016069698202],[-79.694317545482903,43.23603548376613],[-79.69420243696932,43.236039212268508],[-79.694072153171874,43.236055733973274],[-79.693939145063879,43.23606718186263],[-79.693830525831984,43.236089983730665],[-79.693741499038879,43.236095000110339],[-79.693636294373178,43.236084794018979],[-79.693501346764265,43.236060200969135],[-79.693396457704452,43.236040993692619],[-79.693276487559203,43.236018642520484],[-79.693168895634585,43.235993371095027],[-79.693041012877345,43.235960934199042],[-79.692929252123093,43.235940567426347],[-79.69280513256075,43.235922220398827],[-79.692676957646469,43.235897703778129],[-79.692542116735979,43.23586815830285],[-79.692438883041888,43.235834921941809],[-79.692304213745004,43.235797364080895],[-79.692188307681377,43.235775058231596],[-79.692058965620177,43.235747556065277],[-79.691962438880395,43.235717457521993],[-79.691822379688219,43.235672813890872],[-79.691716459137183,43.235638555644996],[-79.691596854516007,43.235599188255108],[-79.691490917054693,43.235559977093416],[-79.69138506047058,43.2355227477642],[-79.691266897389283,43.235479344465169],[-79.691158251583005,43.23544010200628],[-79.691040323940115,43.235385715591725],[-79.690922068639424,43.235352395999193],[-79.690786931056749,43.235336802142548],[-79.690636835835022,43.23531806539188],[-79.690510577564282,43.235330667112457],[-79.690407414268051,43.235357490204763],[-79.690321423735938,43.235410533044011],[-79.690271985166916,43.235482003507677],[-79.690206149499602,43.235554276685484],[-79.690175850252842,43.235565905794665],[-79.690152386571455,43.235574641667057],[-79.690126428173812,43.235573353893116],[-79.690077542230796,43.235555775406986],[-79.69005734468422,43.235538525458907],[-79.690038842904627,43.235505356840243],[-79.690028357213464,43.235483175554627],[-79.69003735689212,43.235448250849913],[-79.690059443012871,43.235440579772742],[-79.690103389899505,43.235430007446645],[-79.690110520226511,43.235419103528912],[-79.690179407879938,43.235330837219941],[-79.690247106500792,43.235240576246973],[-79.690296566107193,43.23516811552912],[-79.690310576239369,43.235152247815698],[-79.690301508515574,43.235127111281805],[-79.690256851122314,43.235038625276253],[-79.690224186239391,43.234965224166906],[-79.69018623314571,43.234885729427837],[-79.69017583235096,43.234859587114677],[-79.690122926272096,43.234839981604551],[-79.690479502465692,43.233969630623847],[-79.690489535968169,43.233949665299626],[-79.690922932452125,43.233649551409037],[-79.691898156883241,43.233857728681997],[-79.692115642810847,43.233800245280847],[-79.692240540572215,43.233718651197044],[-79.6923725762923,43.233429943352142],[-79.692311386900556,43.233285170630012],[-79.691990273922343,43.233201448305472],[-79.69201042644309,43.23315170337667],[-79.691652570859418,43.233058555357196],[-79.691797489508147,43.232680039812145],[-79.691726732311892,43.232660230869755],[-79.691736699702261,43.232643326229862],[-79.692018528535655,43.232709581403441],[-79.692193929892554,43.232316376264805],[-79.691573185730235,43.232164213420589],[-79.691207734245268,43.232938387758651],[-79.69047256412243,43.232763928924086],[-79.690330696070205,43.232936363017458],[-79.690218722954043,43.233179194841128],[-79.690236605948343,43.233304473138666],[-79.69026214919289,43.233514842312559],[-79.690293553176161,43.23371033099184],[-79.689824398219656,43.234851510069994],[-79.689771110655116,43.234843966151978],[-79.689720018544364,43.234929374526125],[-79.689662387843754,43.235003812440148],[-79.68960175536894,43.235086139055376],[-79.689553263507051,43.235176620600321],[-79.689503224196685,43.235276088062761],[-79.689469662337913,43.235376734798749],[-79.689459396603155,43.235470714928766],[-79.689442617455683,43.235552554303339],[-79.689454505442214,43.23563571264355],[-79.689471912920965,43.235719924724705],[-79.689515196315028,43.23580353281622],[-79.689542315850261,43.235882813599481],[-79.689610739970519,43.235942666589921],[-79.689648688991838,43.235959130378333],[-79.689693942145922,43.235956587242242],[-79.689736548237363,43.235951132303178],[-79.689754492633995,43.235941342789978],[-79.689775054816337,43.235941578332245],[-79.68980727223952,43.235966889134538],[-79.689885423710933,43.236026855185195],[-79.689900063611006,43.236108063989043],[-79.689838419260539,43.236174351891982],[-79.689738866038169,43.236222286416307],[-79.689625064755987,43.236233949304292],[-79.689507997457909,43.2362026228678],[-79.689417805125871,43.236135585077946],[-79.689363268467133,43.236059862073574],[-79.689316952102928,43.235991347749128],[-79.6892787047138,43.235919863417095],[-79.689213418206521,43.235840054241329],[-79.689187821003301,43.235758720675982],[-79.689175848443753,43.235679523351465],[-79.689165444522615,43.235590348930003],[-79.689124552469849,43.235515862725599],[-79.689170101007193,43.235436334112862],[-79.68918950240203,43.23535857688487],[-79.689222610816756,43.235284848698676],[-79.68926661593234,43.23520836391031],[-79.689258688805978,43.235193235437784],[-79.689253763404309,43.235170216441212],[-79.689181325989111,43.235102303170926],[-79.689099240615022,43.235036349430814],[-79.689010362339076,43.234971307375609],[-79.688924129259377,43.23490926888045],[-79.688828227023052,43.234850180133421],[-79.688736239431009,43.234798069702734],[-79.688637887523129,43.234726886587872],[-79.688561237636321,43.234665947290296],[-79.688480314793793,43.234609011002696],[-79.688388750292773,43.23454294805817],[-79.688275104340434,43.234478612814996],[-79.688190012709867,43.234426581026668],[-79.688095589426823,43.234367508624537],[-79.687999540114888,43.234315351012356],[-79.687917781843908,43.234297394534188],[-79.687907726198631,43.234318349878961],[-79.687721020052606,43.234284151687618],[-79.68760836000915,43.234305910789779],[-79.687538612924968,43.234239016944414],[-79.687431540633298,43.234189793924877],[-79.687321373297593,43.234158544426855],[-79.687261253056562,43.234153802387283],[-79.687235339337292,43.234213565461346],[-79.687213826767675,43.234200261927441],[-79.687199906031509,43.234143103218848],[-79.687064835957173,43.234124534231803],[-79.68696661588254,43.234110440169552],[-79.686939262484827,43.234174148660834],[-79.686919017357525,43.234164911678349],[-79.686939282573164,43.23411012639221],[-79.686812570161592,43.234086610491438],[-79.686750815343899,43.234094906045058],[-79.686712955208606,43.234200545194767],[-79.686684460855759,43.234191213454821],[-79.686720928629299,43.234081596316557],[-79.686626400973807,43.234027474016436],[-79.686511382981209,43.234027143764635],[-79.686408220231769,43.234053963261317],[-79.686277534727282,43.234020496111071],[-79.686167391522275,43.233988165230272],[-79.686066786234392,43.23395900536395],[-79.685958941830364,43.233945790380155],[-79.685947275867335,43.233978613086535],[-79.685920112872878,43.233970376999864],[-79.685920737748205,43.233941299414646],[-79.685832744798176,43.233898327155948],[-79.68572328886971,43.233897069513887],[-79.68560480990952,43.233868694366649],[-79.685492237018011,43.23388640032978],[-79.685373968406722,43.233853975303951],[-79.685253854696754,43.233838637632196],[-79.685221023604086,43.233836279244123],[-79.685198758031873,43.233921026452911],[-79.685034040201501,43.233941104054466],[-79.684921703224944,43.233947826591091],[-79.684810677977822,43.233956545105634],[-79.684742901515847,43.233992864595727],[-79.684699286722619,43.23398227794199],[-79.68456182934105,43.234011762953763],[-79.684427297452913,43.234031196329319],[-79.684321101674243,43.234073015788361],[-79.684262117587238,43.23414140325287],[-79.684185793034061,43.234191491118175],[-79.684133877749886,43.234188911973675],[-79.684073455543256,43.234198211913856],[-79.684040473176466,43.2342028759115],[-79.683988902738506,43.234184273434245],[-79.683940234790583,43.234156699759652],[-79.683878888387284,43.234145998817382],[-79.683836562114109,43.234138488215166],[-79.683810691690709,43.234133147963895],[-79.68378798149044,43.234106862523497],[-79.683784778798028,43.23406684537688],[-79.683771929889119,43.234028699132551],[-79.683783598962478,43.233995786640335],[-79.683589399012803,43.233926557737803],[-79.6834739960522,43.233881197147738],[-79.683375091651129,43.233836026356478],[-79.683253883945184,43.233808607866962],[-79.683136625984858,43.23379222029876],[-79.683095517727565,43.233796789569922],[-79.683061222983042,43.233862397317068],[-79.682991258484918,43.233931648203509],[-79.682932377850392,43.233937992882652],[-79.68293693725353,43.233914994583714],[-79.682962552541255,43.233869276180776],[-79.682873552638924,43.233810261917476],[-79.682772607796295,43.233854122310916],[-79.682750575425047,43.233927886147271],[-79.682728595634089,43.233930604524886],[-79.68271544490031,43.233906500915268],[-79.682717059114211,43.233894453381495],[-79.682594906491587,43.233848023668159],[-79.682498387582044,43.233817917227469],[-79.682381560460229,43.233781543701568],[-79.682273416556811,43.233782278876845],[-79.682224034068682,43.233850774104873],[-79.682182149654381,43.233891353286715],[-79.682148971510401,43.233967960098347],[-79.682076533921915,43.234026194551568],[-79.68212880186816,43.233886686577087],[-79.682020316290235,43.23384041371942],[-79.681908198637359,43.233774108757444],[-79.681798273698661,43.233731781112866],[-79.681686540422803,43.233710503214873],[-79.681569676289314,43.233670166422272],[-79.681439204858307,43.233632644155925],[-79.681369849068147,43.233610773914833],[-79.681304258652773,43.233734100717058],[-79.681221984858126,43.23374017571247],[-79.68126105703908,43.233641575926264],[-79.681137703167948,43.233588107241992],[-79.681025198594355,43.233539806093141],[-79.680976208231399,43.233527265071601],[-79.680920502201886,43.233637649012991],[-79.680869683593812,43.233647058013318],[-79.680892322069496,43.233545297315345],[-79.680805689589789,43.233502246835499],[-79.680682616094415,43.233435814312173],[-79.680635110359546,43.233417257206639],[-79.680580984492906,43.233391600150739],[-79.680511627351251,43.233369819419202],[-79.680478689884822,43.233372410956562],[-79.680456487541889,43.233391154466013],[-79.680424752869044,43.233400783428834],[-79.680394926919945,43.233390444257189],[-79.680398175654588,43.233365449031638],[-79.68040116406705,43.233352516927205],[-79.68037408955044,43.23334022848767],[-79.68032671415277,43.233315639695363],[-79.6801694353111,43.233247821463429],[-79.680124659915634,43.233228305148202],[-79.680021394917048,43.233197038222528],[-79.679898107182495,43.233140597454891],[-79.679804623990734,43.233095486143377],[-79.67970998098005,43.233041356796626],[-79.679578826440491,43.232972848798063],[-79.679489406712847,43.232927784137445],[-79.679382452228438,43.232873512383314],[-79.679278026385361,43.23283331685758],[-79.67917160601678,43.232817050363501],[-79.679171563238768,43.232819030875163],[-79.679130275472147,43.232894642714676],[-79.679065235801971,43.232866877901344],[-79.678965226492878,43.23280467189587],[-79.678907145890662,43.232774015857515],[-79.678810998156962,43.2327268919517],[-79.678712250865388,43.232674695375692],[-79.678604713942789,43.232647429879187],[-79.678493524659316,43.232601122438226],[-79.678400195101688,43.23254898818665],[-79.67829871649846,43.232497839342265],[-79.678217741978358,43.232443867601845],[-79.678128988140273,43.232373776862232],[-79.67802886434626,43.232322644335362],[-79.677928230298505,43.232289424920417],[-79.677878247027806,43.232322884455726],[-79.677855214998871,43.232311632649022],[-79.677876575822182,43.232274869871148],[-79.677783745567638,43.232199690083462],[-79.677767565426578,43.232190498471105],[-79.677738020828244,43.23216719527499],[-79.677694878218389,43.232140583270791],[-79.677665887948379,43.232122685605553],[-79.67766419994534,43.232121643171439],[-79.677656961786155,43.232117175165847],[-79.677630794049406,43.232101046204178],[-79.677621812536785,43.232096785856825],[-79.677541970038348,43.232058854861506],[-79.677503642773161,43.232054448805904],[-79.677481656125877,43.232063199160265],[-79.677450995643085,43.232085806303893],[-79.677427638619335,43.232089589188448],[-79.677418310361659,43.232082457760065],[-79.677416041316803,43.232056408310434],[-79.677414025840179,43.23202432872948],[-79.677406078696123,43.232010279749517],[-79.677398213806214,43.23199812177976],[-79.677367127750983,43.231977773072487],[-79.677107653864141,43.231829708708062],[-79.677077359489402,43.231835391391066],[-79.676968486501977,43.231813061417022],[-79.67687522373771,43.2317579551815],[-79.676765650774215,43.231699688674041],[-79.676663785333034,43.231666543945501],[-79.676547082423156,43.231619090269938],[-79.676460974062636,43.231552089494699],[-79.676377401015699,43.231493133863516],[-79.676285407845711,43.231442002948867],[-79.676278958634754,43.231438416529308],[-79.676189517919539,43.231388847654983],[-79.676098682494839,43.231346825507948],[-79.675997252645445,43.231293605029848],[-79.675962365760469,43.231261144915379],[-79.675964152738075,43.231241175449455],[-79.675949543759344,43.231222006690707],[-79.675831811556463,43.231159592777935],[-79.675735473824645,43.231121468654145],[-79.675676688498996,43.231117816530812],[-79.675655839823747,43.231136574787087],[-79.675638952308802,43.231154388401023],[-79.675592342426327,43.23116285328944],[-79.675558225215411,43.231157415681842],[-79.675502450641034,43.231139841243305],[-79.675459569062468,43.231101255334572],[-79.675438217847201,43.231074984867419],[-79.675401715821749,43.231054572005227],[-79.675329080392004,43.230996731872033],[-79.67523328537284,43.230933580897243],[-79.675103242876503,43.230871023653648],[-79.675009802092916,43.230829960964854],[-79.674892797792879,43.230796549241497],[-79.674769703509327,43.23079413261658],[-79.6746873138013,43.230743202626812],[-79.674580512040166,43.230687937640184],[-79.674473437113846,43.230639602909406],[-79.674359046579326,43.230616306052134],[-79.674277154933932,43.230667403354062],[-79.674159608793389,43.230659017314011],[-79.674044677686695,43.230660656544131],[-79.674021209631292,43.230663896272247],[-79.673932150600919,43.230676370663765],[-79.673849337629989,43.230707466824576],[-79.673723976288372,43.230872057616899],[-79.673673527967011,43.230864449076002],[-79.67367278089408,43.230836436191709],[-79.673707062409477,43.230771820689853],[-79.673577476800148,43.230688286354876],[-79.673488557080631,43.230626204151356],[-79.673413172493497,43.23057031192365],[-79.673332573997584,43.230499321534147],[-79.673234485408969,43.230417142631708],[-79.673134999851584,43.230336928445155],[-79.673087987354307,43.23029585438556],[-79.673040974568394,43.230254796511325],[-79.67294138013493,43.230179623453097],[-79.6728444299915,43.230107452498508],[-79.672758306334188,43.230041440153663],[-79.67265703984279,43.229975252017958],[-79.672574783934166,43.229918288991605],[-79.672489864620573,43.22985922394215],[-79.672406356411088,43.229803235862413],[-79.672294047584543,43.22974088215031],[-79.672191615480457,43.229671707660515],[-79.672096810605225,43.229625585092407],[-79.672033980270143,43.229558762071342],[-79.671972459372753,43.229494024370233],[-79.67188090494561,43.229422996690559],[-79.671801744094822,43.229354002012542],[-79.671747168806135,43.229281332570807],[-79.671644108467063,43.229241145923226],[-79.671567228414517,43.229186225606604],[-79.671477197280609,43.229113142440056],[-79.671408740078817,43.229050306675184],[-79.67130460971083,43.228997050658293],[-79.671220849589545,43.228947092747674],[-79.671116684473148,43.228889784096765],[-79.671039883457084,43.228836935394341],[-79.670950925969976,43.228776831774212],[-79.670860381762822,43.2287217522086],[-79.670751804494216,43.22868050924319],[-79.670629084546974,43.228661074769825],[-79.670612074663381,43.228627830282761],[-79.670589481748806,43.228596501910111],[-79.670481513482741,43.228527262436607],[-79.670409081451922,43.228460416053672],[-79.670317250531397,43.22840225954377],[-79.670215656438813,43.228357046989721],[-79.67018450203534,43.22834569920461],[-79.670113872280965,43.228382877337481],[-79.670101952716209,43.228364729599029],[-79.670143839185215,43.228324245781941],[-79.670077121932124,43.228249452458307],[-79.66998935428424,43.228191342928113],[-79.669886645447448,43.228135130635785],[-79.669794596226424,43.228087056291116],[-79.669698586094214,43.228039926308519],[-79.669605053716381,43.227997777581457],[-79.669555413167089,43.227953167811776],[-79.669539827828046,43.227979009752147],[-79.669511345217899,43.227963730847677],[-79.669517169116176,43.22795074195605],[-79.669496740998198,43.227944471267996],[-79.669459328265091,43.227966097281346],[-79.669443389438655,43.22794592171244],[-79.669470301708898,43.227903192896264],[-79.669380065668534,43.227834068600188],[-79.669272968287714,43.227792842344684],[-79.669183542287271,43.227748760039418],[-79.669094717506567,43.227682713493131],[-79.669012381811996,43.227629708977581],[-79.668916271450257,43.22758158666683],[-79.668877017932502,43.227501079170267],[-79.668775208944169,43.227465857012412],[-79.668699774120924,43.227406989565559],[-79.668609357091484,43.227351909691428],[-79.668524227650963,43.22730283431757],[-79.668431044120368,43.227244750587566],[-79.668346396961113,43.227235751063077],[-79.668315265043717,43.227223412526286],[-79.668332269566378,43.227194615762336],[-79.668229652148582,43.227134350981871],[-79.668144674260816,43.22707834356477],[-79.668104034539752,43.227055899180428],[-79.668020564535482,43.227122911753085],[-79.667997753920915,43.227101665454676],[-79.668032697424138,43.227069025578245],[-79.667940804207234,43.22701392798389],[-79.66785390592355,43.226983921214],[-79.667796788403777,43.227028278864339],[-79.667775455195738,43.227007049728819],[-79.667823829762952,43.226965183580148],[-79.667825657112232,43.226963602048158],[-79.667839417060051,43.226951484565348],[-79.667861523347668,43.226932017501127],[-79.667731086200021,43.226858576033678],[-79.667671991449907,43.226850005999246],[-79.667620398155407,43.226868124638315],[-79.667615848968822,43.226870519090795],[-79.667561791897725,43.226898969670337],[-79.667501564935733,43.226880533550094],[-79.667525385630739,43.226838446314076],[-79.667542150455859,43.226811055189778],[-79.667480058255194,43.226777630821246],[-79.667463579787139,43.226768760237391],[-79.667402317360342,43.226736026239415],[-79.667341053748814,43.226703293095206],[-79.667322465323636,43.226692021599767],[-79.667259995093033,43.226654143545169],[-79.667239994476503,43.226642016355186],[-79.667214968963307,43.226629250716321],[-79.667189943460613,43.226616485072078],[-79.66713989127534,43.226590952852938],[-79.667121401973219,43.226581521214541],[-79.667096452481886,43.226567190539498],[-79.667071502982694,43.226552860759369],[-79.667021602808049,43.226524200268528],[-79.66694066255593,43.226467098127728],[-79.666866673661715,43.226454115637523],[-79.666774586202479,43.226408019417278],[-79.666677211719502,43.226355918471576],[-79.666625806388637,43.226330286511008],[-79.666600857380033,43.226345033316235],[-79.666573769159456,43.226333641901761],[-79.66660740838762,43.226293063223764],[-79.666516054853133,43.226218971112672],[-79.666422941630231,43.226157825004314],[-79.666321244286365,43.226117649442926],[-79.66622339363397,43.226087423682543],[-79.66607623205816,43.226059774384289],[-79.66597166244857,43.226021455976777],[-79.665868589874748,43.225982254477032],[-79.665764018567572,43.22594402590552],[-79.665660817699745,43.225972807287974],[-79.66556128445437,43.226019730567714],[-79.665465485787578,43.225957561846073],[-79.665359867055855,43.225905273542388],[-79.665280411659197,43.225850318933588],[-79.665188304714945,43.225805211710686],[-79.665080799221855,43.225782976422423],[-79.665048083394097,43.225775571027931],[-79.66508359350911,43.225717005473861],[-79.664991465299096,43.225672888347404],[-79.664893810571044,43.225633749203006],[-79.664767582606544,43.225589233865108],[-79.664631359593045,43.225562610856421],[-79.664521133401792,43.225535300714668],[-79.664404209833364,43.225560948331328],[-79.664402788828525,43.22556399419588],[-79.664379914951724,43.225607759491467],[-79.664356801478462,43.225600466024446],[-79.664366164097913,43.225549518491455],[-79.664227909324694,43.225491896427499],[-79.664126158330049,43.22544865582951],[-79.664010319341685,43.225430285122023],[-79.663892675523911,43.225364888413452],[-79.663793842908021,43.22531771959482],[-79.663704699058528,43.225266703669043],[-79.663618112219382,43.225222650173826],[-79.663492156357194,43.225160127448845],[-79.663389982659993,43.225141914885903],[-79.663321581530724,43.225077093005019],[-79.663203930423265,43.225017728569],[-79.663103790004257,43.224968473715627],[-79.662996338804788,43.224938223027003],[-79.662966052308434,43.224932376211648],[-79.662885982653009,43.224916942857909],[-79.662809291102249,43.224854004762008],[-79.662699242202905,43.224818680861027],[-79.662590452206572,43.224793365756462],[-79.662482389385346,43.224791111675025],[-79.66241395179064,43.224761804684888],[-79.662345513927519,43.224732512958397],[-79.662243698596015,43.224692332388841],[-79.66220840738373,43.22467886209273],[-79.662186070815224,43.224703634476271],[-79.662153596143924,43.224685245487471],[-79.662175006872147,43.224646505183372],[-79.662078820004893,43.224602339137739],[-79.661932343387207,43.224543626720404],[-79.661826314622672,43.224510330015157],[-79.661763888941834,43.224549580000804],[-79.661705739317753,43.224641015597037],[-79.661681491019621,43.224623714128754],[-79.661735708290578,43.224526288613305],[-79.661615206788326,43.224467879695325],[-79.661466221664043,43.224400042703181],[-79.661356479747539,43.224350764003596],[-79.661248855178371,43.22432852371962],[-79.66118979027145,43.224399868130824],[-79.661074764097322,43.224344495142248],[-79.660966159952579,43.224305134424334],[-79.660864432978002,43.224260991645572],[-79.660772257750637,43.224224884642531],[-79.660671637707935,43.22419768326241],[-79.660564997196047,43.224192382467479],[-79.660455492725902,43.224194161650765],[-79.660462185106979,43.224265286159579],[-79.66042660866394,43.22426486951403],[-79.660411813296093,43.224192659601108],[-79.660292253814262,43.22415316993861],[-79.660173366356887,43.224144843868736],[-79.660085472961924,43.22409879138452],[-79.659983741897264,43.224060500751193],[-79.659853333441603,43.224016021057103],[-79.659735083424764,43.22397861720755],[-79.659624578317676,43.223964265672826],[-79.659526797664199,43.223931153535993],[-79.659480310801001,43.223928537680017],[-79.659355942352036,43.223923118036396],[-79.659240480744771,43.22388772736538],[-79.659145540862468,43.223848615132958],[-79.659053367299734,43.223812506763814],[-79.658959463280056,43.223782321054806],[-79.658045328047038,43.223546575397151],[-79.658001759760012,43.223540031166564],[-79.657883203713268,43.223516668956485],[-79.657763601808028,43.223479247205709],[-79.657637969266389,43.223469758799851],[-79.657474864663527,43.223422821619728],[-79.657348413073819,43.223383338030622],[-79.657235794284972,43.223341945636655],[-79.657097023733087,43.223308350221401],[-79.656974232281712,43.223292861373793],[-79.656843323674735,43.223271334054019],[-79.656745393470828,43.223245151309506],[-79.656636288046968,43.223228832317766],[-79.656498717973705,43.223202273848329],[-79.656332212236549,43.223181318326603],[-79.656202585522919,43.223168719866663],[-79.656059587069677,43.223137054529559],[-79.655919354778561,43.223108393029861],[-79.655780199314876,43.223086767585762],[-79.655639682385839,43.223071068993697],[-79.655490155408188,43.223028340625113],[-79.655352720876579,43.222995659256078],[-79.655222098499792,43.222961166850169],[-79.655070956746087,43.222930304994712],[-79.654952403070652,43.22290693977483],[-79.654844718182034,43.222887664267219],[-79.654733301720043,43.222853307121397],[-79.654599797607489,43.222826704142818],[-79.654478381705601,43.222810328337744],[-79.65436246372353,43.222795908045711],[-79.654249341107274,43.222777558509549],[-79.654126484174427,43.222765127391973],[-79.653984114917321,43.22276651367342],[-79.65386764642804,43.222777119134904],[-79.653759213254389,43.222791871112356],[-79.653652399612909,43.222794575912353],[-79.653637292425984,43.222798450151146],[-79.653624344568044,43.222827292492184],[-79.653610186068121,43.222911138565181],[-79.653555386289227,43.222978568127409],[-79.653518094686106,43.223056108804663],[-79.653464240311536,43.223136516045024],[-79.653446117688674,43.223154311857932],[-79.653416190455204,43.223149007018208],[-79.653438101273423,43.223082180847527],[-79.653277687447471,43.223036259864699],[-79.653169384499947,43.223045069791844],[-79.652807036411645,43.22309978261125],[-79.65249021631152,43.223072008424268],[-79.65240427658695,43.223122051917564],[-79.652287938086801,43.223126714276795],[-79.652174440649702,43.223125376927392],[-79.652052608293928,43.223127903256511],[-79.651932040747653,43.223134496423114],[-79.651801629385844,43.223151959022168],[-79.651679787126056,43.2231605179052],[-79.651575216628956,43.223184317920435],[-79.65146573773302,43.223185008248585],[-79.651350907966602,43.22318266386997],[-79.651225231550981,43.223175238955719],[-79.651114597092672,43.223166910742357],[-79.651006670868838,43.223158613461912],[-79.650882437988571,43.223147153135173],[-79.650744497472445,43.223137511985279],[-79.650619833771984,43.223140004289171],[-79.650488498920097,43.223143496497464],[-79.650367623357724,43.223164041477254],[-79.650246966196946,43.223174684770008],[-79.650148869573727,43.223217558634794],[-79.650041560359398,43.22324825845115],[-79.65002011867405,43.223288076664709],[-79.650030611621531,43.223309181174507],[-79.649993328172769,43.223324768386192],[-79.649964162178506,43.223279402153892],[-79.649855607954862,43.223305134582169],[-79.649788350813353,43.223373314839002],[-79.649766053481031,43.223396104250213],[-79.649662608640739,43.223368859842132],[-79.649675492918504,43.223342987815336],[-79.649566013742785,43.223343677221081],[-79.649474565474307,43.223397705529614],[-79.649349539347739,43.223422162438652],[-79.649147907538477,43.223441841650072],[-79.649145553190039,43.22342578659638],[-79.649083782703727,43.223435052147423],[-79.649076040042132,43.223478993088577],[-79.649047322185694,43.223474691893109],[-79.649040191702312,43.223429583884169],[-79.648956885226681,43.223421577250889],[-79.648905694805961,43.223447985426191],[-79.648239531172891,43.223627229772781],[-79.648253134939523,43.223691413988689],[-79.648218825577047,43.22369497053355],[-79.648191535844191,43.223631615971932],[-79.648099794292904,43.223637554364764],[-79.648068125506569,43.223644203630386],[-79.648062378831625,43.22365908330621],[-79.648045706349905,43.223666900317745],[-79.64801697825645,43.223668632710009],[-79.647987208486626,43.223656213794541],[-79.647871415203838,43.223691854748978],[-79.647778722283789,43.223740824418122],[-79.647758125611574,43.223803612963039],[-79.64765013310398,43.223798284141338],[-79.64755100998309,43.223826196934112],[-79.647511150735042,43.223835720710909],[-79.647504607729118,43.2238866092504],[-79.647475756439817,43.223888339149248],[-79.647473955892508,43.223847256986609],[-79.647405346546492,43.223859502317652],[-79.647286955844052,43.223890068498889],[-79.647233189479451,43.223910413291378],[-79.647224414489017,43.223995402763002],[-79.647193023819057,43.223995031504693],[-79.647187346632549,43.22393994639458],[-79.647069188280696,43.223965562580268],[-79.646948067093973,43.223997086616016],[-79.646848790004228,43.2240319305008],[-79.64684180674945,43.224035899946983],[-79.646819225229137,43.224132702136323],[-79.646839550453336,43.224137895107916],[-79.646825310717134,43.224163749873497],[-79.646776203756289,43.224157135842439],[-79.646779796216506,43.224117198024175],[-79.646669027327675,43.224114896984567],[-79.646562266605073,43.22412065733819],[-79.646447180820601,43.2241242480236],[-79.646365398285511,43.224175326656997],[-79.646344180444288,43.224266111821194],[-79.646316873899693,43.224264798152653],[-79.646323087234322,43.224228853381092],[-79.646191528745035,43.224242333982183],[-79.646075446432491,43.224290935379109],[-79.64596544507252,43.22432069903364],[-79.645910378047375,43.224333013731489],[-79.645908742922259,43.22446806301371],[-79.645888373829266,43.224464850364221],[-79.645883986137633,43.224412751971357],[-79.64575782170833,43.224427286433666],[-79.645656167893492,43.224447063496768],[-79.645562327754618,43.224480980132945],[-79.645555491388151,43.224483870690328],[-79.645565150248302,43.224537022016285],[-79.645518473800948,43.22454853542294],[-79.6454974707096,43.224507225841037],[-79.645389365570225,43.22450693611151],[-79.645280817819739,43.224526631195452],[-79.64515713993697,43.224551189523325],[-79.645052709697254,43.224573994717758],[-79.644931207398656,43.224622620788843],[-79.644818176115351,43.224661261970255],[-79.644716188528207,43.224696071881901],[-79.644605532095483,43.224749778631868],[-79.644506186677418,43.224787590273749],[-79.644383594734649,43.224824227662502],[-79.644272381765518,43.224841909192548],[-79.644152898934024,43.224860483088733],[-79.644030508240121,43.224888026061983],[-79.643926320493193,43.224899848418737],[-79.643823978736989,43.224950591429888],[-79.64374623336245,43.225002706547876],[-79.643620721376479,43.225043269604257],[-79.643522918002517,43.225078127164842],[-79.643414035233718,43.225112855038518],[-79.643303997903999,43.22513856363895],[-79.643190031882369,43.225158192465635],[-79.64307596265796,43.225176919496789],[-79.642952394473454,43.225196434173455],[-79.642828758301093,43.225219009464837],[-79.642703614092781,43.225248500249194],[-79.642577337388573,43.225267982379265],[-79.642460616690059,43.225289648838327],[-79.642332884572852,43.225308122921206],[-79.642210779947732,43.225322701651571],[-79.642098145408866,43.225343335696998],[-79.641980182199561,43.225359944352817],[-79.641874871871153,43.225355722467704],[-79.641809123994761,43.225360973941413],[-79.641698243192863,43.225363620170171],[-79.641586296162373,43.225353286142294],[-79.641487147334658,43.225321132851725],[-79.641391685098043,43.22530595186258],[-79.641289650560225,43.225342739157611],[-79.641236088130469,43.225409186958032],[-79.641223311857914,43.225430015840047],[-79.641155343764368,43.22547423036486],[-79.641147861290293,43.225567159614073],[-79.641130431445887,43.225609003901106],[-79.641030128404708,43.225628792889275],[-79.640970238787119,43.22573613619339],[-79.640946939245794,43.225742882921239],[-79.640920907235426,43.225739602101193],[-79.640919775122171,43.225729593573526],[-79.640950293604732,43.225652877048546],[-79.640851322675175,43.225612711251763],[-79.640799427892702,43.225604080521556],[-79.640727726498909,43.225755315697796],[-79.640633727971689,43.225735198955462],[-79.640530940803743,43.225683911903076],[-79.640411011600563,43.225661505770411],[-79.640319811658543,43.225637369977754],[-79.64027032408238,43.225647856416572],[-79.640249509921162,43.225725589481222],[-79.640279413166397,43.225731978028804],[-79.640244556227032,43.225826561896177],[-79.64022133360038,43.225824304817749],[-79.640213329792587,43.225813224088292],[-79.640191483330611,43.225809992861002],[-79.640200910076146,43.225757067997613],[-79.640094535300818,43.225739775187265],[-79.639999303026201,43.225780694257203],[-79.639937994274504,43.225829940649227],[-79.639940324238921,43.225846986995876],[-79.639910196778771,43.225850680814645],[-79.639895301202074,43.225839428067751],[-79.639821126506646,43.225852593162664],[-79.639779823738237,43.225805098127864],[-79.639738497797211,43.225819554260646],[-79.639680142617465,43.225796889105631],[-79.639582346892553,43.225825711213432],[-79.639572722758857,43.225826587248719],[-79.639605566162274,43.225889018481418],[-79.639572140723274,43.225913654539966],[-79.63954219482973,43.225848285352022],[-79.639429490400644,43.225871977486911],[-79.639320449798859,43.225913632194263],[-79.639252022231361,43.225972878650857],[-79.639245007163424,43.225983780772602],[-79.639262552238065,43.226053054567288],[-79.639242138937703,43.226051821214206],[-79.639228154699467,43.225999608420395],[-79.639108456810561,43.226033212111894],[-79.639005098715415,43.226062958045887],[-79.638960996017218,43.226080442410698],[-79.638957438374703,43.226179450366651],[-79.638924769758816,43.226170057058404],[-79.638904303488417,43.226104800509738],[-79.638761404577508,43.226135156240268],[-79.638733177128657,43.226108797090838],[-79.638632828460729,43.226130564434435],[-79.638550814395771,43.226191629765033],[-79.63845281513052,43.226229543097425],[-79.638343086452963,43.226241203454684],[-79.638237420192979,43.226252912071899],[-79.638130677186311,43.226257674251187],[-79.638035476073611,43.226291568483894],[-79.637921772962812,43.226299219100142],[-79.637809468086942,43.226304905249577],[-79.637668290492726,43.226313218911592],[-79.637548926049149,43.226331787304048],[-79.637469740508507,43.22638189997047],[-79.637469696390042,43.226383880450541],[-79.637485497130513,43.226476095387063],[-79.637459654298226,43.226469844524281],[-79.637444718429933,43.226399611040137],[-79.63742005330873,43.226401298220289],[-79.637396720280975,43.226403991767022],[-79.637411254999449,43.226492229620163],[-79.637424625344721,43.226566406469153],[-79.637393154498923,43.226564050557727],[-79.637276168550372,43.226536633642276],[-79.637155950118455,43.226527187233643],[-79.637017691629509,43.226531572861049],[-79.636898335884084,43.226544197659635],[-79.636788562241023,43.22655783699264],[-79.63670527991188,43.226614923864709],[-79.636723931630414,43.226695196803263],[-79.636716737449746,43.226714110700549],[-79.636667495209636,43.226713523778741],[-79.636654231809743,43.226695356547033],[-79.63664305900835,43.226644167459263],[-79.636529745733512,43.226628769635774],[-79.63640847281475,43.226611385849253],[-79.6362925175832,43.226592984786272],[-79.636177660308164,43.226591615335387],[-79.636060015783244,43.226588231526861],[-79.635933310754751,43.226626700842409],[-79.635828472161421,43.226667501863041],[-79.635737705937998,43.226745389372304],[-79.635670148852853,43.226831657762304],[-79.635624381329251,43.226918186027895],[-79.635614493177243,43.226997128199564],[-79.635507627630105,43.227001796419486],[-79.635393215508302,43.22698044134534],[-79.6352590867169,43.22698181255933],[-79.635146444927329,43.22700252970111],[-79.635042219374398,43.22701029054155],[-79.634939181752813,43.227031032044202],[-79.634833222202232,43.227055790635852],[-79.634771695591979,43.227120069268878],[-79.634740662441459,43.22715877868724],[-79.634703909369463,43.227150325924555],[-79.634690489724122,43.227139180166105],[-79.634629035331386,43.227073343558061],[-79.63451683934575,43.227074075256489],[-79.634382197811178,43.227098400971713],[-79.634286880812752,43.227137333248031],[-79.634185879646338,43.227188173646738],[-79.634145985281478,43.227259733812772],[-79.634116936747546,43.227336375993922],[-79.63410373144508,43.227376288631582],[-79.634053134550783,43.227375684406127],[-79.633993302200111,43.22729789075381],[-79.63387625971616,43.22726749818019],[-79.633783358497567,43.227264407551807],[-79.633810895022407,43.227376753294394],[-79.633779244956045,43.22738240831351],[-79.633752863578778,43.227278990884621],[-79.633699445811772,43.227283395366506],[-79.633596215817249,43.227307194911852],[-79.633507168484016,43.227374115596433],[-79.633422395092481,43.227437125264274],[-79.633324302235224,43.227478995076524],[-79.633285547261579,43.22749951264867],[-79.633171090641241,43.227535243783763],[-79.633073267057952,43.227565050475832],[-79.632944205983748,43.227587550224179],[-79.632832918538412,43.227608191222792],[-79.632703813016533,43.227632671173026],[-79.632466572121032,43.227713037162232],[-79.632410283982964,43.22778521111767],[-79.632393431061928,43.227867041224997],[-79.632398478897841,43.227944180678449],[-79.632379767016928,43.227987989280201],[-79.632363484246099,43.227983742533553],[-79.632350030320637,43.227968634082778],[-79.632346213350161,43.227957602870624],[-79.632332961649084,43.227878384315119],[-79.632317304975672,43.227846140843084],[-79.632299587230165,43.227839985969588],[-79.632272370069614,43.227834617958834],[-79.632161259132744,43.227847336392919],[-79.632062193144378,43.227872084801383],[-79.632060210763342,43.227900155343434],[-79.632070653926789,43.227923241886131],[-79.632086332635595,43.227954495152488],[-79.632113273181389,43.228032796894801],[-79.632118443780143,43.228109937826076],[-79.632111169191347,43.228126869460169],[-79.632098679176934,43.22813473415399],[-79.63207704606998,43.228127451873178],[-79.632062262157064,43.228111246934958],[-79.632059956470499,43.228093210225524],[-79.632056318744191,43.22807416708288],[-79.632025172449687,43.22799671548416],[-79.631992738493381,43.227916276968145],[-79.631988014415171,43.227885244755107],[-79.631977325633571,43.227873140839435],[-79.631875292442544,43.227848868749874],[-79.631759044340683,43.22784351621106],[-79.631649311646214,43.227855170086173],[-79.631558177436233,43.227894150117507],[-79.631468377153709,43.227934046492642],[-79.631410964881724,43.227990358462982],[-79.631399357617624,43.22801930432999],[-79.631446944993641,43.228093891263249],[-79.63149184625955,43.228167455535456],[-79.631490323441014,43.228235511841135],[-79.631467011638748,43.228237213926967],[-79.631449418992617,43.228230970373204],[-79.631436090365639,43.228215773269298],[-79.631428176496996,43.22820073099799],[-79.631392924054666,43.22812521110383],[-79.631300815238447,43.228081157158464],[-79.631190287950261,43.228067768387213],[-79.631073715307338,43.228082401405977],[-79.630978529732005,43.228115299425042],[-79.630893909920488,43.228171285480627],[-79.630882661083007,43.22818420745535],[-79.630880724497104,43.228210207472429],[-79.630882941169673,43.228232205148593],[-79.630889375591266,43.228247319794249],[-79.63093287776185,43.228322848540856],[-79.63091429973079,43.2283606254407],[-79.630900376547871,43.228366491843836],[-79.630881361212758,43.228363292726179],[-79.630840323616894,43.228298688987813],[-79.630762339661828,43.228239766061641],[-79.630651564306618,43.228237449417016],[-79.630536502642471,43.228245076414325],[-79.630446600258594,43.228283980257928],[-79.630392989384816,43.228357445904805],[-79.630397545496649,43.228401442744328],[-79.630398563031349,43.228416492554189],[-79.630392755019429,43.22842839908116],[-79.63037369534247,43.228427180352725],[-79.630360118977762,43.228423055774272],[-79.630347943178862,43.22841687691519],[-79.63034558140923,43.228395867994422],[-79.630330641355258,43.228331666625145],[-79.630318487753868,43.22832449752638],[-79.630298041532271,43.228319210126799],[-79.630183471642241,43.228304871515405],[-79.630066126881616,43.228293471061406],[-79.62995098631022,43.22829911551942],[-79.629846657254916,43.228316865446111],[-79.629744655336239,43.228351661786505],[-79.629681018669729,43.228377913108076],[-79.629642419257266,43.228391407741483],[-79.629547311187622,43.228426286498404],[-79.629482207196787,43.228457562684817],[-79.629477382071912,43.22849154212868],[-79.6294838948983,43.228508638796242],[-79.62949285987456,43.228531707858771],[-79.629499193172606,43.22855681643788],[-79.629488358115083,43.228611704508651],[-79.629469298402952,43.228610485628998],[-79.629448985308343,43.22859925665955],[-79.629444018380497,43.228579116961612],[-79.629440471620995,43.228490109351448],[-79.629432471466515,43.228478937872879],[-79.629415034305737,43.228465762353849],[-79.629300129457874,43.228466366423305],[-79.629179817887447,43.228460962565308],[-79.629070150243905,43.228469643234114],[-79.628945217098618,43.22848912638343],[-79.628832279911649,43.228522800325159],[-79.628818346401374,43.228534609363791],[-79.628772680944024,43.228616093511306],[-79.628734042691491,43.228691718873499],[-79.628718530876824,43.228713504045359],[-79.6287005670074,43.228718331234312],[-79.628685862564225,43.22870410781946],[-79.628683580060581,43.228685080821009],[-79.628729312296898,43.228600626004223],[-79.628744862559898,43.228516709787996],[-79.628712283157952,43.22850335262649],[-79.628588994715415,43.228509888529686],[-79.628502961517356,43.228562884354439],[-79.628495584904499,43.228589809599967],[-79.628486821820985,43.22861266616539],[-79.628478169763326,43.228630571550333],[-79.628469640809541,43.228648478410683],[-79.628439141942238,43.228663150318006],[-79.628414766424697,43.228651872451373],[-79.62842766077982,43.228626003879199],[-79.628467720182499,43.228547424154705],[-79.628443568793969,43.228526153913712],[-79.628348193923586,43.228507001077844],[-79.628325170065651,43.228561742867264],[-79.62799191964956,43.228469681292822],[-79.628035572313834,43.228357197607245],[-79.627835849104414,43.228290779325199],[-79.627312054659853,43.228162392476598],[-79.627274059015875,43.228148969904034],[-79.627178005832008,43.228099732701217],[-79.627078702859734,43.228074588646734],[-79.627037174393195,43.228032038841917],[-79.626953812294374,43.227966025203393],[-79.626867810727802,43.227896918264292],[-79.626784313574305,43.227836935939379],[-79.626743232224655,43.227807394888941],[-79.626702150550869,43.227777870028],[-79.626639556078672,43.227763161394257],[-79.626611957427457,43.227774806086671],[-79.626589684517143,43.227790566775944],[-79.626573177833052,43.227796311585251],[-79.626568074450262,43.227782293227953],[-79.626578048977024,43.227760351810559],[-79.626573147747422,43.22773733131438],[-79.626562933113263,43.227704161901933],[-79.626554931567199,43.227693080250532],[-79.626453687385748,43.227633785036389],[-79.626365746352576,43.227590767670229],[-79.62627228990398,43.227546603447081],[-79.626170617558785,43.227506392520645],[-79.626093961239434,43.227443430302806],[-79.626045618540758,43.227402779288617],[-79.62601329893667,43.227383391418456],[-79.625935242248218,43.227322483321906],[-79.625831088693388,43.227272157170852],[-79.625744593812158,43.227225104644944],[-79.625630877911092,43.227227700320313],[-79.625530425151069,43.227193536538181],[-79.625445464840212,43.227138488161728],[-79.625353442515831,43.227096321425662],[-79.625294906980258,43.227021600374364],[-79.625245815987441,43.226954016370975],[-79.625143777359511,43.226924695654141],[-79.625039556337342,43.226877429522808],[-79.624941723757402,43.226847258729684],[-79.624829957404756,43.226828896404989],[-79.624801015171244,43.226834581494096],[-79.624789653990504,43.226852454031807],[-79.624749682146799,43.226926981481299],[-79.624704089113408,43.227010535939797],[-79.624662162139515,43.227046050073184],[-79.624638815846254,43.227054773915029],[-79.624616971865564,43.227051449697242],[-79.62459927944613,43.227044213387764],[-79.624596907168041,43.227029237280298],[-79.62464639242387,43.226958786289195],[-79.624702737422666,43.226884455747395],[-79.624736889859975,43.226827777432533],[-79.624719409658937,43.226816581683501],[-79.624623405186938,43.226765361911241],[-79.624494574363254,43.22671185634217],[-79.624395973294938,43.22665565264046],[-79.624294261171741,43.226617330524697],[-79.624273431349707,43.226629146112515],[-79.624258052143134,43.226644989265345],[-79.624204415146821,43.226719352163094],[-79.6241306467481,43.226774473240056],[-79.624109072231875,43.226759176092202],[-79.624116573632421,43.226732252625396],[-79.624177117185226,43.226651939784951],[-79.6242111322764,43.226601383079391],[-79.624196587333174,43.226580137440514],[-79.624111651361872,43.226524097861009],[-79.624020236726366,43.226476894802637],[-79.623996621787768,43.22646472468562],[-79.623862646971418,43.226399090400101],[-79.623761024741569,43.226356806881292],[-79.623645488952235,43.226325430566654],[-79.623599211275135,43.226321606832954],[-79.623588090457645,43.226320688711368],[-79.623546895780336,43.226337717670518],[-79.623534005612399,43.226374329099599],[-79.623493082220349,43.226405455253079],[-79.623446542747729,43.226418130978075],[-79.623444205025407,43.226387954650868],[-79.623466191793312,43.226349247489026],[-79.623497570692294,43.226340065872463],[-79.623531072860374,43.226299021923147],[-79.623431030085811,43.226246761147614],[-79.623330782819139,43.226203593337146],[-79.623308661083499,43.226197143642814],[-79.623272674012341,43.226186649688991],[-79.623256780337329,43.226182015531009],[-79.623235814735679,43.226176556734067],[-79.623207810040668,43.22616926361642],[-79.623179805332214,43.22616197139223],[-79.623124813598054,43.226148073615981],[-79.623065411192997,43.226151402482529],[-79.623022633381183,43.226197948078081],[-79.6230198829725,43.226201810342992],[-79.62300082721589,43.226228568526224],[-79.622971195011885,43.226249536403415],[-79.622924118963397,43.226263675902118],[-79.622893186916755,43.226253008569984],[-79.622871888020953,43.226238781547821],[-79.622860765945674,43.226219161753619],[-79.622871621345041,43.22618362986168],[-79.622897539171035,43.226149014089408],[-79.622962557304604,43.226088062452845],[-79.622970921220116,43.226080221117904],[-79.623042072690595,43.226021018124307],[-79.623162126988831,43.225977440486893],[-79.623294912001029,43.225970034226357],[-79.623415351717028,43.225969502797689],[-79.623518764819934,43.225975504459036],[-79.623531033821592,43.225945644382932],[-79.623867419348201,43.226007023192196],[-79.624089860535648,43.226047611148992],[-79.624113285464801,43.225997661847394],[-79.624300511748118,43.226042316364861],[-79.624338135575499,43.225956006257917],[-79.624144624184055,43.225913232892459],[-79.624160726676735,43.225873220285798],[-79.624201318029833,43.225772354913694],[-79.624735001163899,43.225887076317875],[-79.624786370525925,43.225898118541743],[-79.624843452166857,43.225760792704477],[-79.624968253922802,43.225460546372688],[-79.624990077890416,43.225408043753113],[-79.624493933492985,43.225295745172978],[-79.624582457647165,43.225088057666582],[-79.624542530566686,43.225078445103918],[-79.624652872942406,43.224812960235028],[-79.624694568930494,43.224823246859941],[-79.624835923310812,43.224487682021817],[-79.625873400187118,43.224716154048927],[-79.626361829899182,43.224823711245165],[-79.626354270205042,43.224842539060688],[-79.626389767996073,43.224850793037099],[-79.626444393659057,43.224722283866001],[-79.626587274616782,43.224755312979426],[-79.626604234893861,43.224715070796023],[-79.626461339364297,43.224682694360119],[-79.626525937747772,43.224507335258856],[-79.62664969970723,43.224199933900657],[-79.626773460386673,43.223892532375473],[-79.626402424918453,43.223810447896632],[-79.625938909054469,43.223706128354692],[-79.625395041385659,43.223583722718267],[-79.625298058557121,43.22356198891282],[-79.623961610064669,43.22326249178338],[-79.62379750366523,43.22364092636613],[-79.623771085383609,43.22372057000203],[-79.6237349053158,43.223807208885198],[-79.623702821417083,43.223897858154153],[-79.623659883263997,43.223978383530778],[-79.623629333511033,43.224061038068683],[-79.623617520816651,43.224098985258827],[-79.623618402946761,43.224119976524449],[-79.623629111698634,43.224131090962842],[-79.623746889331443,43.224188516582835],[-79.623837529813628,43.224231658500607],[-79.623929716480617,43.224271757393893],[-79.624058438878251,43.224324360950035],[-79.624120767547225,43.224356177386262],[-79.624147715122959,43.224373430127706],[-79.624154192035107,43.224386564664229],[-79.624142194391595,43.224498437207664],[-79.624118549189447,43.224575231906407],[-79.62409276413716,43.224686938591532],[-79.624061696187539,43.22479263870185],[-79.624041641268619,43.224890457218052],[-79.624008111947489,43.224985142125178],[-79.623978388112491,43.225085815817771],[-79.623948018438853,43.22516045852494],[-79.62391012309854,43.225263104939984],[-79.623868122721561,43.225367592911617],[-79.623843100407512,43.225445361475529],[-79.623808927719423,43.225502938849054],[-79.623794789367352,43.225523840331526],[-79.623770826221062,43.225554527725514],[-79.623728029254835,43.225574002925157],[-79.62369462001574,43.225597643124971],[-79.623650580277115,43.22561215082856],[-79.623594062574867,43.225628489366109],[-79.623556998049594,43.225633986355746],[-79.62341605505172,43.22563733272969],[-79.62330404420365,43.225629951545343],[-79.623197336429953,43.225627676643398],[-79.623090650958133,43.225624411407793],[-79.622973020996596,43.225625966824857],[-79.622845799690879,43.225621463624798],[-79.622750017268629,43.225686312937547],[-79.622671949814858,43.225746424776489],[-79.622588229974738,43.225822405678542],[-79.622542759101677,43.225894975184879],[-79.622516427368922,43.225970656628846],[-79.622483369477948,43.22604427605561],[-79.622440539683552,43.226119848832901],[-79.622404637487392,43.226199467039145],[-79.622370102084247,43.22627306863474],[-79.62236390951621,43.226301988756802],[-79.622349725895575,43.226324869615851],[-79.622316327298051,43.226353462048678],[-79.622298229818242,43.226364229639074],[-79.622268170099304,43.226364858069594],[-79.622241110673471,43.226352556055076],[-79.622220890930208,43.226337274869714],[-79.622211716703816,43.226318163822235],[-79.622209413961386,43.226300127849548],[-79.622233196107331,43.22621739220746],[-79.622267835664204,43.226133705890959],[-79.622294256976701,43.2260540644765],[-79.622333081846378,43.225970429450086],[-79.622341686001477,43.225953018298426],[-79.622342995497362,43.225950369619049],[-79.622361824217975,43.225912269357451],[-79.622390566533667,43.225854109256261],[-79.622364923095077,43.225832416351786],[-79.622327715851824,43.225800941167606],[-79.622320095240937,43.225769930393398],[-79.622317639586754,43.225759939962153],[-79.623469851009702,43.223059366461186],[-79.623538759611648,43.222897848685555],[-79.62376724326198,43.22236231364473],[-79.624180716079934,43.221393115301204],[-79.624889271493601,43.219732148635337],[-79.625030049240635,43.219402134847613]]]]}}]} \ No newline at end of file diff --git a/data/DowntownStudySpots_4.js b/data/DowntownStudySpots_4.js new file mode 100644 index 0000000..20f0726 --- /dev/null +++ b/data/DowntownStudySpots_4.js @@ -0,0 +1 @@ +var json_DowntownStudySpots_4 = {"type":"FeatureCollection","name":"DowntownStudySpots_4","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{"1. Name":"Cafe Oranje","lattitude":43.25358,"longitude":-79.86013,"Local or not":"local","Parking":"street","offers free wifi":"yes","bike rack":"yes","person":"Clio","Accessibility Score":3.0},"geometry":{"type":"Point","coordinates":[-79.86013345,43.253583]}},{"type":"Feature","properties":{"1. Name":"Democracy","lattitude":43.25486,"longitude":-79.88626,"Local or not":"local","Parking":"street","offers free wifi":"yes","bike rack":"yes","person":"Jacob","Accessibility Score":3.0},"geometry":{"type":"Point","coordinates":[-79.886257,43.254856]}},{"type":"Feature","properties":{"1. Name":"Detour Cafe Hamilton","lattitude":43.25145,"longitude":-79.86822,"Local or not":"local","Parking":"street","offers free wifi":"no","bike rack":"yes","person":"Clio","Accessibility Score":2.0},"geometry":{"type":"Point","coordinates":[-79.868218,43.251446]}},{"type":"Feature","properties":{"1. Name":"Durand Coffee","lattitude":43.25177,"longitude":-79.87893,"Local or not":"local","Parking":"nieghbourhood","offers free wifi":"yes","bike rack":"yes","person":"Jacob","Accessibility Score":3.0},"geometry":{"type":"Point","coordinates":[-79.878927,43.251766]}},{"type":"Feature","properties":{"1. Name":"Gage Greenhouse","lattitude":43.24063,"longitude":-79.8289,"Local or not":"local","Parking":"free lot","offers free wifi":"yes","bike rack":"yes","person":"Jacob","Accessibility Score":3.0},"geometry":{"type":"Point","coordinates":[-79.828903,43.240633]}},{"type":"Feature","properties":{"1. Name":"Gong Cha","lattitude":43.25961,"longitude":-79.86816,"Local or not":"no","Parking":"street","offers free wifi":"no","bike rack":"yes","person":"Clio","Accessibility Score":1.0},"geometry":{"type":"Point","coordinates":[-79.868158,43.259606]}},{"type":"Feature","properties":{"1. Name":"Hazel Tea & Dessert House","lattitude":43.25752,"longitude":-79.9343,"Local or not":"local","Parking":"free lot","offers free wifi":"yes","bike rack":"no","person":"Clio","Accessibility Score":2.0},"geometry":{"type":"Point","coordinates":[-79.934297,43.257523]}},{"type":"Feature","properties":{"1. Name":"Inclusion Coffeehouse","lattitude":43.25011,"longitude":-79.83018,"Local or not":"local","Parking":"free lot","offers free wifi":"yes","bike rack":"yes","person":"Jacob","Accessibility Score":3.0},"geometry":{"type":"Point","coordinates":[-79.830175,43.250114]}},{"type":"Feature","properties":{"1. Name":"Lukaya Cafe","lattitude":43.23799,"longitude":-79.86714,"Local or not":"local","Parking":"free lot","offers free wifi":"no","bike rack":"yes","person":"Clio","Accessibility Score":2.0},"geometry":{"type":"Point","coordinates":[-79.867142,43.237993]}},{"type":"Feature","properties":{"1. Name":"Mulberry Coffeehouse","lattitude":43.26205,"longitude":-79.86703,"Local or not":"local","Parking":"street","offers free wifi":"yes","bike rack":"yes","person":"Clio","Accessibility Score":3.0},"geometry":{"type":"Point","coordinates":[-79.867034,43.262051]}},{"type":"Feature","properties":{"1. Name":"Paisley Coffeehouse & Eatery","lattitude":43.26235,"longitude":-79.90556,"Local or not":"local","Parking":"street","offers free wifi":"no","bike rack":"yes","person":"Clio","Accessibility Score":2.0},"geometry":{"type":"Point","coordinates":[-79.905558,43.262354]}},{"type":"Feature","properties":{"1. Name":"Redchurch Cafe + Gallery","lattitude":43.25567,"longitude":-79.86721,"Local or not":"local","Parking":"street","offers free wifi":"yes","bike rack":"yes","person":"Jacob","Accessibility Score":3.0},"geometry":{"type":"Point","coordinates":[-79.867205,43.255672]}},{"type":"Feature","properties":{"1. Name":"RELAY Coffee Roasters","lattitude":43.25768,"longitude":-79.86779,"Local or not":"local","Parking":"paid lot","offers free wifi":"yes","bike rack":"yes","person":"Clio","Accessibility Score":3.0},"geometry":{"type":"Point","coordinates":[-79.867785,43.257682]}},{"type":"Feature","properties":{"1. Name":"Second Cup Cafe","lattitude":43.26245,"longitude":-79.90509,"Local or not":"no","Parking":"street","offers free wifi":"yes","bike rack":"no","person":"Clio","Accessibility Score":1.0},"geometry":{"type":"Point","coordinates":[-79.905086,43.262451]}},{"type":"Feature","properties":{"1. Name":"Starbucks Meadowlands","lattitude":43.22644,"longitude":-79.95486,"Local or not":"no","Parking":"free lot","offers free wifi":"yes","bike rack":"yes","person":"Jacob","Accessibility Score":2.0},"geometry":{"type":"Point","coordinates":[-79.954856,43.226435]}},{"type":"Feature","properties":{"1. Name":"SYNONYM","lattitude":43.26475,"longitude":-79.8654,"Local or not":"local","Parking":"street","offers free wifi":"yes","bike rack":"yes","person":"Clio","Accessibility Score":3.0},"geometry":{"type":"Point","coordinates":[-79.8654,43.264746]}},{"type":"Feature","properties":{"1. Name":"The Alley","lattitude":43.26168,"longitude":-79.90706,"Local or not":"no","Parking":"free lot","offers free wifi":"yes","bike rack":"no","person":"Clio","Accessibility Score":1.0},"geometry":{"type":"Point","coordinates":[-79.907061,43.261677]}},{"type":"Feature","properties":{"1. Name":"The Cannon","lattitude":43.24756,"longitude":-79.81753,"Local or not":"local","Parking":"street","offers free wifi":"yes","bike rack":"no","person":"Jacob","Accessibility Score":2.0},"geometry":{"type":"Point","coordinates":[-79.817525,43.247559]}},{"type":"Feature","properties":{"1. Name":"Vintage Coffee Roasters","lattitude":43.25132,"longitude":-79.83539,"Local or not":"local","Parking":"street","offers free wifi":"yes","bike rack":"yes","person":"Jacob","Accessibility Score":3.0},"geometry":{"type":"Point","coordinates":[-79.835387,43.251317]}},{"type":"Feature","properties":{"1. Name":"Williams Fresh Cafe Pier 8","lattitude":43.27652,"longitude":-79.86087,"Local or not":"no","Parking":"free lot","offers free wifi":"yes","bike rack":"yes","person":"Jacob","Accessibility Score":2.0},"geometry":{"type":"Point","coordinates":[-79.860866,43.276518]}}]} \ No newline at end of file diff --git a/data/PublicLibrariesinHamilton_5.js b/data/PublicLibrariesinHamilton_5.js new file mode 100644 index 0000000..589dfeb --- /dev/null +++ b/data/PublicLibrariesinHamilton_5.js @@ -0,0 +1 @@ +var json_PublicLibrariesinHamilton_5 = {"type":"FeatureCollection","name":"PublicLibrariesinHamilton_5","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{"OBJECTID":1.0,"NAME":"Greensville Library","ADDRESS":"625 Harvest Road","COMMUNITY":"Flamborough","BUILDING_S":null,"HOLDINGS":0.0,"CIRCULATIO":0.0,"RANKING":null,"RADIUS_KM":0.0},"geometry":{"type":"Point","coordinates":[-79.983464205213167,43.281475087692279]}},{"type":"Feature","properties":{"OBJECTID":2.0,"NAME":"Parkdale Library","ADDRESS":"256 Parkdale Avenue North","COMMUNITY":"Hamilton","BUILDING_S":1500.0,"HOLDINGS":null,"CIRCULATIO":null,"RANKING":null,"RADIUS_KM":null},"geometry":{"type":"Point","coordinates":[-79.788578786872719,43.243818183259826]}},{"type":"Feature","properties":{"OBJECTID":3.0,"NAME":"Ancaster Library","ADDRESS":"300 WIlson Street East","COMMUNITY":"Ancaster","BUILDING_S":7500.0,"HOLDINGS":58884.0,"CIRCULATIO":247037.0,"RANKING":"-3","RADIUS_KM":2.0},"geometry":{"type":"Point","coordinates":[-79.976660631923636,43.225309173364288]}},{"type":"Feature","properties":{"OBJECTID":4.0,"NAME":"Barton Library","ADDRESS":"571 Barton Street East","COMMUNITY":"Hamilton","BUILDING_S":6272.0,"HOLDINGS":25027.0,"CIRCULATIO":69297.0,"RANKING":"-2","RADIUS_KM":1.0},"geometry":{"type":"Point","coordinates":[-79.841218980779146,43.258031699162828]}},{"type":"Feature","properties":{"OBJECTID":5.0,"NAME":"Binbrook Library","ADDRESS":"2641 Regional Road 56","COMMUNITY":"Glanbrook","BUILDING_S":3192.0,"HOLDINGS":18858.0,"CIRCULATIO":46545.0,"RANKING":"-1","RADIUS_KM":10.0},"geometry":{"type":"Point","coordinates":[-79.803429471869705,43.121704378586742]}},{"type":"Feature","properties":{"OBJECTID":6.0,"NAME":"Carlisle Library","ADDRESS":"1496 Centre Road","COMMUNITY":"Flamborough","BUILDING_S":2491.0,"HOLDINGS":18434.0,"CIRCULATIO":45113.0,"RANKING":"-1","RADIUS_KM":10.0},"geometry":{"type":"Point","coordinates":[-79.981086210694258,43.396053385945095]}},{"type":"Feature","properties":{"OBJECTID":7.0,"NAME":"Concession Library","ADDRESS":"565 Concession Street","COMMUNITY":"Hamilton","BUILDING_S":8380.0,"HOLDINGS":47689.0,"CIRCULATIO":173618.0,"RANKING":"-3","RADIUS_KM":2.0},"geometry":{"type":"Point","coordinates":[-79.851368251374154,43.241041598938686]}},{"type":"Feature","properties":{"OBJECTID":8.0,"NAME":"Dundas Library","ADDRESS":"18 Ogilvie Street","COMMUNITY":"Dundas","BUILDING_S":13712.0,"HOLDINGS":86203.0,"CIRCULATIO":280443.0,"RANKING":"-3","RADIUS_KM":2.0},"geometry":{"type":"Point","coordinates":[-79.954948711901181,43.265483891861457]}},{"type":"Feature","properties":{"OBJECTID":9.0,"NAME":"Freelton Library","ADDRESS":"1803 Brock Road","COMMUNITY":"Flamborough","BUILDING_S":null,"HOLDINGS":0.0,"CIRCULATIO":0.0,"RANKING":null,"RADIUS_KM":0.0},"geometry":{"type":"Point","coordinates":[-80.038766453408741,43.397933408641286]}},{"type":"Feature","properties":{"OBJECTID":10.0,"NAME":"Hamilton Central Library","ADDRESS":"55 York Boulevard","COMMUNITY":"Hamilton","BUILDING_S":146131.0,"HOLDINGS":146131.0,"CIRCULATIO":830909.0,"RANKING":"-5","RADIUS_KM":5.0},"geometry":{"type":"Point","coordinates":[-79.870699715424649,43.258941560533614]}},{"type":"Feature","properties":{"OBJECTID":11.0,"NAME":"Kenilworth Library","ADDRESS":"103 Kenilworth Avenue North","COMMUNITY":"Hamilton","BUILDING_S":8000.0,"HOLDINGS":46702.0,"CIRCULATIO":145651.0,"RANKING":"-3","RADIUS_KM":2.0},"geometry":{"type":"Point","coordinates":[-79.808841629044821,43.243498236900002]}},{"type":"Feature","properties":{"OBJECTID":12.0,"NAME":"Locke Library","ADDRESS":"285 Locke Street South","COMMUNITY":"Hamilton","BUILDING_S":1451.0,"HOLDINGS":23853.0,"CIRCULATIO":92902.0,"RANKING":"-2","RADIUS_KM":1.0},"geometry":{"type":"Point","coordinates":[-79.887022038150107,43.251822854048491]}},{"type":"Feature","properties":{"OBJECTID":13.0,"NAME":"Lynden Library","ADDRESS":"110 Lynden Road","COMMUNITY":"Flamborough","BUILDING_S":4000.0,"HOLDINGS":0.0,"CIRCULATIO":0.0,"RANKING":null,"RADIUS_KM":0.0},"geometry":{"type":"Point","coordinates":[-80.146595370182069,43.236560205307562]}},{"type":"Feature","properties":{"OBJECTID":14.0,"NAME":"Mount Hope Library","ADDRESS":"3027 Homestead Drive","COMMUNITY":"Glanbrook","BUILDING_S":2230.0,"HOLDINGS":15457.0,"CIRCULATIO":31195.0,"RANKING":"-1","RADIUS_KM":10.0},"geometry":{"type":"Point","coordinates":[-79.912062199569064,43.160579871034436]}},{"type":"Feature","properties":{"OBJECTID":15.0,"NAME":"Red Hill Library","ADDRESS":"695 Queenston Road","COMMUNITY":"Hamilton","BUILDING_S":11760.0,"HOLDINGS":61550.0,"CIRCULATIO":236902.0,"RANKING":"-3","RADIUS_KM":2.0},"geometry":{"type":"Point","coordinates":[-79.771944719483301,43.230282114128521]}},{"type":"Feature","properties":{"OBJECTID":16.0,"NAME":"Saltfleet Library","ADDRESS":"131 Gray Road","COMMUNITY":"Stoney Creek","BUILDING_S":15481.0,"HOLDINGS":70643.0,"CIRCULATIO":252049.0,"RANKING":"-3","RADIUS_KM":2.0},"geometry":{"type":"Point","coordinates":[-79.745075092717656,43.222292449164748]}},{"type":"Feature","properties":{"OBJECTID":17.0,"NAME":"Sherwood Library","ADDRESS":"467 Upper Ottawa Street","COMMUNITY":"Hamilton","BUILDING_S":20400.0,"HOLDINGS":74754.0,"CIRCULATIO":333168.0,"RANKING":"-3","RADIUS_KM":2.0},"geometry":{"type":"Point","coordinates":[-79.828617685596058,43.226569128609903]}},{"type":"Feature","properties":{"OBJECTID":18.0,"NAME":"Stoney Creek Library","ADDRESS":"777 Highway 8","COMMUNITY":"Stoney Creek","BUILDING_S":6404.0,"HOLDINGS":32989.0,"CIRCULATIO":87659.0,"RANKING":"-2","RADIUS_KM":2.0},"geometry":{"type":"Point","coordinates":[-79.69140529637852,43.212864346619831]}},{"type":"Feature","properties":{"OBJECTID":19.0,"NAME":"Terryberry Library","ADDRESS":"100 Mohawk Road West","COMMUNITY":"Hamilton","BUILDING_S":30000.0,"HOLDINGS":121339.0,"CIRCULATIO":590659.0,"RANKING":"-4","RADIUS_KM":5.0},"geometry":{"type":"Point","coordinates":[-79.886749082334177,43.230314279676918]}},{"type":"Feature","properties":{"OBJECTID":20.0,"NAME":"Turner Park Library","ADDRESS":"352 Rymal Road East","COMMUNITY":"Hamilton","BUILDING_S":23918.0,"HOLDINGS":58400.0,"CIRCULATIO":0.0,"RANKING":null,"RADIUS_KM":0.0},"geometry":{"type":"Point","coordinates":[-79.878627860731498,43.198467046761877]}},{"type":"Feature","properties":{"OBJECTID":21.0,"NAME":"Valley Park Library","ADDRESS":"1050 Paramount Drive, Unit 12","COMMUNITY":"Stoney Creek","BUILDING_S":3100.0,"HOLDINGS":23668.0,"CIRCULATIO":94484.0,"RANKING":"-2","RADIUS_KM":1.0},"geometry":{"type":"Point","coordinates":[-79.797900012033196,43.193095940253912]}},{"type":"Feature","properties":{"OBJECTID":22.0,"NAME":"Waterdown Library","ADDRESS":"163 Dundas Street East","COMMUNITY":"Flamborough","BUILDING_S":3410.0,"HOLDINGS":31253.0,"CIRCULATIO":143223.0,"RANKING":"-2","RADIUS_KM":2.0},"geometry":{"type":"Point","coordinates":[-79.904798193877582,43.323629399523]}},{"type":"Feature","properties":{"OBJECTID":23.0,"NAME":"Westdale Library","ADDRESS":"955 King Street West","COMMUNITY":"Hamilton","BUILDING_S":9950.0,"HOLDINGS":56499.0,"CIRCULATIO":274285.0,"RANKING":"-3","RADIUS_KM":2.0},"geometry":{"type":"Point","coordinates":[-79.903476765509453,43.262568621667342]}}]} \ No newline at end of file diff --git a/data/RedeemerUniversityCampus_2.js b/data/RedeemerUniversityCampus_2.js new file mode 100644 index 0000000..b2ec8ac --- /dev/null +++ b/data/RedeemerUniversityCampus_2.js @@ -0,0 +1 @@ +var json_RedeemerUniversityCampus_2 = {"type":"FeatureCollection","name":"RedeemerUniversityCampus_2","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{"id":null},"geometry":{"type":"MultiPolygon","coordinates":[[[[-79.950029023177848,43.207123911741014],[-79.95100898419642,43.210337272290303],[-79.951248277003288,43.210291692708047],[-79.952649849157751,43.210041005005614],[-79.952786587904541,43.21049680082821],[-79.952410556350898,43.210565170201598],[-79.952763798113409,43.211704659758084],[-79.953777943818679,43.211522341429045],[-79.953983051938849,43.211636290384696],[-79.954518612030398,43.21349365836177],[-79.953709574445284,43.21361900221298],[-79.953823523400942,43.214211536782351],[-79.953857708087625,43.214587568335993],[-79.953675389758587,43.214974994785194],[-79.952968906233579,43.215692873205782],[-79.95311703987592,43.216103089446115],[-79.951396410645629,43.216422146521936],[-79.951088748465367,43.215157313114233],[-79.949937864013322,43.215362421234403],[-79.947499356362442,43.207534127981347],[-79.950029023177848,43.207123911741014]]]]}}]} \ No newline at end of file diff --git a/data/RedemerCampusStudySpots_3.js b/data/RedemerCampusStudySpots_3.js new file mode 100644 index 0000000..3ee7a99 --- /dev/null +++ b/data/RedemerCampusStudySpots_3.js @@ -0,0 +1 @@ +var json_RedemerCampusStudySpots_3 = {"type":"FeatureCollection","name":"RedemerCampusStudySpots_3","crs":{"type":"name","properties":{"name":"urn:ogc:def:crs:OGC:1.3:CRS84"}},"features":[{"type":"Feature","properties":{"1. Name":"Aug Hall Shire","lattitude":43.21297,"longitude":-79.95034,"seating options":"couches","seats available":4.0,"Noise Level":"none"},"geometry":{"type":"Point","coordinates":[-79.950338,43.21297]}},{"type":"Feature","properties":{"1. Name":"Charis Basement","lattitude":43.21058,"longitude":-79.94957,"seating options":"tables","seats available":52.0,"Noise Level":"low"},"geometry":{"type":"Point","coordinates":[-79.949566,43.21058]}},{"type":"Feature","properties":{"1. Name":"Charis L1 lounge & Starbucks","lattitude":43.21021,"longitude":-79.94937,"seating options":"tables/ couches","seats available":28.0,"Noise Level":"low"},"geometry":{"type":"Point","coordinates":[-79.949371,43.21021]}},{"type":"Feature","properties":{"1. Name":"Charis L2 Lounge","lattitude":43.21056,"longitude":-79.94947,"seating options":"couches","seats available":16.0,"Noise Level":"low"},"geometry":{"type":"Point","coordinates":[-79.949473,43.21056]}},{"type":"Feature","properties":{"1. Name":"Charis L2 Open lounge","lattitude":43.21021,"longitude":-79.94937,"seating options":"tables","seats available":18.0,"Noise Level":"none"},"geometry":{"type":"Point","coordinates":[-79.949371,43.21021]}},{"type":"Feature","properties":{"1. Name":"Charis L3 Lounge","lattitude":43.21058,"longitude":-79.9493,"seating options":"tables/ couches ","seats available":32.0,"Noise Level":"low"},"geometry":{"type":"Point","coordinates":[-79.949296,43.21058]}},{"type":"Feature","properties":{"1. Name":"Charis Outdoor","lattitude":43.21043,"longitude":-79.9497,"seating options":"tables/ benches ","seats available":16.0,"Noise Level":"low"},"geometry":{"type":"Point","coordinates":[-79.949695,43.21043]}},{"type":"Feature","properties":{"1. Name":"Commons","lattitude":43.20939,"longitude":-79.94846,"seating options":"tables/ couches","seats available":31.0,"Noise Level":"high"},"geometry":{"type":"Point","coordinates":[-79.948459,43.20939]}},{"type":"Feature","properties":{"1. Name":"Commuter Lounge","lattitude":43.20925,"longitude":-79.94874,"seating options":"tables/ couches","seats available":31.0,"Noise Level":"high"},"geometry":{"type":"Point","coordinates":[-79.948737,43.20925]}},{"type":"Feature","properties":{"1. Name":"Dining Hall","lattitude":43.20933,"longitude":-79.94838,"seating options":"tables","seats available":240.0,"Noise Level":"high"},"geometry":{"type":"Point","coordinates":[-79.948375,43.20933]}},{"type":"Feature","properties":{"1. Name":"FH Couches East","lattitude":43.20831,"longitude":-79.94829,"seating options":"couches","seats available":10.0,"Noise Level":"low"},"geometry":{"type":"Point","coordinates":[-79.948288,43.20831]}},{"type":"Feature","properties":{"1. Name":"FH Couches West","lattitude":43.20835,"longitude":-79.94833,"seating options":"couches","seats available":10.0,"Noise Level":"low"},"geometry":{"type":"Point","coordinates":[-79.948327,43.20835]}},{"type":"Feature","properties":{"1. Name":"FH Red Room","lattitude":43.20864,"longitude":-79.94831,"seating options":"tables/ lounge chairs","seats available":20.0,"Noise Level":"low"},"geometry":{"type":"Point","coordinates":[-79.948313,43.20864]}},{"type":"Feature","properties":{"1. Name":"FH Upstairs Seating Area","lattitude":43.20926,"longitude":-79.94874,"seating options":" lounge chairs","seats available":9.0,"Noise Level":"high"},"geometry":{"type":"Point","coordinates":[-79.948741,43.20926]}},{"type":"Feature","properties":{"1. Name":"Library Desks","lattitude":43.20831,"longitude":-79.94831,"seating options":"desks","seats available":89.0,"Noise Level":"none"},"geometry":{"type":"Point","coordinates":[-79.948315,43.20831]}},{"type":"Feature","properties":{"1. Name":"Library Study Rooms","lattitude":43.20834,"longitude":-79.94832,"seating options":"tables","seats available":24.0,"Noise Level":"none"},"geometry":{"type":"Point","coordinates":[-79.948324,43.20834]}},{"type":"Feature","properties":{"1. Name":"Library Tables","lattitude":43.20876,"longitude":-79.94833,"seating options":"table/ couches","seats available":55.0,"Noise Level":"none"},"geometry":{"type":"Point","coordinates":[-79.948333,43.20876]}},{"type":"Feature","properties":{"1. Name":"Quad","lattitude":43.20912,"longitude":-79.94912,"seating options":"tables/ chairs","seats available":51.0,"Noise Level":"low"},"geometry":{"type":"Point","coordinates":[-79.949117,43.20912]}},{"type":"Feature","properties":{"1. Name":"Rec Center","lattitude":43.21262,"longitude":-79.95055,"seating options":"lounge chairs","seats available":15.0,"Noise Level":"low"},"geometry":{"type":"Point","coordinates":[-79.950553,43.21262]}},{"type":"Feature","properties":{"1. Name":"Whaley Garden Shed","lattitude":43.21021,"longitude":-79.95063,"seating options":"couches","seats available":8.0,"Noise Level":"none"},"geometry":{"type":"Point","coordinates":[-79.950631,43.21021]}}]} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..03a36ee --- /dev/null +++ b/index.html @@ -0,0 +1,605 @@ + + + + + + + + + + + + + + Downtown Study Spots close to Libraries + + +
+
+ + + + + + + + + + + + + + + + + + + + diff --git a/js/Autolinker.min.js b/js/Autolinker.min.js new file mode 100644 index 0000000..02938ef --- /dev/null +++ b/js/Autolinker.min.js @@ -0,0 +1,11 @@ +/*! + * Autolinker.js + * 3.11.1 + * + * Copyright(c) 2019 Gregory Jacobs + * MIT License + * + * https://github.com/gregjacobs/Autolinker.js + */ +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e=e||self).Autolinker=t()}(this,function(){"use strict";function s(e,t){if(Array.prototype.indexOf)return e.indexOf(t);for(var u=0,n=e.length;u",this.getInnerHtml(),""].join("")},e.prototype.buildAttrsStr=function(){if(!this.attrs)return"";var e=this.getAttrs(),t=[];for(var u in e)e.hasOwnProperty(u)&&t.push(u+'="'+e[u]+'"');return t.join(" ")},e}();var r=function(){function e(e){void 0===e&&(e={}),this.newWindow=!1,this.truncate={},this.className="",this.newWindow=e.newWindow||!1,this.truncate=e.truncate||{},this.className=e.className||""}return e.prototype.build=function(e){return new u({tagName:"a",attrs:this.createAttrs(e),innerHtml:this.processAnchorText(e.getAnchorText())})},e.prototype.createAttrs=function(e){var t={href:e.getAnchorHref()},u=this.createCssClass(e);return u&&(t.class=u),this.newWindow&&(t.target="_blank",t.rel="noopener noreferrer"),this.truncate&&this.truncate.length&&this.truncate.length=h)return l.host.length==t?(l.host.substr(0,t-n)+i).substr(0,h+u):a(g,h).substr(0,h+u);var f="";if(l.path&&(f+="/"+l.path),l.query&&(f+="?"+l.query),f){if(h<=(g+f).length)return(g+f).length==t?(g+f).substr(0,t):(g+a(f,h-g.length)).substr(0,h+u);g+=f}if(l.fragment){var d="#"+l.fragment;if(h<=(g+d).length)return(g+d).length==t?(g+d).substr(0,t):(g+a(d,h-g.length)).substr(0,h+u);g+=d}if(l.scheme&&l.host){var m=l.scheme+"://";if((g+m).lengthr&&(i=null==a?(a="…",3):a.length,n=n.substring(0,r-i)+a),n)},e}(),e=function(){function e(e){this.__jsduckDummyDocProp=null,this.matchedText="",this.offset=0,this.tagBuilder=e.tagBuilder,this.matchedText=e.matchedText,this.offset=e.offset}return e.prototype.getMatchedText=function(){return this.matchedText},e.prototype.setOffset=function(e){this.offset=e},e.prototype.getOffset=function(){return this.offset},e.prototype.getCssClassSuffixes=function(){return[this.getType()]},e.prototype.buildTag=function(){return this.tagBuilder.build(this)},e}(),n=function(e,t){return(n=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var u in t)t.hasOwnProperty(u)&&(e[u]=t[u])})(e,t)};function a(e,t){function u(){this.constructor=e}n(e,t),e.prototype=null===t?Object.create(t):(u.prototype=t.prototype,new u)}var _=function(){return(_=Object.assign||function(e){for(var t,u=1,n=arguments.length;u"===e?(g=new V(_({},g,{name:H()})),O()):W.test(e)||I.test(e)||":"===e||N()}function b(e){">"===e?N():W.test(e)?l=3:N()}function x(e){L.test(e)||("/"===e?l=12:">"===e?O():"<"===e?S():"="===e||$.test(e)||Z.test(e)?N():l=5)}function y(e){L.test(e)?l=6:"/"===e?l=12:"="===e?l=7:">"===e?O():"<"===e?S():$.test(e)&&N()}function F(e){L.test(e)||("/"===e?l=12:"="===e?l=7:">"===e?O():"<"===e?S():$.test(e)?N():l=5)}function v(e){L.test(e)||('"'===e?l=8:"'"===e?l=9:/[>=`]/.test(e)?N():"<"===e?S():l=10)}function w(e){'"'===e&&(l=11)}function B(e){"'"===e&&(l=11)}function C(e){L.test(e)?l=4:">"===e?O():"<"===e&&S()}function D(e){L.test(e)?l=4:"/"===e?l=12:">"===e?O():"<"===e?S():(l=4,c--)}function E(e){">"===e?(g=new V(_({},g,{isClosing:!0})),O()):l=4}function k(e){"--"===t.substr(c,2)?(c+=2,g=new V(_({},g,{type:"comment"})),l=14):"DOCTYPE"===t.substr(c,7).toUpperCase()?(c+=7,g=new V(_({},g,{type:"doctype"})),l=20):N()}function T(e){"-"===e?l=15:">"===e?N():l=16}function M(e){"-"===e?l=18:">"===e?N():l=16}function P(e){"-"===e&&(l=17)}function j(e){l="-"===e?18:16}function z(e){">"===e?O():"!"===e?l=19:"-"===e||(l=16)}function R(e){"-"===e?l=17:">"===e?O():l=16}function q(e){">"===e?O():"<"===e&&S()}function N(){l=0,g=o}function S(){l=1,g=new V({idx:c})}function O(){var e=t.slice(p,g.idx);e&&a(e,p),"comment"===g.type?i(g.idx):"doctype"===g.type?s(g.idx):(g.isOpening&&n(g.name,g.idx),g.isClosing&&r(g.name,g.idx)),N(),p=c+1}function H(){var e=g.idx+(g.isClosing?2:1);return t.slice(e,c).toLowerCase()}pr?t:t+1;e.splice(i,1);continue}e[t+1].getOffset() -1 + }; + } + + function normalizeName(name) { + if (typeof name !== 'string') { + name = String(name); + } + if (/[^a-z0-9\-#$%&'*+.\^_`|~]/i.test(name)) { + throw new TypeError('Invalid character in header field name') + } + return name.toLowerCase() + } + + function normalizeValue(value) { + if (typeof value !== 'string') { + value = String(value); + } + return value + } + + // Build a destructive iterator for the value list + function iteratorFor(items) { + var iterator = { + next: function() { + var value = items.shift(); + return {done: value === undefined, value: value} + } + }; + + if (support.iterable) { + iterator[Symbol.iterator] = function() { + return iterator + }; + } + + return iterator + } + + function Headers(headers) { + this.map = {}; + + if (headers instanceof Headers) { + headers.forEach(function(value, name) { + this.append(name, value); + }, this); + } else if (Array.isArray(headers)) { + headers.forEach(function(header) { + this.append(header[0], header[1]); + }, this); + } else if (headers) { + Object.getOwnPropertyNames(headers).forEach(function(name) { + this.append(name, headers[name]); + }, this); + } + } + + Headers.prototype.append = function(name, value) { + name = normalizeName(name); + value = normalizeValue(value); + var oldValue = this.map[name]; + this.map[name] = oldValue ? oldValue+','+value : value; + }; + + Headers.prototype['delete'] = function(name) { + delete this.map[normalizeName(name)]; + }; + + Headers.prototype.get = function(name) { + name = normalizeName(name); + return this.has(name) ? this.map[name] : null + }; + + Headers.prototype.has = function(name) { + return this.map.hasOwnProperty(normalizeName(name)) + }; + + Headers.prototype.set = function(name, value) { + this.map[normalizeName(name)] = normalizeValue(value); + }; + + Headers.prototype.forEach = function(callback, thisArg) { + var this$1 = this; + + for (var name in this.map) { + if (this$1.map.hasOwnProperty(name)) { + callback.call(thisArg, this$1.map[name], name, this$1); + } + } + }; + + Headers.prototype.keys = function() { + var items = []; + this.forEach(function(value, name) { items.push(name); }); + return iteratorFor(items) + }; + + Headers.prototype.values = function() { + var items = []; + this.forEach(function(value) { items.push(value); }); + return iteratorFor(items) + }; + + Headers.prototype.entries = function() { + var items = []; + this.forEach(function(value, name) { items.push([name, value]); }); + return iteratorFor(items) + }; + + if (support.iterable) { + Headers.prototype[Symbol.iterator] = Headers.prototype.entries; + } + + function consumed(body) { + if (body.bodyUsed) { + return Promise.reject(new TypeError('Already read')) + } + body.bodyUsed = true; + } + + function fileReaderReady(reader) { + return new Promise(function(resolve, reject) { + reader.onload = function() { + resolve(reader.result); + }; + reader.onerror = function() { + reject(reader.error); + }; + }) + } + + function readBlobAsArrayBuffer(blob) { + var reader = new FileReader(); + var promise = fileReaderReady(reader); + reader.readAsArrayBuffer(blob); + return promise + } + + function readBlobAsText(blob) { + var reader = new FileReader(); + var promise = fileReaderReady(reader); + reader.readAsText(blob); + return promise + } + + function readArrayBufferAsText(buf) { + var view = new Uint8Array(buf); + var chars = new Array(view.length); + + for (var i = 0; i < view.length; i++) { + chars[i] = String.fromCharCode(view[i]); + } + return chars.join('') + } + + function bufferClone(buf) { + if (buf.slice) { + return buf.slice(0) + } else { + var view = new Uint8Array(buf.byteLength); + view.set(new Uint8Array(buf)); + return view.buffer + } + } + + function Body() { + this.bodyUsed = false; + + this._initBody = function(body) { + this._bodyInit = body; + if (!body) { + this._bodyText = ''; + } else if (typeof body === 'string') { + this._bodyText = body; + } else if (support.blob && Blob.prototype.isPrototypeOf(body)) { + this._bodyBlob = body; + } else if (support.formData && FormData.prototype.isPrototypeOf(body)) { + this._bodyFormData = body; + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this._bodyText = body.toString(); + } else if (support.arrayBuffer && support.blob && isDataView(body)) { + this._bodyArrayBuffer = bufferClone(body.buffer); + // IE 10-11 can't handle a DataView body. + this._bodyInit = new Blob([this._bodyArrayBuffer]); + } else if (support.arrayBuffer && (ArrayBuffer.prototype.isPrototypeOf(body) || isArrayBufferView(body))) { + this._bodyArrayBuffer = bufferClone(body); + } else { + throw new Error('unsupported BodyInit type') + } + + if (!this.headers.get('content-type')) { + if (typeof body === 'string') { + this.headers.set('content-type', 'text/plain;charset=UTF-8'); + } else if (this._bodyBlob && this._bodyBlob.type) { + this.headers.set('content-type', this._bodyBlob.type); + } else if (support.searchParams && URLSearchParams.prototype.isPrototypeOf(body)) { + this.headers.set('content-type', 'application/x-www-form-urlencoded;charset=UTF-8'); + } + } + }; + + if (support.blob) { + this.blob = function() { + var rejected = consumed(this); + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return Promise.resolve(this._bodyBlob) + } else if (this._bodyArrayBuffer) { + return Promise.resolve(new Blob([this._bodyArrayBuffer])) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as blob') + } else { + return Promise.resolve(new Blob([this._bodyText])) + } + }; + + this.arrayBuffer = function() { + if (this._bodyArrayBuffer) { + return consumed(this) || Promise.resolve(this._bodyArrayBuffer) + } else { + return this.blob().then(readBlobAsArrayBuffer) + } + }; + } + + this.text = function() { + var rejected = consumed(this); + if (rejected) { + return rejected + } + + if (this._bodyBlob) { + return readBlobAsText(this._bodyBlob) + } else if (this._bodyArrayBuffer) { + return Promise.resolve(readArrayBufferAsText(this._bodyArrayBuffer)) + } else if (this._bodyFormData) { + throw new Error('could not read FormData body as text') + } else { + return Promise.resolve(this._bodyText) + } + }; + + if (support.formData) { + this.formData = function() { + return this.text().then(decode) + }; + } + + this.json = function() { + return this.text().then(JSON.parse) + }; + + return this + } + + // HTTP methods whose capitalization should be normalized + var methods = ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT']; + + function normalizeMethod(method) { + var upcased = method.toUpperCase(); + return (methods.indexOf(upcased) > -1) ? upcased : method + } + + function Request(input, options) { + options = options || {}; + var body = options.body; + + if (input instanceof Request) { + if (input.bodyUsed) { + throw new TypeError('Already read') + } + this.url = input.url; + this.credentials = input.credentials; + if (!options.headers) { + this.headers = new Headers(input.headers); + } + this.method = input.method; + this.mode = input.mode; + if (!body && input._bodyInit != null) { + body = input._bodyInit; + input.bodyUsed = true; + } + } else { + this.url = String(input); + } + + this.credentials = options.credentials || this.credentials || 'omit'; + if (options.headers || !this.headers) { + this.headers = new Headers(options.headers); + } + this.method = normalizeMethod(options.method || this.method || 'GET'); + this.mode = options.mode || this.mode || null; + this.referrer = null; + + if ((this.method === 'GET' || this.method === 'HEAD') && body) { + throw new TypeError('Body not allowed for GET or HEAD requests') + } + this._initBody(body); + } + + Request.prototype.clone = function() { + return new Request(this, { body: this._bodyInit }) + }; + + function decode(body) { + var form = new FormData(); + body.trim().split('&').forEach(function(bytes) { + if (bytes) { + var split = bytes.split('='); + var name = split.shift().replace(/\+/g, ' '); + var value = split.join('=').replace(/\+/g, ' '); + form.append(decodeURIComponent(name), decodeURIComponent(value)); + } + }); + return form + } + + function parseHeaders(rawHeaders) { + var headers = new Headers(); + rawHeaders.split(/\r?\n/).forEach(function(line) { + var parts = line.split(':'); + var key = parts.shift().trim(); + if (key) { + var value = parts.join(':').trim(); + headers.append(key, value); + } + }); + return headers + } + + Body.call(Request.prototype); + + function Response(bodyInit, options) { + if (!options) { + options = {}; + } + + this.type = 'default'; + this.status = 'status' in options ? options.status : 200; + this.ok = this.status >= 200 && this.status < 300; + this.statusText = 'statusText' in options ? options.statusText : 'OK'; + this.headers = new Headers(options.headers); + this.url = options.url || ''; + this._initBody(bodyInit); + } + + Body.call(Response.prototype); + + Response.prototype.clone = function() { + return new Response(this._bodyInit, { + status: this.status, + statusText: this.statusText, + headers: new Headers(this.headers), + url: this.url + }) + }; + + Response.error = function() { + var response = new Response(null, {status: 0, statusText: ''}); + response.type = 'error'; + return response + }; + + var redirectStatuses = [301, 302, 303, 307, 308]; + + Response.redirect = function(url, status) { + if (redirectStatuses.indexOf(status) === -1) { + throw new RangeError('Invalid status code') + } + + return new Response(null, {status: status, headers: {location: url}}) + }; + + self.Headers = Headers; + self.Request = Request; + self.Response = Response; + + self.fetch = function(input, init) { + return new Promise(function(resolve, reject) { + var request = new Request(input, init); + var xhr = new XMLHttpRequest(); + + xhr.onload = function() { + var options = { + status: xhr.status, + statusText: xhr.statusText, + headers: parseHeaders(xhr.getAllResponseHeaders() || '') + }; + options.url = 'responseURL' in xhr ? xhr.responseURL : options.headers.get('X-Request-URL'); + var body = 'response' in xhr ? xhr.response : xhr.responseText; + resolve(new Response(body, options)); + }; + + xhr.onerror = function() { + reject(new TypeError('Network request failed')); + }; + + xhr.ontimeout = function() { + reject(new TypeError('Network request failed')); + }; + + xhr.open(request.method, request.url, true); + + if (request.credentials === 'include') { + xhr.withCredentials = true; + } + + if ('responseType' in xhr && support.blob) { + xhr.responseType = 'blob'; + } + + request.headers.forEach(function(value, name) { + xhr.setRequestHeader(name, value); + }); + + xhr.send(typeof request._bodyInit === 'undefined' ? null : request._bodyInit); + }) + }; + self.fetch.polyfill = true; +})(typeof self !== 'undefined' ? self : undefined); + +var read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var nBits = -7; + var i = isLE ? (nBytes - 1) : 0; + var d = isLE ? -1 : 1; + var s = buffer[offset + i]; + + i += d; + + e = s & ((1 << (-nBits)) - 1); + s >>= (-nBits); + nBits += eLen; + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1); + e >>= (-nBits); + nBits += mLen; + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias; + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen); + e = e - eBias; + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +}; + +var write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c; + var eLen = nBytes * 8 - mLen - 1; + var eMax = (1 << eLen) - 1; + var eBias = eMax >> 1; + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0); + var i = isLE ? 0 : (nBytes - 1); + var d = isLE ? 1 : -1; + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0; + + value = Math.abs(value); + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0; + e = eMax; + } else { + e = Math.floor(Math.log(value) / Math.LN2); + if (value * (c = Math.pow(2, -e)) < 1) { + e--; + c *= 2; + } + if (e + eBias >= 1) { + value += rt / c; + } else { + value += rt * Math.pow(2, 1 - eBias); + } + if (value * c >= 2) { + e++; + c /= 2; + } + + if (e + eBias >= eMax) { + m = 0; + e = eMax; + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen); + e = e + eBias; + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen); + e = 0; + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m; + eLen += mLen; + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128; +}; + +var index$1 = { + read: read, + write: write +}; + +var index = Pbf; + +var ieee754 = index$1; + +function Pbf(buf) { + this.buf = ArrayBuffer.isView && ArrayBuffer.isView(buf) ? buf : new Uint8Array(buf || 0); + this.pos = 0; + this.type = 0; + this.length = this.buf.length; +} + +Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum +Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 +Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields +Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 + +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16); +var SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32; + +Pbf.prototype = { + + destroy: function() { + this.buf = null; + }, + + // === READING ================================================================= + + readFields: function(readField, result, end) { + var this$1 = this; + + end = end || this.length; + + while (this.pos < end) { + var val = this$1.readVarint(), + tag = val >> 3, + startPos = this$1.pos; + + this$1.type = val & 0x7; + readField(tag, result, this$1); + + if (this$1.pos === startPos) { this$1.skip(val); } + } + return result; + }, + + readMessage: function(readField, result) { + return this.readFields(readField, result, this.readVarint() + this.pos); + }, + + readFixed32: function() { + var val = readUInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, + + readSFixed32: function() { + var val = readInt32(this.buf, this.pos); + this.pos += 4; + return val; + }, + + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) + + readFixed64: function() { + var val = readUInt32(this.buf, this.pos) + readUInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readSFixed64: function() { + var val = readUInt32(this.buf, this.pos) + readInt32(this.buf, this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readFloat: function() { + var val = ieee754.read(this.buf, this.pos, true, 23, 4); + this.pos += 4; + return val; + }, + + readDouble: function() { + var val = ieee754.read(this.buf, this.pos, true, 52, 8); + this.pos += 8; + return val; + }, + + readVarint: function(isSigned) { + var buf = this.buf, + val, b; + + b = buf[this.pos++]; val = b & 0x7f; if (b < 0x80) { return val; } + b = buf[this.pos++]; val |= (b & 0x7f) << 7; if (b < 0x80) { return val; } + b = buf[this.pos++]; val |= (b & 0x7f) << 14; if (b < 0x80) { return val; } + b = buf[this.pos++]; val |= (b & 0x7f) << 21; if (b < 0x80) { return val; } + b = buf[this.pos]; val |= (b & 0x0f) << 28; + + return readVarintRemainder(val, isSigned, this); + }, + + readVarint64: function() { // for compatibility with v2.0.1 + return this.readVarint(true); + }, + + readSVarint: function() { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding + }, + + readBoolean: function() { + return Boolean(this.readVarint()); + }, + + readString: function() { + var end = this.readVarint() + this.pos, + str = readUtf8(this.buf, this.pos, end); + this.pos = end; + return str; + }, + + readBytes: function() { + var end = this.readVarint() + this.pos, + buffer = this.buf.subarray(this.pos, end); + this.pos = end; + return buffer; + }, + + // verbose for performance reasons; doesn't affect gzipped size + + readPackedVarint: function(arr, isSigned) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readVarint(isSigned)); } + return arr; + }, + readPackedSVarint: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readSVarint()); } + return arr; + }, + readPackedBoolean: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readBoolean()); } + return arr; + }, + readPackedFloat: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readFloat()); } + return arr; + }, + readPackedDouble: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readDouble()); } + return arr; + }, + readPackedFixed32: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readFixed32()); } + return arr; + }, + readPackedSFixed32: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readSFixed32()); } + return arr; + }, + readPackedFixed64: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readFixed64()); } + return arr; + }, + readPackedSFixed64: function(arr) { + var this$1 = this; + + var end = readPackedEnd(this); + arr = arr || []; + while (this.pos < end) { arr.push(this$1.readSFixed64()); } + return arr; + }, + + skip: function(val) { + var type = val & 0x7; + if (type === Pbf.Varint) { while (this.buf[this.pos++] > 0x7f) {} } + else if (type === Pbf.Bytes) { this.pos = this.readVarint() + this.pos; } + else if (type === Pbf.Fixed32) { this.pos += 4; } + else if (type === Pbf.Fixed64) { this.pos += 8; } + else { throw new Error('Unimplemented type: ' + type); } + }, + + // === WRITING ================================================================= + + writeTag: function(tag, type) { + this.writeVarint((tag << 3) | type); + }, + + realloc: function(min) { + var length = this.length || 16; + + while (length < this.pos + min) { length *= 2; } + + if (length !== this.length) { + var buf = new Uint8Array(length); + buf.set(this.buf); + this.buf = buf; + this.length = length; + } + }, + + finish: function() { + this.length = this.pos; + this.pos = 0; + return this.buf.subarray(0, this.length); + }, + + writeFixed32: function(val) { + this.realloc(4); + writeInt32(this.buf, val, this.pos); + this.pos += 4; + }, + + writeSFixed32: function(val) { + this.realloc(4); + writeInt32(this.buf, val, this.pos); + this.pos += 4; + }, + + writeFixed64: function(val) { + this.realloc(8); + writeInt32(this.buf, val & -1, this.pos); + writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + + writeSFixed64: function(val) { + this.realloc(8); + writeInt32(this.buf, val & -1, this.pos); + writeInt32(this.buf, Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, + + writeVarint: function(val) { + val = +val || 0; + + if (val > 0xfffffff || val < 0) { + writeBigVarint(val, this); + return; + } + + this.realloc(4); + + this.buf[this.pos++] = val & 0x7f | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } + this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } + this.buf[this.pos++] = ((val >>>= 7) & 0x7f) | (val > 0x7f ? 0x80 : 0); if (val <= 0x7f) { return; } + this.buf[this.pos++] = (val >>> 7) & 0x7f; + }, + + writeSVarint: function(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, + + writeBoolean: function(val) { + this.writeVarint(Boolean(val)); + }, + + writeString: function(str) { + str = String(str); + this.realloc(str.length * 4); + + this.pos++; // reserve 1 byte for short string length + + var startPos = this.pos; + // write the string directly to the buffer and see how much was written + this.pos = writeUtf8(this.buf, str, this.pos); + var len = this.pos - startPos; + + if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); } + + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + + writeFloat: function(val) { + this.realloc(4); + ieee754.write(this.buf, val, this.pos, true, 23, 4); + this.pos += 4; + }, + + writeDouble: function(val) { + this.realloc(8); + ieee754.write(this.buf, val, this.pos, true, 52, 8); + this.pos += 8; + }, + + writeBytes: function(buffer) { + var this$1 = this; + + var len = buffer.length; + this.writeVarint(len); + this.realloc(len); + for (var i = 0; i < len; i++) { this$1.buf[this$1.pos++] = buffer[i]; } + }, + + writeRawMessage: function(fn, obj) { + this.pos++; // reserve 1 byte for short message length + + // write the message directly to the buffer and see how much was written + var startPos = this.pos; + fn(obj, this); + var len = this.pos - startPos; + + if (len >= 0x80) { makeRoomForExtraLength(startPos, len, this); } + + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, + + writeMessage: function(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); + this.writeRawMessage(fn, obj); + }, + + writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, + writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, + writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, + writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, + writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, + writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, + writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, + writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, + writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, + + writeBytesField: function(tag, buffer) { + this.writeTag(tag, Pbf.Bytes); + this.writeBytes(buffer); + }, + writeFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFixed32(val); + }, + writeSFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeSFixed32(val); + }, + writeFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeFixed64(val); + }, + writeSFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeSFixed64(val); + }, + writeVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeVarint(val); + }, + writeSVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeSVarint(val); + }, + writeStringField: function(tag, str) { + this.writeTag(tag, Pbf.Bytes); + this.writeString(str); + }, + writeFloatField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFloat(val); + }, + writeDoubleField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeDouble(val); + }, + writeBooleanField: function(tag, val) { + this.writeVarintField(tag, Boolean(val)); + } +}; + +function readVarintRemainder(l, s, p) { + var buf = p.buf, + h, b; + + b = buf[p.pos++]; h = (b & 0x70) >> 4; if (b < 0x80) { return toNum(l, h, s); } + b = buf[p.pos++]; h |= (b & 0x7f) << 3; if (b < 0x80) { return toNum(l, h, s); } + b = buf[p.pos++]; h |= (b & 0x7f) << 10; if (b < 0x80) { return toNum(l, h, s); } + b = buf[p.pos++]; h |= (b & 0x7f) << 17; if (b < 0x80) { return toNum(l, h, s); } + b = buf[p.pos++]; h |= (b & 0x7f) << 24; if (b < 0x80) { return toNum(l, h, s); } + b = buf[p.pos++]; h |= (b & 0x01) << 31; if (b < 0x80) { return toNum(l, h, s); } + + throw new Error('Expected varint not more than 10 bytes'); +} + +function readPackedEnd(pbf) { + return pbf.type === Pbf.Bytes ? + pbf.readVarint() + pbf.pos : pbf.pos + 1; +} + +function toNum(low, high, isSigned) { + if (isSigned) { + return high * 0x100000000 + (low >>> 0); + } + + return ((high >>> 0) * 0x100000000) + (low >>> 0); +} + +function writeBigVarint(val, pbf) { + var low, high; + + if (val >= 0) { + low = (val % 0x100000000) | 0; + high = (val / 0x100000000) | 0; + } else { + low = ~(-val % 0x100000000); + high = ~(-val / 0x100000000); + + if (low ^ 0xffffffff) { + low = (low + 1) | 0; + } else { + low = 0; + high = (high + 1) | 0; + } + } + + if (val >= 0x10000000000000000 || val < -0x10000000000000000) { + throw new Error('Given varint doesn\'t fit into 10 bytes'); + } + + pbf.realloc(10); + + writeBigVarintLow(low, high, pbf); + writeBigVarintHigh(high, pbf); +} + +function writeBigVarintLow(low, high, pbf) { + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos++] = low & 0x7f | 0x80; low >>>= 7; + pbf.buf[pbf.pos] = low & 0x7f; +} + +function writeBigVarintHigh(high, pbf) { + var lsb = (high & 0x07) << 4; + + pbf.buf[pbf.pos++] |= lsb | ((high >>>= 3) ? 0x80 : 0); if (!high) { return; } + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } + pbf.buf[pbf.pos++] = high & 0x7f | ((high >>>= 7) ? 0x80 : 0); if (!high) { return; } + pbf.buf[pbf.pos++] = high & 0x7f; +} + +function makeRoomForExtraLength(startPos, len, pbf) { + var extraLen = + len <= 0x3fff ? 1 : + len <= 0x1fffff ? 2 : + len <= 0xfffffff ? 3 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); + + // if 1 byte isn't enough for encoding message length, shift the data to the right + pbf.realloc(extraLen); + for (var i = pbf.pos - 1; i >= startPos; i--) { pbf.buf[i + extraLen] = pbf.buf[i]; } +} + +function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeVarint(arr[i]); } } +function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSVarint(arr[i]); } } +function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFloat(arr[i]); } } +function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeDouble(arr[i]); } } +function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeBoolean(arr[i]); } } +function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFixed32(arr[i]); } } +function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed32(arr[i]); } } +function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeFixed64(arr[i]); } } +function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) { pbf.writeSFixed64(arr[i]); } } + +// Buffer code below from https://github.com/feross/buffer, MIT-licensed + +function readUInt32(buf, pos) { + return ((buf[pos]) | + (buf[pos + 1] << 8) | + (buf[pos + 2] << 16)) + + (buf[pos + 3] * 0x1000000); +} + +function writeInt32(buf, val, pos) { + buf[pos] = val; + buf[pos + 1] = (val >>> 8); + buf[pos + 2] = (val >>> 16); + buf[pos + 3] = (val >>> 24); +} + +function readInt32(buf, pos) { + return ((buf[pos]) | + (buf[pos + 1] << 8) | + (buf[pos + 2] << 16)) + + (buf[pos + 3] << 24); +} + +function readUtf8(buf, pos, end) { + var str = ''; + var i = pos; + + while (i < end) { + var b0 = buf[i]; + var c = null; // codepoint + var bytesPerSequence = + b0 > 0xEF ? 4 : + b0 > 0xDF ? 3 : + b0 > 0xBF ? 2 : 1; + + if (i + bytesPerSequence > end) { break; } + + var b1, b2, b3; + + if (bytesPerSequence === 1) { + if (b0 < 0x80) { + c = b0; + } + } else if (bytesPerSequence === 2) { + b1 = buf[i + 1]; + if ((b1 & 0xC0) === 0x80) { + c = (b0 & 0x1F) << 0x6 | (b1 & 0x3F); + if (c <= 0x7F) { + c = null; + } + } + } else if (bytesPerSequence === 3) { + b1 = buf[i + 1]; + b2 = buf[i + 2]; + if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80) { + c = (b0 & 0xF) << 0xC | (b1 & 0x3F) << 0x6 | (b2 & 0x3F); + if (c <= 0x7FF || (c >= 0xD800 && c <= 0xDFFF)) { + c = null; + } + } + } else if (bytesPerSequence === 4) { + b1 = buf[i + 1]; + b2 = buf[i + 2]; + b3 = buf[i + 3]; + if ((b1 & 0xC0) === 0x80 && (b2 & 0xC0) === 0x80 && (b3 & 0xC0) === 0x80) { + c = (b0 & 0xF) << 0x12 | (b1 & 0x3F) << 0xC | (b2 & 0x3F) << 0x6 | (b3 & 0x3F); + if (c <= 0xFFFF || c >= 0x110000) { + c = null; + } + } + } + + if (c === null) { + c = 0xFFFD; + bytesPerSequence = 1; + + } else if (c > 0xFFFF) { + c -= 0x10000; + str += String.fromCharCode(c >>> 10 & 0x3FF | 0xD800); + c = 0xDC00 | c & 0x3FF; + } + + str += String.fromCharCode(c); + i += bytesPerSequence; + } + + return str; +} + +function writeUtf8(buf, str, pos) { + for (var i = 0, c, lead; i < str.length; i++) { + c = str.charCodeAt(i); // code point + + if (c > 0xD7FF && c < 0xE000) { + if (lead) { + if (c < 0xDC00) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + lead = c; + continue; + } else { + c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; + lead = null; + } + } else { + if (c > 0xDBFF || (i + 1 === str.length)) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + } else { + lead = c; + } + continue; + } + } else if (lead) { + buf[pos++] = 0xEF; + buf[pos++] = 0xBF; + buf[pos++] = 0xBD; + lead = null; + } + + if (c < 0x80) { + buf[pos++] = c; + } else { + if (c < 0x800) { + buf[pos++] = c >> 0x6 | 0xC0; + } else { + if (c < 0x10000) { + buf[pos++] = c >> 0xC | 0xE0; + } else { + buf[pos++] = c >> 0x12 | 0xF0; + buf[pos++] = c >> 0xC & 0x3F | 0x80; + } + buf[pos++] = c >> 0x6 & 0x3F | 0x80; + } + buf[pos++] = c & 0x3F | 0x80; + } + } + return pos; +} + +var index$5 = Point$1; + +function Point$1(x, y) { + this.x = x; + this.y = y; +} + +Point$1.prototype = { + clone: function() { return new Point$1(this.x, this.y); }, + + add: function(p) { return this.clone()._add(p); }, + sub: function(p) { return this.clone()._sub(p); }, + mult: function(k) { return this.clone()._mult(k); }, + div: function(k) { return this.clone()._div(k); }, + rotate: function(a) { return this.clone()._rotate(a); }, + matMult: function(m) { return this.clone()._matMult(m); }, + unit: function() { return this.clone()._unit(); }, + perp: function() { return this.clone()._perp(); }, + round: function() { return this.clone()._round(); }, + + mag: function() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + + equals: function(p) { + return this.x === p.x && + this.y === p.y; + }, + + dist: function(p) { + return Math.sqrt(this.distSqr(p)); + }, + + distSqr: function(p) { + var dx = p.x - this.x, + dy = p.y - this.y; + return dx * dx + dy * dy; + }, + + angle: function() { + return Math.atan2(this.y, this.x); + }, + + angleTo: function(b) { + return Math.atan2(this.y - b.y, this.x - b.x); + }, + + angleWith: function(b) { + return this.angleWithSep(b.x, b.y); + }, + + // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(?) for ?. + angleWithSep: function(x, y) { + return Math.atan2( + this.x * y - this.y * x, + this.x * x + this.y * y); + }, + + _matMult: function(m) { + var x = m[0] * this.x + m[1] * this.y, + y = m[2] * this.x + m[3] * this.y; + this.x = x; + this.y = y; + return this; + }, + + _add: function(p) { + this.x += p.x; + this.y += p.y; + return this; + }, + + _sub: function(p) { + this.x -= p.x; + this.y -= p.y; + return this; + }, + + _mult: function(k) { + this.x *= k; + this.y *= k; + return this; + }, + + _div: function(k) { + this.x /= k; + this.y /= k; + return this; + }, + + _unit: function() { + this._div(this.mag()); + return this; + }, + + _perp: function() { + var y = this.y; + this.y = this.x; + this.x = -y; + return this; + }, + + _rotate: function(angle) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = cos * this.x - sin * this.y, + y = sin * this.x + cos * this.y; + this.x = x; + this.y = y; + return this; + }, + + _round: function() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + } +}; + +// constructs Point from an array if necessary +Point$1.convert = function (a) { + if (a instanceof Point$1) { + return a; + } + if (Array.isArray(a)) { + return new Point$1(a[0], a[1]); + } + return a; +}; + +var Point = index$5; + +var vectortilefeature = VectorTileFeature$2; + +function VectorTileFeature$2(pbf, end, extent, keys, values) { + // Public + this.properties = {}; + this.extent = extent; + this.type = 0; + + // Private + this._pbf = pbf; + this._geometry = -1; + this._keys = keys; + this._values = values; + + pbf.readFields(readFeature, this, end); +} + +function readFeature(tag, feature, pbf) { + if (tag == 1) { feature.id = pbf.readVarint(); } + else if (tag == 2) { readTag(pbf, feature); } + else if (tag == 3) { feature.type = pbf.readVarint(); } + else if (tag == 4) { feature._geometry = pbf.pos; } +} + +function readTag(pbf, feature) { + var end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var key = feature._keys[pbf.readVarint()], + value = feature._values[pbf.readVarint()]; + feature.properties[key] = value; + } +} + +VectorTileFeature$2.types = ['Unknown', 'Point', 'LineString', 'Polygon']; + +VectorTileFeature$2.prototype.loadGeometry = function() { + var pbf = this._pbf; + pbf.pos = this._geometry; + + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + lines = [], + line; + + while (pbf.pos < end) { + if (!length) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + + if (cmd === 1) { // moveTo + if (line) { lines.push(line); } + line = []; + } + + line.push(new Point(x, y)); + + } else if (cmd === 7) { + + // Workaround for https://github.com/mapbox/mapnik-vector-tile/issues/90 + if (line) { + line.push(line[0].clone()); // closePolygon + } + + } else { + throw new Error('unknown command ' + cmd); + } + } + + if (line) { lines.push(line); } + + return lines; +}; + +VectorTileFeature$2.prototype.bbox = function() { + var pbf = this._pbf; + pbf.pos = this._geometry; + + var end = pbf.readVarint() + pbf.pos, + cmd = 1, + length = 0, + x = 0, + y = 0, + x1 = Infinity, + x2 = -Infinity, + y1 = Infinity, + y2 = -Infinity; + + while (pbf.pos < end) { + if (!length) { + var cmdLen = pbf.readVarint(); + cmd = cmdLen & 0x7; + length = cmdLen >> 3; + } + + length--; + + if (cmd === 1 || cmd === 2) { + x += pbf.readSVarint(); + y += pbf.readSVarint(); + if (x < x1) { x1 = x; } + if (x > x2) { x2 = x; } + if (y < y1) { y1 = y; } + if (y > y2) { y2 = y; } + + } else if (cmd !== 7) { + throw new Error('unknown command ' + cmd); + } + } + + return [x1, y1, x2, y2]; +}; + +VectorTileFeature$2.prototype.toGeoJSON = function(x, y, z) { + var size = this.extent * Math.pow(2, z), + x0 = this.extent * x, + y0 = this.extent * y, + coords = this.loadGeometry(), + type = VectorTileFeature$2.types[this.type], + i, j; + + function project(line) { + for (var j = 0; j < line.length; j++) { + var p = line[j], y2 = 180 - (p.y + y0) * 360 / size; + line[j] = [ + (p.x + x0) * 360 / size - 180, + 360 / Math.PI * Math.atan(Math.exp(y2 * Math.PI / 180)) - 90 + ]; + } + } + + switch (this.type) { + case 1: + var points = []; + for (i = 0; i < coords.length; i++) { + points[i] = coords[i][0]; + } + coords = points; + project(coords); + break; + + case 2: + for (i = 0; i < coords.length; i++) { + project(coords[i]); + } + break; + + case 3: + coords = classifyRings(coords); + for (i = 0; i < coords.length; i++) { + for (j = 0; j < coords[i].length; j++) { + project(coords[i][j]); + } + } + break; + } + + if (coords.length === 1) { + coords = coords[0]; + } else { + type = 'Multi' + type; + } + + var result = { + type: "Feature", + geometry: { + type: type, + coordinates: coords + }, + properties: this.properties + }; + + if ('id' in this) { + result.id = this.id; + } + + return result; +}; + +// classifies an array of rings into polygons with outer rings and holes + +function classifyRings(rings) { + var len = rings.length; + + if (len <= 1) { return [rings]; } + + var polygons = [], + polygon, + ccw; + + for (var i = 0; i < len; i++) { + var area = signedArea(rings[i]); + if (area === 0) { continue; } + + if (ccw === undefined) { ccw = area < 0; } + + if (ccw === area < 0) { + if (polygon) { polygons.push(polygon); } + polygon = [rings[i]]; + + } else { + polygon.push(rings[i]); + } + } + if (polygon) { polygons.push(polygon); } + + return polygons; +} + +function signedArea(ring) { + var sum = 0; + for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) { + p1 = ring[i]; + p2 = ring[j]; + sum += (p2.x - p1.x) * (p1.y + p2.y); + } + return sum; +} + +var VectorTileFeature$1 = vectortilefeature; + +var vectortilelayer = VectorTileLayer$2; + +function VectorTileLayer$2(pbf, end) { + // Public + this.version = 1; + this.name = null; + this.extent = 4096; + this.length = 0; + + // Private + this._pbf = pbf; + this._keys = []; + this._values = []; + this._features = []; + + pbf.readFields(readLayer, this, end); + + this.length = this._features.length; +} + +function readLayer(tag, layer, pbf) { + if (tag === 15) { layer.version = pbf.readVarint(); } + else if (tag === 1) { layer.name = pbf.readString(); } + else if (tag === 5) { layer.extent = pbf.readVarint(); } + else if (tag === 2) { layer._features.push(pbf.pos); } + else if (tag === 3) { layer._keys.push(pbf.readString()); } + else if (tag === 4) { layer._values.push(readValueMessage(pbf)); } +} + +function readValueMessage(pbf) { + var value = null, + end = pbf.readVarint() + pbf.pos; + + while (pbf.pos < end) { + var tag = pbf.readVarint() >> 3; + + value = tag === 1 ? pbf.readString() : + tag === 2 ? pbf.readFloat() : + tag === 3 ? pbf.readDouble() : + tag === 4 ? pbf.readVarint64() : + tag === 5 ? pbf.readVarint() : + tag === 6 ? pbf.readSVarint() : + tag === 7 ? pbf.readBoolean() : null; + } + + return value; +} + +// return feature `i` from this layer as a `VectorTileFeature` +VectorTileLayer$2.prototype.feature = function(i) { + if (i < 0 || i >= this._features.length) { throw new Error('feature index out of bounds'); } + + this._pbf.pos = this._features[i]; + + var end = this._pbf.readVarint() + this._pbf.pos; + return new VectorTileFeature$1(this._pbf, end, this.extent, this._keys, this._values); +}; + +var VectorTileLayer$1 = vectortilelayer; + +var vectortile = VectorTile$1; + +function VectorTile$1(pbf, end) { + this.layers = pbf.readFields(readTile, {}, end); +} + +function readTile(tag, layers, pbf) { + if (tag === 3) { + var layer = new VectorTileLayer$1(pbf, pbf.readVarint() + pbf.pos); + if (layer.length) { layers[layer.name] = layer; } + } +} + +var VectorTile = vectortile; + +L.SVG.Tile = L.SVG.extend({ + + initialize: function (tileCoord, tileSize, options) { + L.SVG.prototype.initialize.call(this, options); + this._tileCoord = tileCoord; + this._size = tileSize; + + this._initContainer(); + this._container.setAttribute('width', this._size.x); + this._container.setAttribute('height', this._size.y); + this._container.setAttribute('viewBox', [0, 0, this._size.x, this._size.y].join(' ')); + + this._layers = {}; + }, + + getCoord: function() { + return this._tileCoord; + }, + + getContainer: function() { + return this._container; + }, + + onAdd: L.Util.falseFn, + + addTo: function(map) { + this._map = map; + if (this.options.interactive) { + for (var i in this._layers) { + var layer = this._layers[i]; + // By default, Leaflet tiles do not have pointer events. + layer._path.style.pointerEvents = 'auto'; + this._map._targets[L.stamp(layer._path)] = layer; + } + } + }, + + removeFrom: function (map) { + if (this.options.interactive) { + for (var i in this._layers) { + var layer = this._layers[i]; + delete this._map._targets[L.stamp(layer._path)]; + } + } + delete this._map; + }, + + _initContainer: function() { + L.SVG.prototype._initContainer.call(this); + var rect = L.SVG.create('rect'); + }, + + /// TODO: Modify _initPath to include an extra parameter, a group name + /// to order symbolizers by z-index + + _addPath: function (layer) { + this._rootGroup.appendChild(layer._path); + this._layers[L.stamp(layer)] = layer; + }, + + _updateIcon: function (layer) { + var path = layer._path = L.SVG.create('image'), + icon = layer.options.icon, + options = icon.options, + size = L.point(options.iconSize), + anchor = options.iconAnchor || + size && size.divideBy(2, true), + p = layer._point.subtract(anchor); + path.setAttribute('x', p.x); + path.setAttribute('y', p.y); + path.setAttribute('width', size.x + 'px'); + path.setAttribute('height', size.y + 'px'); + path.setAttribute('href', options.iconUrl); + } +}); + + +L.svg.tile = function(tileCoord, tileSize, opts){ + return new L.SVG.Tile(tileCoord, tileSize, opts); +}; + +// ??class Symbolizer +// ??inherits Class +// The abstract Symbolizer class is mostly equivalent in concept to a `L.Path` - it's an interface for +// polylines, polygons and circles. But instead of representing leaflet Layers, +// it represents things that have to be drawn inside a vector tile. + +// A vector tile *data layer* might have zero, one, or more *symbolizer definitions* +// A vector tile *feature* might have zero, one, or more *symbolizers*. +// The actual symbolizers applied will depend on filters and the symbolizer functions. + +var Symbolizer = L.Class.extend({ + // ??method initialize(feature: GeoJSON, pxPerExtent: Number) + // Initializes a new Line Symbolizer given a GeoJSON feature and the + // pixel-to-coordinate-units ratio. Internal use only. + + // ??method render(renderer, style) + // Renders this symbolizer in the given tiled renderer, with the given + // `L.Path` options. Internal use only. + render: function(renderer, style) { + this._renderer = renderer; + this.options = style; + renderer._initPath(this); + renderer._updateStyle(this); + }, + + // ??method render(renderer, style) + // Updates the `L.Path` options used to style this symbolizer, and re-renders it. + // Internal use only. + updateStyle: function(renderer, style) { + this.options = style; + renderer._updateStyle(this); + }, + + _getPixelBounds: function() { + var parts = this._parts; + var bounds = L.bounds([]); + for (var i = 0; i < parts.length; i++) { + var part = parts[i]; + for (var j = 0; j < part.length; j++) { + bounds.extend(part[j]); + } + } + + var w = this._clickTolerance(), + p = new L.Point(w, w); + + bounds.min._subtract(p); + bounds.max._add(p); + + return bounds; + }, + _clickTolerance: L.Path.prototype._clickTolerance, +}); + +// Contains mixins which are common to the Line Symbolizer and the Fill Symbolizer. + +var PolyBase = { + _makeFeatureParts: function(feat, pxPerExtent) { + var rings = feat.geometry; + var coord; + + this._parts = []; + for (var i = 0; i < rings.length; i++) { + var ring = rings[i]; + var part = []; + for (var j = 0; j < ring.length; j++) { + coord = ring[j]; + // Protobuf vector tiles return {x: , y:} + // Geojson-vt returns [,] + part.push(L.point(coord).scaleBy(pxPerExtent)); + } + this._parts.push(part); + } + }, + + makeInteractive: function() { + this._pxBounds = this._getPixelBounds(); + } +}; + +// ??class PointSymbolizer +// ??inherits CircleMarker +// A symbolizer for points. + +var PointSymbolizer = L.CircleMarker.extend({ + includes: Symbolizer.prototype, + + statics: { + iconCache: {} + }, + + initialize: function(feature, pxPerExtent) { + this.properties = feature.properties; + this._makeFeatureParts(feature, pxPerExtent); + }, + + render: function(renderer, style) { + Symbolizer.prototype.render.call(this, renderer, style); + this._radius = style.radius || L.CircleMarker.prototype.options.radius; + this._updatePath(); + }, + + _makeFeatureParts: function(feat, pxPerExtent) { + var coord = feat.geometry[0]; + if (typeof coord[0] === 'object' && 'x' in coord[0]) { + // Protobuf vector tiles return [{x: , y:}] + this._point = L.point(coord[0]).scaleBy(pxPerExtent); + this._empty = L.Util.falseFn; + } else { + // Geojson-vt returns [,] + this._point = L.point(coord).scaleBy(pxPerExtent); + this._empty = L.Util.falseFn; + } + }, + + makeInteractive: function() { + this._updateBounds(); + }, + + updateStyle: function(renderer, style) { + this._radius = style.radius || this._radius; + this._updateBounds(); + return Symbolizer.prototype.updateStyle.call(this, renderer, style); + }, + + _updateBounds: function() { + var icon = this.options.icon; + if (icon) { + var size = L.point(icon.options.iconSize), + anchor = icon.options.iconAnchor || + size && size.divideBy(2, true), + p = this._point.subtract(anchor); + this._pxBounds = new L.Bounds(p, p.add(icon.options.iconSize)); + } else { + L.CircleMarker.prototype._updateBounds.call(this); + } + }, + + _updatePath: function() { + if (this.options.icon) { + this._renderer._updateIcon(this); + } else { + L.CircleMarker.prototype._updatePath.call(this); + } + }, + + _getImage: function () { + if (this.options.icon) { + var url = this.options.icon.options.iconUrl, + img = PointSymbolizer.iconCache[url]; + if (!img) { + var icon = this.options.icon; + img = PointSymbolizer.iconCache[url] = icon.createIcon(); + } + return img; + } else { + return null; + } + + }, + + _containsPoint: function(p) { + var icon = this.options.icon; + if (icon) { + return this._pxBounds.contains(p); + } else { + return L.CircleMarker.prototype._containsPoint.call(this, p); + } + } +}); + +// ??class LineSymbolizer +// ??inherits Polyline +// A symbolizer for lines. Can be applied to line and polygon features. + +var LineSymbolizer = L.Polyline.extend({ + includes: [Symbolizer.prototype, PolyBase], + + initialize: function(feature, pxPerExtent) { + this.properties = feature.properties; + this._makeFeatureParts(feature, pxPerExtent); + }, + + render: function(renderer, style) { + style.fill = false; + Symbolizer.prototype.render.call(this, renderer, style); + this._updatePath(); + }, + + updateStyle: function(renderer, style) { + style.fill = false; + Symbolizer.prototype.updateStyle.call(this, renderer, style); + }, +}); + +// ??class FillSymbolizer +// ??inherits Polyline +// A symbolizer for filled areas. Applies only to polygon features. + +var FillSymbolizer = L.Polygon.extend({ + includes: [Symbolizer.prototype, PolyBase], + + initialize: function(feature, pxPerExtent) { + this.properties = feature.properties; + this._makeFeatureParts(feature, pxPerExtent); + }, + + render: function(renderer, style) { + Symbolizer.prototype.render.call(this, renderer, style); + this._updatePath(); + } +}); + +/* ??class VectorGrid + * ??inherits GridLayer + * + * A `VectorGrid` is a generic, abstract class for displaying tiled vector data. + * it provides facilities for symbolizing and rendering the data in the vector + * tiles, but lacks the functionality to fetch the vector tiles from wherever + * they are. + * + * Extends Leaflet's `L.GridLayer`. + */ + +L.VectorGrid = L.GridLayer.extend({ + + options: { + // ??option rendererFactory = L.svg.tile + // A factory method which will be used to instantiate the per-tile renderers. + rendererFactory: L.svg.tile, + + // ??option vectorTileLayerStyles: Object = {} + // A data structure holding initial symbolizer definitions for the vector features. + vectorTileLayerStyles: {}, + + onEachFeature: null, + + // ??option interactive: Boolean = false + // Whether this `VectorGrid` fires `Interactive Layer` events. + interactive: false, + + // ??option getFeatureId: Function = undefined + // A function that, given a vector feature, returns an unique identifier for it, e.g. + // `function(feat) { return feat.properties.uniqueIdField; }`. + // Must be defined for `setFeatureStyle` to work. + }, + + initialize: function(options) { + L.setOptions(this, options); + L.GridLayer.prototype.initialize.apply(this, arguments); + if (this.options.getFeatureId) { + this._vectorTiles = {}; + this._overriddenStyles = {}; + } + this._userLayers = {}; + this.on('tileunload', function(e) { + this._tileUnload(e); + }, this); + this._dataLayerNames = {}; + }, + + createTile: function(coords, done) { + var storeFeatures = this.options.getFeatureId; + var onEachFeature = this.options.onEachFeature; + + var tileSize = this.getTileSize(); + var renderer = this.options.rendererFactory(coords, tileSize, this.options); + + var vectorTilePromise = this._getVectorTilePromise(coords); + + if (storeFeatures) { + this._vectorTiles[this._tileCoordsToKey(coords)] = renderer; + renderer._features = {}; + } + + vectorTilePromise.then( function renderTile(vectorTile) { + for (var layerName in vectorTile.layers) { + this._dataLayerNames[layerName] = true; + var layer = vectorTile.layers[layerName]; + + var pxPerExtent = this.getTileSize().divideBy(layer.extent); + + var layerStyle = this.options.vectorTileLayerStyles[ layerName ] || + L.Path.prototype.options; + + for (var i = 0; i < layer.features.length; i++) { + var feat = layer.features[i]; + var id; + + var styleOptions = layerStyle; + if (storeFeatures) { + id = this.options.getFeatureId(feat); + var styleOverride = this._overriddenStyles[id]; + if (styleOverride) { + if (styleOverride[layerName]) { + styleOptions = styleOverride[layerName]; + } else { + styleOptions = styleOverride; + } + } + } + + if (styleOptions instanceof Function) { + styleOptions = styleOptions(feat.properties, coords.z, feat.type); + } + + if (!(styleOptions instanceof Array)) { + styleOptions = [styleOptions]; + } + + if (!styleOptions.length) { + if (onEachFeature) { + onEachFeature.call(this, feat, null, layer, coords); + } + continue; + } + + var featureLayer = this._createLayer(feat, pxPerExtent); + + if (onEachFeature) { + onEachFeature.call(this, feat, null, layer, coords); + } + + for (var j = 0; j < styleOptions.length; j++) { + if (styleOptions[j] instanceof Function) { + var styleOption = styleOptions[j](feat.properties, coords.z, feat.type); + } + var style = L.extend({}, L.Path.prototype.options, styleOption); + featureLayer.render(renderer, style); + renderer._addPath(featureLayer); + } + + if (this.options.interactive) { + featureLayer.makeInteractive(); + } + + if (storeFeatures) { + renderer._features[id] = { + layerName: layerName, + feature: featureLayer + }; + } + } + + } + if (this._map != null) { + renderer.addTo(this._map); + } + L.Util.requestAnimFrame(done.bind(coords, null, null)); + }.bind(this)); + + return renderer.getContainer(); + }, + + // ??method setFeatureStyle(id: Number, layerStyle: L.Path Options): this + // Given the unique ID for a vector features (as per the `getFeatureId` option), + // re-symbolizes that feature across all tiles it appears in. + setFeatureStyle: function(id, layerStyle) { + this._overriddenStyles[id] = layerStyle; + + for (var tileKey in this._vectorTiles) { + var tile = this._vectorTiles[tileKey]; + var features = tile._features; + var data = features[id]; + if (data) { + var feat = data.feature; + + var styleOptions = layerStyle; + if (layerStyle[data.layerName]) { + styleOptions = layerStyle[data.layerName]; + } + + this._updateStyles(feat, tile, styleOptions); + } + } + return this; + }, + + // ??method setFeatureStyle(id: Number): this + // Reverts the effects of a previous `setFeatureStyle` call. + resetFeatureStyle: function(id) { + delete this._overriddenStyles[id]; + + for (var tileKey in this._vectorTiles) { + var tile = this._vectorTiles[tileKey]; + var features = tile._features; + var data = features[id]; + if (data) { + var feat = data.feature; + var styleOptions = this.options.vectorTileLayerStyles[ data.layerName ] || + L.Path.prototype.options; + this._updateStyles(feat, tile, styleOptions); + } + } + return this; + }, + + // ??method getDataLayerNames(): Array + // Returns an array of strings, with all the known names of data layers in + // the vector tiles displayed. Useful for introspection. + getDataLayerNames: function() { + return Object.keys(this._dataLayerNames); + }, + + vtGeometryToPoint: function(geometry, vtLayer, tileCoords) { + var pxPerExtent = this.getTileSize().x / vtLayer.extent; + var tileSize = this.getTileSize(); + var offset = tileCoords.scaleBy(tileSize); + var point; + if (typeof geometry[0] === 'object' && 'x' in geometry[0]) { + // Protobuf vector tiles return [{x: , y:}] + point = L.point(offset.x + (geometry[0].x * pxPerExtent), offset.y + (geometry[0].y * pxPerExtent)); + } else { + // Geojson-vt returns [,] + point = L.point(offset.x + (geometry[0] * pxPerExtent), offset.y + (geometry[1] * pxPerExtent)); + } + return point; + }, + + vtGeometryToLatLng: function(geometry, vtLayer, tileCoords) { + return this._map.unproject(this.vtGeometryToPoint(geometry, vtLayer, tileCoords)); + }, + + addUserLayer: function(userLayer, tileCoords) { + var tileKey = this._tileCoordsToKey(tileCoords); + this._userLayers[tileKey] = this._userLayers[tileKey] || []; + this._userLayers[tileKey].push(userLayer); + this._map.addLayer(userLayer); + }, + + _tileUnload: function(e) { + var tileKey = this._tileCoordsToKey(e.coords); + if (this._vectorTiles) { + delete this._vectorTiles[tileKey]; + } + var userLayers = this._userLayers[tileKey]; + if (!userLayers) { + return; + } + for(var i = 0; i < userLayers.length; i++) { +// console.log('remove layer'); + this._map.removeLayer(userLayers[i]); + } + delete this._userLayers[tileKey]; + }, + + _updateStyles: function(feat, renderer, styleOptions) { + styleOptions = (styleOptions instanceof Function) ? + styleOptions(feat.properties, renderer.getCoord().z, feat.type) : + styleOptions; + + if (!(styleOptions instanceof Array)) { + styleOptions = [styleOptions]; + } + + for (var j = 0; j < styleOptions.length; j++) { + + var styleOption = (styleOptions[j] instanceof Function) ? + styleOptions[j](feat.properties, renderer.getCoord().z, feat.type) : + styleOptions[j]; + + var style = L.extend({}, L.Path.prototype.options, styleOption); + feat.updateStyle(renderer, style); + } + }, + + _createLayer: function(feat, pxPerExtent, layerStyle) { + var layer; + switch (feat.type) { + case 1: + layer = new PointSymbolizer(feat, pxPerExtent); + break; + case 2: + layer = new LineSymbolizer(feat, pxPerExtent); + break; + case 3: + layer = new FillSymbolizer(feat, pxPerExtent); + break; + } + + if (this.options.interactive) { + layer.addEventParent(this); + } + + return layer; + }, +}); + +/* + * ??section Extension methods + * + * Classes inheriting from `VectorGrid` **must** define the `_getVectorTilePromise` private method. + * + * ??method getVectorTilePromise(coords: Object): Promise + * Given a `coords` object in the form of `{x: Number, y: Number, z: Number}`, + * this function must return a `Promise` for a vector tile. + * + */ +L.vectorGrid = function (options) { + return new L.VectorGrid(options); +}; + +/* + * ??class VectorGrid.Protobuf + * ??extends VectorGrid + * + * A `VectorGrid` for vector tiles fetched from the internet. + * Tiles are supposed to be protobufs (AKA "protobuffer" or "Protocol Buffers"), + * containing data which complies with the + * [MapBox Vector Tile Specification](https://github.com/mapbox/vector-tile-spec/tree/master/2.1). + * + * This is the format used by: + * - Mapbox Vector Tiles + * - Mapzen Vector Tiles + * - ESRI Vector Tiles + * - [OpenMapTiles hosted Vector Tiles](https://openmaptiles.com/hosting/) + * + * ??example + * + * You must initialize a `VectorGrid.Protobuf` with a URL template, just like in + * `L.TileLayer`s. The difference is that the template must point to vector tiles + * (usually `.pbf` or `.mvt`) instead of raster (`.png` or `.jpg`) tiles, and that + * you should define the styling for all the features. + * + *

+ * + * For OpenMapTiles, with a key from [https://openmaptiles.org/docs/host/use-cdn/](https://openmaptiles.org/docs/host/use-cdn/), + * initialization looks like this: + * + * ``` + * L.vectorGrid.protobuf("https://free-{s}.tilehosting.com/data/v3/{z}/{x}/{y}.pbf.pict?key={key}", { + * vectorTileLayerStyles: { ... }, + * subdomains: "0123", + * key: 'abcdefghi01234567890', + * maxNativeZoom: 14 + * }).addTo(map); + * ``` + * + * And for Mapbox vector tiles, it looks like this: + * + * ``` + * L.vectorGrid.protobuf("https://{s}.tiles.mapbox.com/v4/mapbox.mapbox-streets-v6/{z}/{x}/{y}.vector.pbf?access_token={token}", { + * vectorTileLayerStyles: { ... }, + * subdomains: "abcd", + * token: "pk.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRTS.TUVWXTZ0123456789abcde" + * }).addTo(map); + * ``` + */ +L.VectorGrid.Protobuf = L.VectorGrid.extend({ + + options: { + // ??section + // As with `L.TileLayer`, the URL template might contain a reference to + // any option (see the example above and note the `{key}` or `token` in the URL + // template, and the corresponding option). + // + // ??option subdomains: String = 'abc' + // Akin to the `subdomains` option for `L.TileLayer`. + subdomains: 'abc', // Like L.TileLayer + // + // ??option fetchOptions: Object = {} + // options passed to `fetch`, e.g. {credentials: 'same-origin'} to send cookie for the current domain + fetchOptions: {} + }, + + initialize: function(url, options) { + // Inherits options from geojson-vt! +// this._slicer = geojsonvt(geojson, options); + this._url = url; + L.VectorGrid.prototype.initialize.call(this, options); + }, + + // ??method setUrl(url: String, noRedraw?: Boolean): this + // Updates the layer's URL template and redraws it (unless `noRedraw` is set to `true`). + setUrl: function(url, noRedraw) { + this._url = url; + + if (!noRedraw) { + this.redraw(); + } + + return this; + }, + + _getSubdomain: L.TileLayer.prototype._getSubdomain, + + _getVectorTilePromise: function(coords) { + var data = { + s: this._getSubdomain(coords), + x: coords.x, + y: coords.y, + z: coords.z +// z: this._getZoomForUrl() /// TODO: Maybe replicate TileLayer's maxNativeZoom + }; + if (this._map && !this._map.options.crs.infinite) { + var invertedY = this._globalTileRange.max.y - coords.y; + if (this.options.tms) { // Should this option be available in Leaflet.VectorGrid? + data['y'] = invertedY; + } + data['-y'] = invertedY; + } + + var tileUrl = L.Util.template(this._url, L.extend(data, this.options)); + + return fetch(tileUrl, this.options.fetchOptions).then(function(response){ + + if (!response.ok) { + return {layers:[]}; + } + + return response.blob().then( function (blob) { +// console.log(blob); + + var reader = new FileReader(); + return new Promise(function(resolve){ + reader.addEventListener("loadend", function() { + // reader.result contains the contents of blob as a typed array + + // blob.type === 'application/x-protobuf' + var pbf = new index( reader.result ); +// console.log(pbf); + return resolve(new VectorTile( pbf )); + + }); + reader.readAsArrayBuffer(blob); + }); + }); + }).then(function(json){ + +// console.log('Vector tile:', json.layers); +// console.log('Vector tile water:', json.layers.water); // Instance of VectorTileLayer + + // Normalize feature getters into actual instanced features + for (var layerName in json.layers) { + var feats = []; + + for (var i=0; i maxSqDist) {\n index = i;\n maxSqDist = sqDist;\n }\n }\n\n if (maxSqDist > sqTolerance) {\n points[index][2] = maxSqDist; // save the point importance in squared pixels as a z coordinate\n stack.push(first);\n stack.push(index);\n first = index;\n\n } else {\n last = stack.pop();\n first = stack.pop();\n }\n }\n}\n\n// square distance from a point to a segment\nfunction getSqSegDist(p, a, b) {\n\n var x = a[0], y = a[1],\n bx = b[0], by = b[1],\n px = p[0], py = p[1],\n dx = bx - x,\n dy = by - y;\n\n if (dx !== 0 || dy !== 0) {\n\n var t = ((px - x) * dx + (py - y) * dy) / (dx * dx + dy * dy);\n\n if (t > 1) {\n x = bx;\n y = by;\n\n } else if (t > 0) {\n x += dx * t;\n y += dy * t;\n }\n }\n\n dx = px - x;\n dy = py - y;\n\n return dx * dx + dy * dy;\n}\n\nvar convert_1 = convert$1;\n\nvar simplify = simplify_1;\n\n// converts GeoJSON feature into an intermediate projected JSON vector format with simplification data\n\nfunction convert$1(data, tolerance) {\n var features = [];\n\n if (data.type === 'FeatureCollection') {\n for (var i = 0; i < data.features.length; i++) {\n convertFeature(features, data.features[i], tolerance);\n }\n } else if (data.type === 'Feature') {\n convertFeature(features, data, tolerance);\n\n } else {\n // single geometry or a geometry collection\n convertFeature(features, {geometry: data}, tolerance);\n }\n return features;\n}\n\nfunction convertFeature(features, feature, tolerance) {\n if (feature.geometry === null) {\n // ignore features with null geometry\n return;\n }\n\n var geom = feature.geometry,\n type = geom.type,\n coords = geom.coordinates,\n tags = feature.properties,\n i, j, rings, projectedRing;\n\n if (type === 'Point') {\n features.push(create(tags, 1, [projectPoint(coords)]));\n\n } else if (type === 'MultiPoint') {\n features.push(create(tags, 1, project(coords)));\n\n } else if (type === 'LineString') {\n features.push(create(tags, 2, [project(coords, tolerance)]));\n\n } else if (type === 'MultiLineString' || type === 'Polygon') {\n rings = [];\n for (i = 0; i < coords.length; i++) {\n projectedRing = project(coords[i], tolerance);\n if (type === 'Polygon') { projectedRing.outer = (i === 0); }\n rings.push(projectedRing);\n }\n features.push(create(tags, type === 'Polygon' ? 3 : 2, rings));\n\n } else if (type === 'MultiPolygon') {\n rings = [];\n for (i = 0; i < coords.length; i++) {\n for (j = 0; j < coords[i].length; j++) {\n projectedRing = project(coords[i][j], tolerance);\n projectedRing.outer = (j === 0);\n rings.push(projectedRing);\n }\n }\n features.push(create(tags, 3, rings));\n\n } else if (type === 'GeometryCollection') {\n for (i = 0; i < geom.geometries.length; i++) {\n convertFeature(features, {\n geometry: geom.geometries[i],\n properties: tags\n }, tolerance);\n }\n\n } else {\n throw new Error('Input data is not a valid GeoJSON object.');\n }\n}\n\nfunction create(tags, type, geometry) {\n var feature = {\n geometry: geometry,\n type: type,\n tags: tags || null,\n min: [2, 1], // initial bbox values;\n max: [-1, 0] // note that coords are usually in [0..1] range\n };\n calcBBox(feature);\n return feature;\n}\n\nfunction project(lonlats, tolerance) {\n var projected = [];\n for (var i = 0; i < lonlats.length; i++) {\n projected.push(projectPoint(lonlats[i]));\n }\n if (tolerance) {\n simplify(projected, tolerance);\n calcSize(projected);\n }\n return projected;\n}\n\nfunction projectPoint(p) {\n var sin = Math.sin(p[1] * Math.PI / 180),\n x = (p[0] / 360 + 0.5),\n y = (0.5 - 0.25 * Math.log((1 + sin) / (1 - sin)) / Math.PI);\n\n y = y < 0 ? 0 :\n y > 1 ? 1 : y;\n\n return [x, y, 0];\n}\n\n// calculate area and length of the poly\nfunction calcSize(points) {\n var area = 0,\n dist = 0;\n\n for (var i = 0, a, b; i < points.length - 1; i++) {\n a = b || points[i];\n b = points[i + 1];\n\n area += a[0] * b[1] - b[0] * a[1];\n\n // use Manhattan distance instead of Euclidian one to avoid expensive square root computation\n dist += Math.abs(b[0] - a[0]) + Math.abs(b[1] - a[1]);\n }\n points.area = Math.abs(area / 2);\n points.dist = dist;\n}\n\n// calculate the feature bounding box for faster clipping later\nfunction calcBBox(feature) {\n var geometry = feature.geometry,\n min = feature.min,\n max = feature.max;\n\n if (feature.type === 1) { calcRingBBox(min, max, geometry); }\n else { for (var i = 0; i < geometry.length; i++) { calcRingBBox(min, max, geometry[i]); } }\n\n return feature;\n}\n\nfunction calcRingBBox(min, max, points) {\n for (var i = 0, p; i < points.length; i++) {\n p = points[i];\n min[0] = Math.min(p[0], min[0]);\n max[0] = Math.max(p[0], max[0]);\n min[1] = Math.min(p[1], min[1]);\n max[1] = Math.max(p[1], max[1]);\n }\n}\n\nvar tile = transformTile;\nvar point = transformPoint;\n\n// Transforms the coordinates of each feature in the given tile from\n// mercator-projected space into (extent x extent) tile space.\nfunction transformTile(tile, extent) {\n if (tile.transformed) { return tile; }\n\n var z2 = tile.z2,\n tx = tile.x,\n ty = tile.y,\n i, j, k;\n\n for (i = 0; i < tile.features.length; i++) {\n var feature = tile.features[i],\n geom = feature.geometry,\n type = feature.type;\n\n if (type === 1) {\n for (j = 0; j < geom.length; j++) { geom[j] = transformPoint(geom[j], extent, z2, tx, ty); }\n\n } else {\n for (j = 0; j < geom.length; j++) {\n var ring = geom[j];\n for (k = 0; k < ring.length; k++) { ring[k] = transformPoint(ring[k], extent, z2, tx, ty); }\n }\n }\n }\n\n tile.transformed = true;\n\n return tile;\n}\n\nfunction transformPoint(p, extent, z2, tx, ty) {\n var x = Math.round(extent * (p[0] * z2 - tx)),\n y = Math.round(extent * (p[1] * z2 - ty));\n return [x, y];\n}\n\nvar transform$1 = {\n tile: tile,\n point: point\n};\n\nvar clip_1 = clip$1;\n\n/* clip features between two axis-parallel lines:\n * | |\n * ___|___ | /\n * / | \____|____/\n * | |\n */\n\nfunction clip$1(features, scale, k1, k2, axis, intersect, minAll, maxAll) {\n\n k1 /= scale;\n k2 /= scale;\n\n if (minAll >= k1 && maxAll <= k2) { return features; } // trivial accept\n else if (minAll > k2 || maxAll < k1) { return null; } // trivial reject\n\n var clipped = [];\n\n for (var i = 0; i < features.length; i++) {\n\n var feature = features[i],\n geometry = feature.geometry,\n type = feature.type,\n min, max;\n\n min = feature.min[axis];\n max = feature.max[axis];\n\n if (min >= k1 && max <= k2) { // trivial accept\n clipped.push(feature);\n continue;\n } else if (min > k2 || max < k1) { continue; } // trivial reject\n\n var slices = type === 1 ?\n clipPoints(geometry, k1, k2, axis) :\n clipGeometry(geometry, k1, k2, axis, intersect, type === 3);\n\n if (slices.length) {\n // if a feature got clipped, it will likely get clipped on the next zoom level as well,\n // so there's no need to recalculate bboxes\n clipped.push({\n geometry: slices,\n type: type,\n tags: features[i].tags || null,\n min: feature.min,\n max: feature.max\n });\n }\n }\n\n return clipped.length ? clipped : null;\n}\n\nfunction clipPoints(geometry, k1, k2, axis) {\n var slice = [];\n\n for (var i = 0; i < geometry.length; i++) {\n var a = geometry[i],\n ak = a[axis];\n\n if (ak >= k1 && ak <= k2) { slice.push(a); }\n }\n return slice;\n}\n\nfunction clipGeometry(geometry, k1, k2, axis, intersect, closed) {\n\n var slices = [];\n\n for (var i = 0; i < geometry.length; i++) {\n\n var ak = 0,\n bk = 0,\n b = null,\n points = geometry[i],\n area = points.area,\n dist = points.dist,\n outer = points.outer,\n len = points.length,\n a, j, last;\n\n var slice = [];\n\n for (j = 0; j < len - 1; j++) {\n a = b || points[j];\n b = points[j + 1];\n ak = bk || a[axis];\n bk = b[axis];\n\n if (ak < k1) {\n\n if ((bk > k2)) { // ---|-----|-->\n slice.push(intersect(a, b, k1), intersect(a, b, k2));\n if (!closed) { slice = newSlice(slices, slice, area, dist, outer); }\n\n } else if (bk >= k1) { slice.push(intersect(a, b, k1)); } // ---|--> |\n\n } else if (ak > k2) {\n\n if ((bk < k1)) { // <--|-----|---\n slice.push(intersect(a, b, k2), intersect(a, b, k1));\n if (!closed) { slice = newSlice(slices, slice, area, dist, outer); }\n\n } else if (bk <= k2) { slice.push(intersect(a, b, k2)); } // | <--|---\n\n } else {\n\n slice.push(a);\n\n if (bk < k1) { // <--|--- |\n slice.push(intersect(a, b, k1));\n if (!closed) { slice = newSlice(slices, slice, area, dist, outer); }\n\n } else if (bk > k2) { // | ---|-->\n slice.push(intersect(a, b, k2));\n if (!closed) { slice = newSlice(slices, slice, area, dist, outer); }\n }\n // | --> |\n }\n }\n\n // add the last point\n a = points[len - 1];\n ak = a[axis];\n if (ak >= k1 && ak <= k2) { slice.push(a); }\n\n // close the polygon if its endpoints are not the same after clipping\n\n last = slice[slice.length - 1];\n if (closed && last && (slice[0][0] !== last[0] || slice[0][1] !== last[1])) { slice.push(slice[0]); }\n\n // add the final slice\n newSlice(slices, slice, area, dist, outer);\n }\n\n return slices;\n}\n\nfunction newSlice(slices, slice, area, dist, outer) {\n if (slice.length) {\n // we don't recalculate the area/length of the unclipped geometry because the case where it goes\n // below the visibility threshold as a result of clipping is rare, so we avoid doing unnecessary work\n slice.area = area;\n slice.dist = dist;\n if (outer !== undefined) { slice.outer = outer; }\n\n slices.push(slice);\n }\n return [];\n}\n\nvar clip$2 = clip_1;\n\nvar wrap_1 = wrap$1;\n\nfunction wrap$1(features, buffer, intersectX) {\n var merged = features,\n left = clip$2(features, 1, -1 - buffer, buffer, 0, intersectX, -1, 2), // left world copy\n right = clip$2(features, 1, 1 - buffer, 2 + buffer, 0, intersectX, -1, 2); // right world copy\n\n if (left || right) {\n merged = clip$2(features, 1, -buffer, 1 + buffer, 0, intersectX, -1, 2); // center world copy\n\n if (left) { merged = shiftFeatureCoords(left, 1).concat(merged); } // merge left into center\n if (right) { merged = merged.concat(shiftFeatureCoords(right, -1)); } // merge right into center\n }\n\n return merged;\n}\n\nfunction shiftFeatureCoords(features, offset) {\n var newFeatures = [];\n\n for (var i = 0; i < features.length; i++) {\n var feature = features[i],\n type = feature.type;\n\n var newGeometry;\n\n if (type === 1) {\n newGeometry = shiftCoords(feature.geometry, offset);\n } else {\n newGeometry = [];\n for (var j = 0; j < feature.geometry.length; j++) {\n newGeometry.push(shiftCoords(feature.geometry[j], offset));\n }\n }\n\n newFeatures.push({\n geometry: newGeometry,\n type: type,\n tags: feature.tags,\n min: [feature.min[0] + offset, feature.min[1]],\n max: [feature.max[0] + offset, feature.max[1]]\n });\n }\n\n return newFeatures;\n}\n\nfunction shiftCoords(points, offset) {\n var newPoints = [];\n newPoints.area = points.area;\n newPoints.dist = points.dist;\n\n for (var i = 0; i < points.length; i++) {\n newPoints.push([points[i][0] + offset, points[i][1], points[i][2]]);\n }\n return newPoints;\n}\n\nvar tile$1 = createTile$1;\n\nfunction createTile$1(features, z2, tx, ty, tolerance, noSimplify) {\n var tile = {\n features: [],\n numPoints: 0,\n numSimplified: 0,\n numFeatures: 0,\n source: null,\n x: tx,\n y: ty,\n z2: z2,\n transformed: false,\n min: [2, 1],\n max: [-1, 0]\n };\n for (var i = 0; i < features.length; i++) {\n tile.numFeatures++;\n addFeature(tile, features[i], tolerance, noSimplify);\n\n var min = features[i].min,\n max = features[i].max;\n\n if (min[0] < tile.min[0]) { tile.min[0] = min[0]; }\n if (min[1] < tile.min[1]) { tile.min[1] = min[1]; }\n if (max[0] > tile.max[0]) { tile.max[0] = max[0]; }\n if (max[1] > tile.max[1]) { tile.max[1] = max[1]; }\n }\n return tile;\n}\n\nfunction addFeature(tile, feature, tolerance, noSimplify) {\n\n var geom = feature.geometry,\n type = feature.type,\n simplified = [],\n sqTolerance = tolerance * tolerance,\n i, j, ring, p;\n\n if (type === 1) {\n for (i = 0; i < geom.length; i++) {\n simplified.push(geom[i]);\n tile.numPoints++;\n tile.numSimplified++;\n }\n\n } else {\n\n // simplify and transform projected coordinates for tile geometry\n for (i = 0; i < geom.length; i++) {\n ring = geom[i];\n\n // filter out tiny polylines & polygons\n if (!noSimplify && ((type === 2 && ring.dist < tolerance) ||\n (type === 3 && ring.area < sqTolerance))) {\n tile.numPoints += ring.length;\n continue;\n }\n\n var simplifiedRing = [];\n\n for (j = 0; j < ring.length; j++) {\n p = ring[j];\n // keep points with importance > tolerance\n if (noSimplify || p[2] > sqTolerance) {\n simplifiedRing.push(p);\n tile.numSimplified++;\n }\n tile.numPoints++;\n }\n\n if (type === 3) { rewind(simplifiedRing, ring.outer); }\n\n simplified.push(simplifiedRing);\n }\n }\n\n if (simplified.length) {\n tile.features.push({\n geometry: simplified,\n type: type,\n tags: feature.tags || null\n });\n }\n}\n\nfunction rewind(ring, clockwise) {\n var area = signedArea(ring);\n if (area < 0 === clockwise) { ring.reverse(); }\n}\n\nfunction signedArea(ring) {\n var sum = 0;\n for (var i = 0, len = ring.length, j = len - 1, p1, p2; i < len; j = i++) {\n p1 = ring[i];\n p2 = ring[j];\n sum += (p2[0] - p1[0]) * (p1[1] + p2[1]);\n }\n return sum;\n}\n\nvar index = geojsonvt;\n\nvar convert = convert_1;\nvar transform = transform$1;\nvar clip = clip_1;\nvar wrap = wrap_1;\nvar createTile = tile$1; // final simplified tile generation\n\n\nfunction geojsonvt(data, options) {\n return new GeoJSONVT(data, options);\n}\n\nfunction GeoJSONVT(data, options) {\n options = this.options = extend(Object.create(this.options), options);\n\n var debug = options.debug;\n\n if (debug) { console.time('preprocess data'); }\n\n var z2 = 1 << options.maxZoom, // 2^z\n features = convert(data, options.tolerance / (z2 * options.extent));\n\n this.tiles = {};\n this.tileCoords = [];\n\n if (debug) {\n console.timeEnd('preprocess data');\n console.log('index: maxZoom: %d, maxPoints: %d', options.indexMaxZoom, options.indexMaxPoints);\n console.time('generate tiles');\n this.stats = {};\n this.total = 0;\n }\n\n features = wrap(features, options.buffer / options.extent, intersectX);\n\n // start slicing from the top tile down\n if (features.length) { this.splitTile(features, 0, 0, 0); }\n\n if (debug) {\n if (features.length) { console.log('features: %d, points: %d', this.tiles[0].numFeatures, this.tiles[0].numPoints); }\n console.timeEnd('generate tiles');\n console.log('tiles generated:', this.total, JSON.stringify(this.stats));\n }\n}\n\nGeoJSONVT.prototype.options = {\n maxZoom: 14, // max zoom to preserve detail on\n indexMaxZoom: 5, // max zoom in the tile index\n indexMaxPoints: 100000, // max number of points per tile in the tile index\n solidChildren: false, // whether to tile solid square tiles further\n tolerance: 3, // simplification tolerance (higher means simpler)\n extent: 4096, // tile extent\n buffer: 64, // tile buffer on each side\n debug: 0 // logging level (0, 1 or 2)\n};\n\nGeoJSONVT.prototype.splitTile = function (features, z, x, y, cz, cx, cy) {\n var this$1 = this;\n\n\n var stack = [features, z, x, y],\n options = this.options,\n debug = options.debug,\n solid = null;\n\n // avoid recursion by using a processing queue\n while (stack.length) {\n y = stack.pop();\n x = stack.pop();\n z = stack.pop();\n features = stack.pop();\n\n var z2 = 1 << z,\n id = toID(z, x, y),\n tile = this$1.tiles[id],\n tileTolerance = z === options.maxZoom ? 0 : options.tolerance / (z2 * options.extent);\n\n if (!tile) {\n if (debug > 1) { console.time('creation'); }\n\n tile = this$1.tiles[id] = createTile(features, z2, x, y, tileTolerance, z === options.maxZoom);\n this$1.tileCoords.push({z: z, x: x, y: y});\n\n if (debug) {\n if (debug > 1) {\n console.log('tile z%d-%d-%d (features: %d, points: %d, simplified: %d)',\n z, x, y, tile.numFeatures, tile.numPoints, tile.numSimplified);\n console.timeEnd('creation');\n }\n var key = 'z' + z;\n this$1.stats[key] = (this$1.stats[key] || 0) + 1;\n this$1.total++;\n }\n }\n\n // save reference to original geometry in tile so that we can drill down later if we stop now\n tile.source = features;\n\n // if it's the first-pass tiling\n if (!cz) {\n // stop tiling if we reached max zoom, or if the tile is too simple\n if (z === options.indexMaxZoom || tile.numPoints <= options.indexMaxPoints) { continue; }\n\n // if a drilldown to a specific tile\n } else {\n // stop tiling if we reached base zoom or our target tile zoom\n if (z === options.maxZoom || z === cz) { continue; }\n\n // stop tiling if it's not an ancestor of the target tile\n var m = 1 << (cz - z);\n if (x !== Math.floor(cx / m) || y !== Math.floor(cy / m)) { continue; }\n }\n\n // stop tiling if the tile is solid clipped square\n if (!options.solidChildren && isClippedSquare(tile, options.extent, options.buffer)) {\n if (cz) { solid = z; } // and remember the zoom if we're drilling down\n continue;\n }\n\n // if we slice further down, no need to keep source geometry\n tile.source = null;\n\n if (debug > 1) { console.time('clipping'); }\n\n // values we'll use for clipping\n var k1 = 0.5 * options.buffer / options.extent,\n k2 = 0.5 - k1,\n k3 = 0.5 + k1,\n k4 = 1 + k1,\n tl, bl, tr, br, left, right;\n\n tl = bl = tr = br = null;\n\n left = clip(features, z2, x - k1, x + k3, 0, intersectX, tile.min[0], tile.max[0]);\n right = clip(features, z2, x + k2, x + k4, 0, intersectX, tile.min[0], tile.max[0]);\n\n if (left) {\n tl = clip(left, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]);\n bl = clip(left, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]);\n }\n\n if (right) {\n tr = clip(right, z2, y - k1, y + k3, 1, intersectY, tile.min[1], tile.max[1]);\n br = clip(right, z2, y + k2, y + k4, 1, intersectY, tile.min[1], tile.max[1]);\n }\n\n if (debug > 1) { console.timeEnd('clipping'); }\n\n if (tl) { stack.push(tl, z + 1, x * 2, y * 2); }\n if (bl) { stack.push(bl, z + 1, x * 2, y * 2 + 1); }\n if (tr) { stack.push(tr, z + 1, x * 2 + 1, y * 2); }\n if (br) { stack.push(br, z + 1, x * 2 + 1, y * 2 + 1); }\n }\n\n return solid;\n};\n\nGeoJSONVT.prototype.getTile = function (z, x, y) {\n var this$1 = this;\n\n var options = this.options,\n extent = options.extent,\n debug = options.debug;\n\n var z2 = 1 << z;\n x = ((x % z2) + z2) % z2; // wrap tile x coordinate\n\n var id = toID(z, x, y);\n if (this.tiles[id]) { return transform.tile(this.tiles[id], extent); }\n\n if (debug > 1) { console.log('drilling down to z%d-%d-%d', z, x, y); }\n\n var z0 = z,\n x0 = x,\n y0 = y,\n parent;\n\n while (!parent && z0 > 0) {\n z0--;\n x0 = Math.floor(x0 / 2);\n y0 = Math.floor(y0 / 2);\n parent = this$1.tiles[toID(z0, x0, y0)];\n }\n\n if (!parent || !parent.source) { return null; }\n\n // if we found a parent tile containing the original geometry, we can drill down from it\n if (debug > 1) { console.log('found parent tile z%d-%d-%d', z0, x0, y0); }\n\n // it parent tile is a solid clipped square, return it instead since it's identical\n if (isClippedSquare(parent, extent, options.buffer)) { return transform.tile(parent, extent); }\n\n if (debug > 1) { console.time('drilling down'); }\n var solid = this.splitTile(parent.source, z0, x0, y0, z, x, y);\n if (debug > 1) { console.timeEnd('drilling down'); }\n\n // one of the parent tiles was a solid clipped square\n if (solid !== null) {\n var m = 1 << (z - solid);\n id = toID(solid, Math.floor(x / m), Math.floor(y / m));\n }\n\n return this.tiles[id] ? transform.tile(this.tiles[id], extent) : null;\n};\n\nfunction toID(z, x, y) {\n return (((1 << z) * y + x) * 32) + z;\n}\n\nfunction intersectX(a, b, x) {\n return [x, (x - a[0]) * (b[1] - a[1]) / (b[0] - a[0]) + a[1], 1];\n}\nfunction intersectY(a, b, y) {\n return [(y - a[1]) * (b[0] - a[0]) / (b[1] - a[1]) + a[0], y, 1];\n}\n\nfunction extend(dest, src) {\n for (var i in src) { dest[i] = src[i]; }\n return dest;\n}\n\n// checks whether a tile is a whole-area fill after clipping; if it is, there's no sense slicing it further\nfunction isClippedSquare(tile, extent, buffer) {\n\n var features = tile.source;\n if (features.length !== 1) { return false; }\n\n var feature = features[0];\n if (feature.type !== 3 || feature.geometry.length > 1) { return false; }\n\n var len = feature.geometry[0].length;\n if (len !== 5) { return false; }\n\n for (var i = 0; i < len; i++) {\n var p = transform.point(feature.geometry[0][i], extent, tile.z2, tile.x, tile.y);\n if ((p[0] !== -buffer && p[0] !== extent + buffer) ||\n (p[1] !== -buffer && p[1] !== extent + buffer)) { return false; }\n }\n\n return true;\n}\n\nvar identity = function(x) {\n return x;\n};\n\nvar transform$3 = function(topology) {\n if ((transform = topology.transform) == null) { return identity; }\n var transform,\n x0,\n y0,\n kx = transform.scale[0],\n ky = transform.scale[1],\n dx = transform.translate[0],\n dy = transform.translate[1];\n return function(point, i) {\n if (!i) { x0 = y0 = 0; }\n point[0] = (x0 += point[0]) * kx + dx;\n point[1] = (y0 += point[1]) * ky + dy;\n return point;\n };\n};\n\nvar bbox = function(topology) {\n var bbox = topology.bbox;\n\n function bboxPoint(p0) {\n p1[0] = p0[0], p1[1] = p0[1], t(p1);\n if (p1[0] < x0) { x0 = p1[0]; }\n if (p1[0] > x1) { x1 = p1[0]; }\n if (p1[1] < y0) { y0 = p1[1]; }\n if (p1[1] > y1) { y1 = p1[1]; }\n }\n\n function bboxGeometry(o) {\n switch (o.type) {\n case \"GeometryCollection\": o.geometries.forEach(bboxGeometry); break;\n case \"Point\": bboxPoint(o.coordinates); break;\n case \"MultiPoint\": o.coordinates.forEach(bboxPoint); break;\n }\n }\n\n if (!bbox) {\n var t = transform$3(topology), p0, p1 = new Array(2), name,\n x0 = Infinity, y0 = x0, x1 = -x0, y1 = -x0;\n\n topology.arcs.forEach(function(arc) {\n var i = -1, n = arc.length;\n while (++i < n) {\n p0 = arc[i], p1[0] = p0[0], p1[1] = p0[1], t(p1, i);\n if (p1[0] < x0) { x0 = p1[0]; }\n if (p1[0] > x1) { x1 = p1[0]; }\n if (p1[1] < y0) { y0 = p1[1]; }\n if (p1[1] > y1) { y1 = p1[1]; }\n }\n });\n\n for (name in topology.objects) {\n bboxGeometry(topology.objects[name]);\n }\n\n bbox = topology.bbox = [x0, y0, x1, y1];\n }\n\n return bbox;\n};\n\nvar reverse = function(array, n) {\n var t, j = array.length, i = j - n;\n while (i < --j) { t = array[i], array[i++] = array[j], array[j] = t; }\n};\n\nvar feature = function(topology, o) {\n return o.type === \"GeometryCollection\"\n ? {type: \"FeatureCollection\", features: o.geometries.map(function(o) { return feature$1(topology, o); })}\n : feature$1(topology, o);\n};\n\nfunction feature$1(topology, o) {\n var id = o.id,\n bbox = o.bbox,\n properties = o.properties == null ? {} : o.properties,\n geometry = object(topology, o);\n return id == null && bbox == null ? {type: \"Feature\", properties: properties, geometry: geometry}\n : bbox == null ? {type: \"Feature\", id: id, properties: properties, geometry: geometry}\n : {type: \"Feature\", id: id, bbox: bbox, properties: properties, geometry: geometry};\n}\n\nfunction object(topology, o) {\n var transformPoint = transform$3(topology),\n arcs = topology.arcs;\n\n function arc(i, points) {\n if (points.length) { points.pop(); }\n for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k) {\n points.push(transformPoint(a[k].slice(), k));\n }\n if (i < 0) { reverse(points, n); }\n }\n\n function point(p) {\n return transformPoint(p.slice());\n }\n\n function line(arcs) {\n var points = [];\n for (var i = 0, n = arcs.length; i < n; ++i) { arc(arcs[i], points); }\n if (points.length < 2) { points.push(points[0].slice()); }\n return points;\n }\n\n function ring(arcs) {\n var points = line(arcs);\n while (points.length < 4) { points.push(points[0].slice()); }\n return points;\n }\n\n function polygon(arcs) {\n return arcs.map(ring);\n }\n\n function geometry(o) {\n var type = o.type, coordinates;\n switch (type) {\n case \"GeometryCollection\": return {type: type, geometries: o.geometries.map(geometry)};\n case \"Point\": coordinates = point(o.coordinates); break;\n case \"MultiPoint\": coordinates = o.coordinates.map(point); break;\n case \"LineString\": coordinates = line(o.arcs); break;\n case \"MultiLineString\": coordinates = o.arcs.map(line); break;\n case \"Polygon\": coordinates = polygon(o.arcs); break;\n case \"MultiPolygon\": coordinates = o.arcs.map(polygon); break;\n default: return null;\n }\n return {type: type, coordinates: coordinates};\n }\n\n return geometry(o);\n}\n\nvar stitch = function(topology, arcs) {\n var stitchedArcs = {},\n fragmentByStart = {},\n fragmentByEnd = {},\n fragments = [],\n emptyIndex = -1;\n\n // Stitch empty arcs first, since they may be subsumed by other arcs.\n arcs.forEach(function(i, j) {\n var arc = topology.arcs[i < 0 ? ~i : i], t;\n if (arc.length < 3 && !arc[1][0] && !arc[1][1]) {\n t = arcs[++emptyIndex], arcs[emptyIndex] = i, arcs[j] = t;\n }\n });\n\n arcs.forEach(function(i) {\n var e = ends(i),\n start = e[0],\n end = e[1],\n f, g;\n\n if (f = fragmentByEnd[start]) {\n delete fragmentByEnd[f.end];\n f.push(i);\n f.end = end;\n if (g = fragmentByStart[end]) {\n delete fragmentByStart[g.start];\n var fg = g === f ? f : f.concat(g);\n fragmentByStart[fg.start = f.start] = fragmentByEnd[fg.end = g.end] = fg;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else if (f = fragmentByStart[end]) {\n delete fragmentByStart[f.start];\n f.unshift(i);\n f.start = start;\n if (g = fragmentByEnd[start]) {\n delete fragmentByEnd[g.end];\n var gf = g === f ? f : g.concat(f);\n fragmentByStart[gf.start = g.start] = fragmentByEnd[gf.end = f.end] = gf;\n } else {\n fragmentByStart[f.start] = fragmentByEnd[f.end] = f;\n }\n } else {\n f = [i];\n fragmentByStart[f.start = start] = fragmentByEnd[f.end = end] = f;\n }\n });\n\n function ends(i) {\n var arc = topology.arcs[i < 0 ? ~i : i], p0 = arc[0], p1;\n if (topology.transform) { p1 = [0, 0], arc.forEach(function(dp) { p1[0] += dp[0], p1[1] += dp[1]; }); }\n else { p1 = arc[arc.length - 1]; }\n return i < 0 ? [p1, p0] : [p0, p1];\n }\n\n function flush(fragmentByEnd, fragmentByStart) {\n for (var k in fragmentByEnd) {\n var f = fragmentByEnd[k];\n delete fragmentByStart[f.start];\n delete f.start;\n delete f.end;\n f.forEach(function(i) { stitchedArcs[i < 0 ? ~i : i] = 1; });\n fragments.push(f);\n }\n }\n\n flush(fragmentByEnd, fragmentByStart);\n flush(fragmentByStart, fragmentByEnd);\n arcs.forEach(function(i) { if (!stitchedArcs[i < 0 ? ~i : i]) { fragments.push([i]); } });\n\n return fragments;\n};\n\nfunction extractArcs(topology, object$$1, filter) {\n var arcs = [],\n geomsByArc = [],\n geom;\n\n function extract0(i) {\n var j = i < 0 ? ~i : i;\n (geomsByArc[j] || (geomsByArc[j] = [])).push({i: i, g: geom});\n }\n\n function extract1(arcs) {\n arcs.forEach(extract0);\n }\n\n function extract2(arcs) {\n arcs.forEach(extract1);\n }\n\n function extract3(arcs) {\n arcs.forEach(extract2);\n }\n\n function geometry(o) {\n switch (geom = o, o.type) {\n case \"GeometryCollection\": o.geometries.forEach(geometry); break;\n case \"LineString\": extract1(o.arcs); break;\n case \"MultiLineString\": case \"Polygon\": extract2(o.arcs); break;\n case \"MultiPolygon\": extract3(o.arcs); break;\n }\n }\n\n geometry(object$$1);\n\n geomsByArc.forEach(filter == null\n ? function(geoms) { arcs.push(geoms[0].i); }\n : function(geoms) { if (filter(geoms[0].g, geoms[geoms.length - 1].g)) { arcs.push(geoms[0].i); } });\n\n return arcs;\n}\n\nfunction planarRingArea(ring) {\n var i = -1, n = ring.length, a, b = ring[n - 1], area = 0;\n while (++i < n) { a = b, b = ring[i], area += a[0] * b[1] - a[1] * b[0]; }\n return Math.abs(area); // Note: doubled area!\n}\n\nvar bisect = function(a, x) {\n var lo = 0, hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (a[mid] < x) { lo = mid + 1; }\n else { hi = mid; }\n }\n return lo;\n};\n\nvar slicers = {};\nvar options;\n\nonmessage = function (e) {\n if (e.data[0] === 'slice') {\n // Given a blob of GeoJSON and some topojson/geojson-vt options, do the slicing.\n var geojson = e.data[1];\n options = e.data[2];\n\n if (geojson.type && geojson.type === 'Topology') {\n for (var layerName in geojson.objects) {\n slicers[layerName] = index(\n feature(geojson, geojson.objects[layerName])\n , options);\n }\n } else {\n slicers[options.vectorTileLayerName] = index(geojson, options);\n }\n\n } else if (e.data[0] === 'get') {\n // Gets the vector tile for the given coordinates, sends it back as a message\n var coords = e.data[1];\n\n var tileLayers = {};\n for (var layerName in slicers) {\n var slicedTileLayer = slicers[layerName].getTile(coords.z, coords.x, coords.y);\n\n if (slicedTileLayer) {\n var vectorTileLayer = {\n features: [],\n extent: options.extent,\n name: options.vectorTileLayerName,\n length: slicedTileLayer.features.length\n };\n\n for (var i in slicedTileLayer.features) {\n var feat = {\n geometry: slicedTileLayer.features[i].geometry,\n properties: slicedTileLayer.features[i].tags,\n type: slicedTileLayer.features[i].type // 1 = point, 2 = line, 3 = polygon\n };\n vectorTileLayer.features.push(feat);\n }\n tileLayers[layerName] = vectorTileLayer;\n }\n }\n postMessage({ layers: tileLayers, coords: coords });\n }\n};\n//# sourceMap" + "pingURL=slicerWebWorker.js.worker.map\n", "text/plain; charset=us-ascii", false); + +// The geojson/topojson is sliced into tiles via a web worker. +// This import statement depends on rollup-file-as-blob, so that the +// variable 'workerCode' is a blob URL. + +/* + * ??class VectorGrid.Slicer + * ??extends VectorGrid + * + * A `VectorGrid` for slicing up big GeoJSON or TopoJSON documents in vector + * tiles, leveraging [`geojson-vt`](https://github.com/mapbox/geojson-vt). + * + * ??example + * + * ``` + * var geoJsonDocument = { + * type: 'FeatureCollection', + * features: [ ... ] + * }; + * + * L.vectorGrid.slicer(geoJsonDocument, { + * vectorTileLayerStyles: { + * sliced: { ... } + * } + * }).addTo(map); + * + * ``` + * + * `VectorGrid.Slicer` can also handle [TopoJSON](https://github.com/mbostock/topojson) transparently: + * ```js + * var layer = L.vectorGrid.slicer(topojson, options); + * ``` + * + * The TopoJSON format [implicitly groups features into "objects"](https://github.com/mbostock/topojson-specification/blob/master/README.md#215-objects). + * These will be transformed into vector tile layer names when styling (the + * `vectorTileLayerName` option is ignored when using TopoJSON). + * + */ + +L.VectorGrid.Slicer = L.VectorGrid.extend({ + + options: { + // ??section + // Additionally to these options, `VectorGrid.Slicer` can take in any + // of the [`geojson-vt` options](https://github.com/mapbox/geojson-vt#options). + + // ??option vectorTileLayerName: String = 'sliced' + // Vector tiles contain a set of *data layers*, and those data layers + // contain features. Thus, the slicer creates one data layer, with + // the name given in this option. This is important for symbolizing the data. + vectorTileLayerName: 'sliced', + + extent: 4096, // Default for geojson-vt + maxZoom: 14 // Default for geojson-vt + }, + + initialize: function(geojson, options) { + L.VectorGrid.prototype.initialize.call(this, options); + + // Create a shallow copy of this.options, excluding things that might + // be functions - we only care about topojson/geojsonvt options + var options = {}; + for (var i in this.options) { + if (i !== 'rendererFactory' && + i !== 'vectorTileLayerStyles' && + typeof (this.options[i]) !== 'function' + ) { + options[i] = this.options[i]; + } + } + +// this._worker = new Worker(window.URL.createObjectURL(new Blob([workerCode]))); + this._worker = new Worker(workerCode); + + // Send initial data to worker. + this._worker.postMessage(['slice', geojson, options]); + + }, + + + _getVectorTilePromise: function(coords) { + + var _this = this; + + var p = new Promise( function waitForWorker(res) { + _this._worker.addEventListener('message', function recv(m) { + if (m.data.coords && + m.data.coords.x === coords.x && + m.data.coords.y === coords.y && + m.data.coords.z === coords.z ) { + + res(m.data); + _this._worker.removeEventListener('message', recv); + } + }); + }); + + this._worker.postMessage(['get', coords]); + + return p; + }, + +}); + + +L.vectorGrid.slicer = function (geojson, options) { + return new L.VectorGrid.Slicer(geojson, options); +}; + +L.Canvas.Tile = L.Canvas.extend({ + + initialize: function (tileCoord, tileSize, options) { + L.Canvas.prototype.initialize.call(this, options); + this._tileCoord = tileCoord; + this._size = tileSize; + + this._initContainer(); + this._container.setAttribute('width', this._size.x); + this._container.setAttribute('height', this._size.y); + this._layers = {}; + this._drawnLayers = {}; + this._drawing = true; + + if (options.interactive) { + // By default, Leaflet tiles do not have pointer events + this._container.style.pointerEvents = 'auto'; + } + }, + + getCoord: function() { + return this._tileCoord; + }, + + getContainer: function() { + return this._container; + }, + + getOffset: function() { + return this._tileCoord.scaleBy(this._size).subtract(this._map.getPixelOrigin()); + }, + + onAdd: L.Util.falseFn, + + addTo: function(map) { + this._map = map; + }, + + removeFrom: function (map) { + delete this._map; + }, + + _onClick: function (e) { + var point = this._map.mouseEventToLayerPoint(e).subtract(this.getOffset()), layer, clickedLayer; + + for (var id in this._layers) { + layer = this._layers[id]; + if (layer.options.interactive && layer._containsPoint(point) && !this._map._draggableMoved(layer)) { + clickedLayer = layer; + } + } + if (clickedLayer) { + L.DomEvent.fakeStop(e); + this._fireEvent([clickedLayer], e); + } + }, + + _onMouseMove: function (e) { + if (!this._map || this._map.dragging.moving() || this._map._animatingZoom) { return; } + + var point = this._map.mouseEventToLayerPoint(e).subtract(this.getOffset()); + this._handleMouseHover(e, point); + }, + + /// TODO: Modify _initPath to include an extra parameter, a group name + /// to order symbolizers by z-index + + _updateIcon: function (layer) { + if (!this._drawing) { return; } + + var icon = layer.options.icon, + options = icon.options, + size = L.point(options.iconSize), + anchor = options.iconAnchor || + size && size.divideBy(2, true), + p = layer._point.subtract(anchor), + ctx = this._ctx, + img = layer._getImage(); + + if (img.complete) { + ctx.drawImage(img, p.x, p.y, size.x, size.y); + } else { + L.DomEvent.on(img, 'load', function() { + ctx.drawImage(img, p.x, p.y, size.x, size.y); + }); + } + + this._drawnLayers[layer._leaflet_id] = layer; + } +}); + + +L.canvas.tile = function(tileCoord, tileSize, opts){ + return new L.Canvas.Tile(tileCoord, tileSize, opts); +}; + +// Aux file to bundle everything together, including the optional dependencies +// for protobuf tiles + +}()); +//# sourceMappingURL=Leaflet.VectorGrid.bundled.js.map diff --git a/js/OSMBuildings-Leaflet.js b/js/OSMBuildings-Leaflet.js new file mode 100644 index 0000000..1ac7977 --- /dev/null +++ b/js/OSMBuildings-Leaflet.js @@ -0,0 +1,48 @@ +(function(ca){function S(b,a){var c=b.x-a.x,d=b.y-a.y;return c*c+d*d}function va(b){var a=b.length;if(16>a)return!1;var c,d=Infinity,f=-Infinity,e=Infinity,g=-Infinity;for(c=0;cf||1.15g/e||1.2=a?90:1<=a?-90:(2*xa(ya(E* +(1-2*a)))-J)/E*180;c[d]=f;c[za]=360*(1===b?1:(b%1+1)%1)-180;return c}function da(b,a){var c=U(1,K(0,0.5-Aa(ka(Ba+J*b/180))/E/2));return{x:(a/360+0.5)*T<<0,y:c*T<<0}}function V(b){for(var a=B+p,c=v+n,d=0,f=b.length-3;dp&&b[d]n&&b[d+1]b[c].scale&&(b[c].scale+=0.1,1c&&(c+=1);1c?b:c<2/3?a+(b-a)*(2/3-c)*6:a}var c={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",grey:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",orange:"#ffa500",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00"},d=function(a,b, +c,d){this.H=a;this.S=b;this.L=c;this.A=d};d.parse=function(a){var b=0,d=0,h=0,k=1,m;a=(""+a).toLowerCase();a=c[a]||a;if(m=a.match(/^#(\w{2})(\w{2})(\w{2})$/))b=parseInt(m[1],16),d=parseInt(m[2],16),h=parseInt(m[3],16);else if(m=a.match(/rgba?\((\d+)\D+(\d+)\D+(\d+)(\D+([\d.]+))?\)/))b=parseInt(m[1],10),d=parseInt(m[2],10),h=parseInt(m[3],10),k=m[4]?parseFloat(m[5]):1;else return;return this.fromRGBA(b,d,h,k)};d.fromRGBA=function(a,b,c,h){"object"===typeof a?(b=a.g/255,c=a.b/255,h=a.a,a=a.r/255):(a/= +255,b/=255,c/=255);var k=Math.max(a,b,c),m=Math.min(a,b,c),l,y=(k+m)/2,s=k-m;if(s){m=0.5d?d*(1+c):d+c-d*c,d=2*d-m,b=b/360,c=a(d,m,b+1/3);k=a(d,m,b);b= +a(d,m,b-1/3)}return{r:Math.round(255*c),g:Math.round(255*k),b:Math.round(255*b),a:h}},toString:function(){var a=this.toRGBA();return 1===a.a?"#"+(16777216+(a.r<<16)+(a.g<<8)+a.b).toString(16).slice(1,7):"rgba("+[a.r,a.g,a.b,a.a.toFixed(2)].join()+")"},hue:function(a){return new d(this.H*a,this.S,this.L,this.A)},saturation:function(a){return new d(this.H,this.S*a,this.L,this.A)},lightness:function(a){return new d(this.H,this.S,this.L*a,this.A)},alpha:function(a){return new d(this.H,this.S,this.L,this.A* +a)}};return d}(this),Ha=function(){var b=Math,a=b.PI,c=b.sin,d=b.cos,f=b.tan,e=b.asin,g=b.atan2,h=a/180,k=23.4397*h;return function(b,l,y){y=h*-y;l*=h;b=b.valueOf()/864E5-0.5+2440588-2451545;var s=h*(357.5291+0.98560028*b),D;D=h*(1.9148*c(s)+0.02*c(2*s)+3E-4*c(3*s));D=s+D+102.9372*h+a;s=e(c(0)*d(k)+d(0)*c(k)*c(D));D=g(c(D)*d(k)-f(0)*c(k),d(D));b=h*(280.16+360.9856235*b)-y-D;y=e(c(l)*c(s)+d(l)*d(s)*d(b));l=g(c(b),d(b)*c(l)-f(s)*d(l));return{altitude:y,azimuth:l-a/2}}}(),Ja=function(){function b(a){a= +a.toLowerCase();return"#"===a[0]?a:d[f[a]||a]||null}function a(a,b){var c,d,f,s,D=0,p,n;p=0;for(n=a.length-3;ph.status||299f;)k=c.shift(),d-=k.size,delete a[k.url]}};h.open("GET",b);h.send(null);return h}}var a={},c=[],d=0,f=5242880;return{loadJSON:function(a,c){return b(a,function(a){var b;try{b= +JSON.parse(a)}catch(d){}c(b)})}}}(),F={loadedItems:{},items:[],getPixelFootprint:function(b){for(var a=new ra(b.length),c,d=0,f=b.length-1;dg&&(k=e,g=h)}2a.length))return a},resetItems:function(){this.items=[];this.loadedItems={};Y.reset()},addRenderItems:function(b,a){for(var c,d,f,e=Ja.read(b),g=0,h=e.length;gga)&&(a.footprint=this.getPixelFootprint(b.footprint),a.footprint)){for(var d=a.footprint,f=Infinity,e=-Infinity,g=Infinity,h=-Infinity,k=0,m=d.length-3;k>16-x,c=p/a<<0, +d=n/a<<0,f=qa((p+B)/a),a=qa((n+v)/a),e,g=this;for(e=d;e<=a;e++)for(d=c;d<=f;d++)this.loadTile(d,e,16,b)}},loadTile:function(b,a,c,d){b=this.src.replace("{s}","abcd"[(b+a)%4]).replace("{x}",b).replace("{y}",a).replace("{z}",c);return Ka.loadJSON(b,d)}},Z={draw:function(b,a,c,d,f,e,g,h){var k,m=this._extrude(b,a,d,f,e,g),l=[];if(c)for(a=0,k=c.length;a(m.x-h.x)*(k.y-h.y)&&(b.fillStyle=h.xk.x&&h.y>k.y?e:f,b.beginPath(),this._ring(b,[k.x,k.y,h.x,h.y,m.x,m.y,l.x,l.y]),b.closePath(),b.fill()),y[s]=m.x,y[s+1]=m.y;return y},_ring:function(b,a){b.moveTo(a[0], +a[1]);for(var c=2,d=a.length-1;c(k.x-g.x)*(h.y-g.y)?(1===e&&b.lineTo(g.x,g.y),e=0,l||b.moveTo(g.x,g.y),b.lineTo(h.x,h.y)):(0===e&&b.lineTo(k.x,k.y),e=1,l||b.moveTo(k.x,k.y),b.lineTo(m.x,m.y));if(c)for(l=0,q=c.length;l(e.x-g.x)*(h.y-g.y)?(1===c&&b.lineTo(g.x,g.y),c=0,l||b.moveTo(g.x,g.y),b.lineTo(h.x,h.y)):(0===c&&b.lineTo(e.x,e.y),c=1,l||b.moveTo(e.x,e.y),b.lineTo(m.x,m.y));b.closePath();b.fill()}},w={draw:function(b,a,c,d,f,e,g,h,k){a={x:a.x-p,y:a.y-n};var m=q/(q-f),l=q/(q-e);f=r.project(a,m);d*=m;e&&(a=r.project(a,l),c*=l);(m=this._tangents(a, +c,f,d))?(e=P(m[0].y1-a.y,m[0].x1-a.x),m=P(m[1].y1-a.y,m[1].x1-a.x)):(e=1.5*E,m=1.5*E);b.fillStyle=g;b.beginPath();b.arc(f.x,f.y,d,J,e,!0);b.arc(a.x,a.y,c,e,J);b.closePath();b.fill();b.fillStyle=h;b.beginPath();b.arc(f.x,f.y,d,m,J,!0);b.arc(a.x,a.y,c,J,m);b.closePath();b.fill();b.fillStyle=k;this._circle(b,f,d)},simplified:function(b,a,c){this._circle(b,{x:a.x-p,y:a.y-n},c)},shadow:function(b,a,c,d,f,e){a={x:a.x-p,y:a.y-n};f=z.project(a,f);var g;e&&(a=z.project(a,e));var h=this._tangents(a,c,f,d); +h?(e=P(h[0].y1-a.y,h[0].x1-a.x),g=P(h[1].y1-a.y,h[1].x1-a.x),b.moveTo(h[1].x2,h[1].y2),b.arc(f.x,f.y,d,g,e),b.arc(a.x,a.y,c,e,g)):(b.moveTo(a.x+c,a.y),b.arc(a.x,a.y,c,0,2*E))},shadowMask:function(b,a,c){var d=a.x-p;a=a.y-n;b.moveTo(d+c,a);b.arc(d,a,c,0,2*E)},hitArea:function(b,a,c,d,f,e,g){a={x:a.x-p,y:a.y-n};var h=q/(q-f),k=q/(q-e);f=r.project(a,h);d*=h;e&&(a=r.project(a,k),c*=k);e=this._tangents(a,c,f,d);b.fillStyle=g;b.beginPath();e?(g=P(e[0].y1-a.y,e[0].x1-a.x),h=P(e[1].y1-a.y,e[1].x1-a.x),b.moveTo(e[1].x2, +e[1].y2),b.arc(f.x,f.y,d,h,g),b.arc(a.x,a.y,c,g,h)):(b.moveTo(a.x+c,a.y),b.arc(a.x,a.y,c,0,2*E));b.closePath();b.fill()},_circle:function(b,a,c){b.beginPath();b.arc(a.x,a.y,c,0,2*E);b.stroke();b.fill()},_tangents:function(b,a,c,d){var f=b.x-c.x,e=b.y-c.y,g=a-d,h=f*f+e*e;if(!(h<=g*g)){var h=pa(h),f=-f/h,e=-e/h,g=g/h,h=[],k,m,l;k=pa(K(0,1-g*g));for(var n=1;-1<=n;n-=2)m=f*g-n*k*e,l=e*g+n*k*f,h.push({x1:b.x+a*m<<0,y1:b.y+a*l<<0,x2:c.x+d*m<<0,y2:c.y+d*l<<0});return h}}},R={draw:function(b,a,c,d,f,e,g){var h= +q/(q-f);c=r.project({x:c.x-p,y:c.y-n},q/(q-d));d={x:0,y:0};for(var k={x:0,y:0},m=0,l=a.length-3;m(c.x-d.x)*(k.y-d.y)&&(b.fillStyle=d.xk.x&&d.y>k.y?g:e,b.beginPath(),this._triangle(b,d,k,c),b.closePath(),b.fill())},_triangle:function(b,a,c,d){b.moveTo(a.x,a.y);b.lineTo(c.x,c.y);b.lineTo(d.x,d.y)},_ring:function(b,a){b.moveTo(a[0]-p,a[1]-n);for(var c=2,d=a.length-1;c< +d;c+=2)b.lineTo(a[c]-p,a[c+1]-n)},shadow:function(b,a,c,d,f){var e={x:0,y:0},g={x:0,y:0};c=z.project({x:c.x-p,y:c.y-n},d);d=0;for(var h=a.length-3;d(c.x-e.x)*(g.y-e.y)&&this._triangle(b,e,g,c)},shadowMask:function(b,a){this._ring(b,a)},hitArea:function(b,a,c,d,f,e){var g=q/(q-f);c=r.project({x:c.x-p,y:c.y-n},q/(q-d));d={x:0,y:0};var h={x:0,y:0};b.fillStyle=e;b.beginPath();e=0;for(var k= +a.length-3;e(c.x-d.x)*(h.y-d.y)&&this._triangle(b,d,h,c);b.closePath();b.fill()}},r={project:function(b,a){return{x:(b.x-M)*a+M<<0,y:(b.y-N)*a+N<<0}},render:function(){var b=this.context;b.clearRect(0,0,B,v);if(!(xa.scale?a.height*a.scale:a.height;d=0;a.minHeight&&(d=1>a.scale?a.minHeight*a.scale:a.minHeight);g=a.wallColor||ha;h=a.altColor||aa;k=a.roofColor||X;b.strokeStyle=h;switch(a.shape){case "cylinder":w.draw(b,a.center,a.radius,a.radius,c,d,g,h,k);break;case "cone":w.draw(b,a.center,a.radius,0,c,d,g,h);break;case "dome":w.draw(b,a.center,a.radius,a.radius/2,c,d,g,h);break;case "sphere":w.draw(b,a.center,a.radius,a.radius,c,d,g,h,k);break;case "pyramid":R.draw(b, +e,a.center,c,d,g,h);break;default:Z.draw(b,e,a.holes,c,d,g,h,k)}switch(a.roofShape){case "cone":w.draw(b,a.center,a.radius,0,c+a.roofHeight,c,k,""+I.parse(k).lightness(0.9));break;case "dome":w.draw(b,a.center,a.radius,a.radius/2,c+a.roofHeight,c,k,""+I.parse(k).lightness(0.9));break;case "pyramid":R.draw(b,e,a.center,c+a.roofHeight,c,k,I.parse(k).lightness(0.9))}}}}},ia={maxZoom:G+2,maxHeight:5,isSimple:function(b){return x<=this.maxZoom&&b.height+b.roofHeightthis.maxZoom))for(var a,c,d=F.items,f=0,e=d.length;f=this.maxHeight)&&(c=a.footprint,V(c)))switch(b.strokeStyle=a.altColor||aa,b.fillStyle=a.roofColor||X,a.shape){case "cylinder":case "cone":case "dome":case "sphere":w.simplified(b,a.center,a.radius);break;default:Z.simplified(b,c,a.holes)}}},z={enabled:!0,color:"#666666",blurColor:"#000000",blurSize:15,date:new Date,direction:{x:0,y:0},project:function(b,a){return{x:b.x+ +this.direction.x*a,y:b.y+this.direction.y*a}},render:function(){var b=this.context,a,c,d;b.clearRect(0,0,B,v);if(!(!this.enabled||x=a.altitude))){c=1/ka(a.altitude);d=5>c?0.75:1/c*5;this.direction.x=Fa(a.azimuth)*c;this.direction.y=Ea(a.azimuth)*c;var f,e,g,h;a=F.items;b.canvas.style.opacity=d/(2*C);b.shadowColor=this.blurColor;b.shadowBlur=C/2*this.blurSize;b.fillStyle=this.color;b.beginPath();d=0;for(c=a.length;df.scale?f.height*f.scale:f.height;g=0;f.minHeight&&(g=1>f.scale?f.minHeight*f.scale:f.minHeight);switch(f.shape){case "cylinder":w.shadow(b,f.center,f.radius,f.radius,e,g);break;case "cone":w.shadow(b,f.center,f.radius,0,e,g);break;case "dome":w.shadow(b,f.center,f.radius,f.radius/2,e,g);break;case "sphere":w.shadow(b,f.center,f.radius,f.radius,e,g);break;case "pyramid":R.shadow(b,h,f.center,e,g);break;default:Z.shadow(b,h,f.holes,e,g)}switch(f.roofShape){case "cone":w.shadow(b, +f.center,f.radius,0,e+f.roofHeight,e);break;case "dome":w.shadow(b,f.center,f.radius,f.radius/2,e+f.roofHeight,e);break;case "pyramid":R.shadow(b,h,f.center,e+f.roofHeight,e)}}b.closePath();b.fill();b.shadowBlur=null;b.globalCompositeOperation="destination-out";b.beginPath();d=0;for(c=a.length;d>8&255,a>>16&255].join()+")"}}, +$,A={container:document.createElement("DIV"),items:[],init:function(){this.container.style.pointerEvents="none";this.container.style.position="absolute";this.container.style.left=0;this.container.style.top=0;z.context=this.createContext(this.container);ia.context=this.createContext(this.container);r.context=this.createContext(this.container);Y.context=this.createContext()},render:function(b){Ga(function(){b||(z.render(),ia.render(),Y.render());r.render()})},createContext:function(b){var a=document.createElement("CANVAS"); +a.style.transform="translate3d(0, 0, 0)";a.style.imageRendering="optimizeSpeed";a.style.position="absolute";a.style.left=0;a.style.top=0;var c=a.getContext("2d");c.lineCap="round";c.lineJoin="round";c.lineWidth=1;c.imageSmoothingEnabled=!1;this.items.push(a);b&&b.appendChild(a);return c},appendTo:function(b){b.appendChild(this.container)},remove:function(){this.container.parentNode.removeChild(this.container)},setSize:function(b,a){for(var c=0,d=this.items.length;cOSM Buildings');F.update()};t.onRemove=function(){var b=this.map;b.attributionControl&&b.attributionControl.removeAttribution('© OSM Buildings');b.off({move:this.onMove, +moveend:this.onMoveEnd,zoomstart:this.onZoomStart,zoomend:this.onZoomEnd,resize:this.onResize,viewreset:this.onViewReset,click:this.onClick},this);b.options.zoomAnimation&&b.off("zoomanim",this.onZoom,this);A.remove()};t.onMove=function(b){b=this.getOffset();ea({x:this.offset.x-b.x,y:this.offset.y-b.y})};t.onMoveEnd=function(b){if(this.noMoveEnd)this.noMoveEnd=!1;else{var a=this.map;b=this.getOffset();var c=a.getPixelOrigin();this.offset=b;A.setPosition(-b.x,-b.y);ea({x:0,y:0});la({width:a._size.x, +height:a._size.y});a=c.y-b.y;p=c.x-b.x;n=a;A.render();F.update()}};t.onZoomStart=function(b){Q=!0;A.render()};t.onZoom=function(b){};t.onZoomEnd=function(b){b=this.map;var a=this.getOffset(),c=b.getPixelOrigin(),d=c.y-a.y;p=c.x-a.x;n=d;b=b._zoom;Q=!1;ma(b);F.update();A.render();this.noMoveEnd=!0};t.onResize=function(){};t.onViewReset=function(){var b=this.getOffset();this.offset=b;A.setPosition(-b.x,-b.y);ea({x:0,y:0})};t.onClick=function(b){var a=Y.getIdFromXY(b.containerPoint.x,b.containerPoint.y); +a&&ua({feature:a,lat:b.latlng.lat,lon:b.latlng.lng})};t.getOffset=function(){return L.DomUtil.getPosition(this.map._mapPane)};t.style=function(b){b=b||{};var a;if(a=b.color||b.wallColor)H=I.parse(a),ha=""+H.alpha(C),ba=H.lightness(0.8),aa=""+ba.alpha(C),O=H.lightness(1.2),X=""+O.alpha(C);b.roofColor&&(O=I.parse(b.roofColor),X=""+O.alpha(C));void 0!==b.shadows&&(z.enabled=!!b.shadows);A.render();return this};t.date=function(b){z.date=b;z.render();return this};t.load=function(b){F.load(b);return this}; +t.set=function(b){F.set(b);return this};var ta=function(){};t.each=function(b){ta=function(a){return b(a)};return this};var ua=function(){};t.click=function(b){ua=function(a){return b(a)};return this};u.VERSION="0.2.2b";u.ATTRIBUTION='© OSM Buildings';ca.OSMBuildings=u})(this); diff --git a/js/labelgun.min.js b/js/labelgun.min.js new file mode 100644 index 0000000..41eb5d4 --- /dev/null +++ b/js/labelgun.min.js @@ -0,0 +1 @@ +!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t(require("rbush")):"function"==typeof define&&define.amd?define(["rbush"],t):"object"==typeof exports?exports.labelgun=t(require("rbush")):e.labelgun=t(e.rbush)}(this,function(e){return function(e){function t(l){if(a[l])return a[l].exports;var n=a[l]={i:l,l:!1,exports:{}};return e[l].call(n.exports,n,n.exports,t),n.l=!0,n.exports}var a={};return t.m=e,t.c=a,t.d=function(e,a,l){t.o(e,a)||Object.defineProperty(e,a,{configurable:!1,enumerable:!0,get:l})},t.n=function(e){var a=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(a,"a",a),a},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p="",t(t.s=0)}([function(e,t,a){"use strict";function l(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(t,"__esModule",{value:!0});var n=function(){function e(e,t){for(var a=0;at.weight||a.isDragged)return!1;return!0}},{key:"_compare",value:function(e,t){return e.weight>t.weight?-1:e.weight0&&(this.hasChanged.forEach(function(t){e._handleLabelIngestion(t)}),this.hasChanged=[])}},{key:"_handleLabelIngestion",value:function(e){var t=this.allLabels[e];this.ingestLabel({bottomLeft:[t.minX,t.minY],topRight:[t.maxX,t.maxY]},t.id,t.weight,t.labelObject,t.name,t.isDragged)}},{key:"update",value:function(e){this.allChanged=!e,this._setupLabels(),this._compareLabels(),this._callLabelCallbacks()}},{key:"removeLabel",value:function(e){var t=this.allLabels[e];this.tree.remove(t),delete this.allLabels[e]}},{key:"_addToTree",value:function(e){this.allLabels[e.id]=e,this.tree.insert(e)}},{key:"ingestLabel",value:function(e,t,a,l,n,i){if(void 0!==a&&null!==a||(a=0),!e||!e.bottomLeft||!e.topRight)throw Error("Bounding box must be defined with bottomLeft and topRight properties");if("string"!=typeof t&&"number"!=typeof t)throw Error("Label IDs must be a string or a number");var s=this.allLabels[t];s&&this.removeLabel(s.id);var r={minX:e.bottomLeft[0],minY:e.bottomLeft[1],maxX:e.topRight[0],maxY:e.topRight[1],state:"hide",id:t,weight:a,labelObject:l,name:n,isDragged:i};this._addToTree(r)}},{key:"labelHasChanged",value:function(e){-1===this.hasChanged.indexOf(e)&&this.hasChanged.push(e)}}]),e}();t.default=r},function(t,a){t.exports=e}])}); \ No newline at end of file diff --git a/js/labels.js b/js/labels.js new file mode 100644 index 0000000..a12bdfb --- /dev/null +++ b/js/labels.js @@ -0,0 +1,62 @@ +var hideLabel = function(label) { + label.labelObject.style.opacity = 0; + label.labelObject.style.transition = 'opacity 0s'; +}; +var showLabel = function(label) { + label.labelObject.style.opacity = 1; + label.labelObject.style.transition = 'opacity 1s'; +}; +labelEngine = new labelgun.default(hideLabel, showLabel); + +var id = 0; +var labels = []; +var totalMarkers = 0; + +function resetLabels(markers) { + labelEngine.reset(); + var i = 0; + for (var j = 0; j < markers.length; j++) { + markers[j].eachLayer(function(label){ + addLabel(label, ++i); + }); + } + labelEngine.update(); +} + +function addLabel(layer, id) { + + // This is ugly but there is no getContainer method on the tooltip :( + if (layer.getTooltip()) { + var label = layer.getTooltip()._source._tooltip._container; + if (label) { + + // We need the bounding rectangle of the label itself + var rect = label.getBoundingClientRect(); + + // We convert the container coordinates (screen space) to Lat/lng + var bottomLeft = map.containerPointToLatLng([rect.left, rect.bottom]); + var topRight = map.containerPointToLatLng([rect.right, rect.top]); + var boundingBox = { + bottomLeft : [bottomLeft.lng, bottomLeft.lat], + topRight : [topRight.lng, topRight.lat] + }; + + // Ingest the label into labelgun itself + labelEngine.ingestLabel( + boundingBox, + id, + parseInt(Math.random() * (5 - 1) + 1), // Weight + label, + "Test " + id, + false + ); + + // If the label hasn't been added to the map already + // add it and set the added flag to true + if (!layer.added) { + layer.addTo(map); + layer.added = true; + } + } + } +} \ No newline at end of file diff --git a/js/leaflet-control-geocoder.Geocoder.js b/js/leaflet-control-geocoder.Geocoder.js new file mode 100644 index 0000000..384b764 --- /dev/null +++ b/js/leaflet-control-geocoder.Geocoder.js @@ -0,0 +1,1296 @@ +(function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.leafletControlGeocoder = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0) { + this._alts.innerHTML = ''; + this._results = results; + L.DomUtil.removeClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized'); + for (var i = 0; i < results.length; i++) { + this._alts.appendChild(this._createAlt(results[i], i)); + } + } else { + L.DomUtil.addClass(this._errorElement, 'leaflet-control-geocoder-error'); + } + }, + + markGeocode: function(result) { + result = result.geocode || result; + + this._map.fitBounds(result.bbox); + + if (this._geocodeMarker) { + this._map.removeLayer(this._geocodeMarker); + } + + this._geocodeMarker = new L.Marker(result.center) + .bindPopup(result.html || result.name) + .addTo(this._map) + .openPopup(); + + return this; + }, + + _geocode: function(suggest) { + var requestCount = ++this._requestCount, + mode = suggest ? 'suggest' : 'geocode', + eventData = {input: this._input.value}; + + this._lastGeocode = this._input.value; + if (!suggest) { + this._clearResults(); + } + + this.fire('start' + mode, eventData); + this.options.geocoder[mode](this._input.value, function(results) { + if (requestCount === this._requestCount) { + eventData.results = results; + this.fire('finish' + mode, eventData); + this._geocodeResult(results, suggest); + } + }, this); + }, + + _geocodeResultSelected: function(result) { + this.fire('markgeocode', {geocode: result}); + }, + + _toggle: function() { + if (L.DomUtil.hasClass(this._container, 'leaflet-control-geocoder-expanded')) { + this._collapse(); + } else { + this._expand(); + } + }, + + _expand: function () { + L.DomUtil.addClass(this._container, 'leaflet-control-geocoder-expanded'); + this._input.select(); + this.fire('expand'); + }, + + _collapse: function () { + L.DomUtil.removeClass(this._container, 'leaflet-control-geocoder-expanded'); + L.DomUtil.addClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized'); + L.DomUtil.removeClass(this._errorElement, 'leaflet-control-geocoder-error'); + this._input.blur(); // mobile: keyboard shouldn't stay expanded + this.fire('collapse'); + }, + + _clearResults: function () { + L.DomUtil.addClass(this._alts, 'leaflet-control-geocoder-alternatives-minimized'); + this._selection = null; + L.DomUtil.removeClass(this._errorElement, 'leaflet-control-geocoder-error'); + }, + + _createAlt: function(result, index) { + var li = L.DomUtil.create('li', ''), + a = L.DomUtil.create('a', '', li), + icon = this.options.showResultIcons && result.icon ? L.DomUtil.create('img', '', a) : null, + text = result.html ? undefined : document.createTextNode(result.name), + mouseDownHandler = function mouseDownHandler(e) { + // In some browsers, a click will fire on the map if the control is + // collapsed directly after mousedown. To work around this, we + // wait until the click is completed, and _then_ collapse the + // control. Messy, but this is the workaround I could come up with + // for #142. + this._preventBlurCollapse = true; + L.DomEvent.stop(e); + this._geocodeResultSelected(result); + L.DomEvent.on(li, 'click', function() { + if (this.options.collapsed) { + this._collapse(); + } else { + this._clearResults(); + } + }, this); + }; + + if (icon) { + icon.src = result.icon; + } + + li.setAttribute('data-result-index', index); + + if (result.html) { + a.innerHTML = a.innerHTML + result.html; + } else { + a.appendChild(text); + } + + // Use mousedown and not click, since click will fire _after_ blur, + // causing the control to have collapsed and removed the items + // before the click can fire. + L.DomEvent.addListener(li, 'mousedown touchstart', mouseDownHandler, this); + + return li; + }, + + _keydown: function(e) { + var _this = this, + select = function select(dir) { + if (_this._selection) { + L.DomUtil.removeClass(_this._selection, 'leaflet-control-geocoder-selected'); + _this._selection = _this._selection[dir > 0 ? 'nextSibling' : 'previousSibling']; + } + if (!_this._selection) { + _this._selection = _this._alts[dir > 0 ? 'firstChild' : 'lastChild']; + } + + if (_this._selection) { + L.DomUtil.addClass(_this._selection, 'leaflet-control-geocoder-selected'); + } + }; + + switch (e.keyCode) { + // Escape + case 27: + if (this.options.collapsed) { + this._collapse(); + } + break; + // Up + case 38: + select(-1); + break; + // Up + case 40: + select(1); + break; + // Enter + case 13: + if (this._selection) { + var index = parseInt(this._selection.getAttribute('data-result-index'), 10); + this._geocodeResultSelected(this._results[index]); + this._clearResults(); + } else { + this._geocode(); + } + break; + } + }, + _change: function(e) { + var v = this._input.value; + if (v !== this._lastGeocode) { + clearTimeout(this._suggestTimeout); + if (v.length >= this.options.suggestMinLength) { + this._suggestTimeout = setTimeout(L.bind(function() { + this._geocode(true); + }, this), this.options.suggestTimeout); + } else { + this._clearResults(); + } + } + } + }), + factory: function(options) { + return new L.Control.Geocoder(options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./geocoders/nominatim":9}],2:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + service_url: 'http://geocode.arcgis.com/arcgis/rest/services/World/GeocodeServer' + }, + + initialize: function(accessToken, options) { + L.setOptions(this, options); + this._accessToken = accessToken; + }, + + geocode: function(query, cb, context) { + var params = { + SingleLine: query, + outFields: 'Addr_Type', + forStorage: false, + maxLocations: 10, + f: 'json' + }; + + if (this._key && this._key.length) { + params.token = this._key; + } + + Util.getJSON(this.options.service_url + '/findAddressCandidates', params, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + + if (data.candidates && data.candidates.length) { + for (var i = 0; i <= data.candidates.length - 1; i++) { + loc = data.candidates[i]; + latLng = L.latLng(loc.location.y, loc.location.x); + latLngBounds = L.latLngBounds(L.latLng(loc.extent.ymax, loc.extent.xmax), L.latLng(loc.extent.ymin, loc.extent.xmin)); + results[i] = { + name: loc.address, + bbox: latLngBounds, + center: latLng + }; + } + } + + cb.call(context, results); + }); + }, + + suggest: function(query, cb, context) { + return this.geocode(query, cb, context); + }, + + reverse: function(location, scale, cb, context) { + var params = { + location: encodeURIComponent(location.lng) + ',' + encodeURIComponent(location.lat), + distance: 100, + f: 'json' + }; + + Util.getJSON(this.options.service_url + '/reverseGeocode', params, function(data) { + var result = [], + loc; + + if (data && !data.error) { + loc = L.latLng(data.location.y, data.location.x); + result.push({ + name: data.address.Match_addr, + center: loc, + bounds: L.latLngBounds(loc, loc) + }); + } + + cb.call(context, result); + }); + } + }), + + factory: function(accessToken, options) { + return new L.Control.Geocoder.ArcGis(accessToken, options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],3:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + initialize: function(key) { + this.key = key; + }, + + geocode : function (query, cb, context) { + Util.jsonp('https://dev.virtualearth.net/REST/v1/Locations', { + query: query, + key : this.key + }, function(data) { + var results = []; + if( data.resourceSets.length > 0 ){ + for (var i = data.resourceSets[0].resources.length - 1; i >= 0; i--) { + var resource = data.resourceSets[0].resources[i], + bbox = resource.bbox; + results[i] = { + name: resource.name, + bbox: L.latLngBounds([bbox[0], bbox[1]], [bbox[2], bbox[3]]), + center: L.latLng(resource.point.coordinates) + }; + } + } + cb.call(context, results); + }, this, 'jsonp'); + }, + + reverse: function(location, scale, cb, context) { + Util.jsonp('//dev.virtualearth.net/REST/v1/Locations/' + location.lat + ',' + location.lng, { + key : this.key + }, function(data) { + var results = []; + for (var i = data.resourceSets[0].resources.length - 1; i >= 0; i--) { + var resource = data.resourceSets[0].resources[i], + bbox = resource.bbox; + results[i] = { + name: resource.name, + bbox: L.latLngBounds([bbox[0], bbox[1]], [bbox[2], bbox[3]]), + center: L.latLng(resource.point.coordinates) + }; + } + cb.call(context, results); + }, this, 'jsonp'); + } + }), + + factory: function(key) { + return new L.Control.Geocoder.Bing(key); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],4:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://maps.googleapis.com/maps/api/geocode/json', + geocodingQueryParams: {}, + reverseQueryParams: {} + }, + + initialize: function(key, options) { + this._key = key; + L.setOptions(this, options); + // Backwards compatibility + this.options.serviceUrl = this.options.service_url || this.options.serviceUrl; + }, + + geocode: function(query, cb, context) { + var params = { + address: query + }; + + if (this._key && this._key.length) { + params.key = this._key; + } + + params = L.Util.extend(params, this.options.geocodingQueryParams); + + Util.getJSON(this.options.serviceUrl, params, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + if (data.results && data.results.length) { + for (var i = 0; i <= data.results.length - 1; i++) { + loc = data.results[i]; + latLng = L.latLng(loc.geometry.location); + latLngBounds = L.latLngBounds(L.latLng(loc.geometry.viewport.northeast), L.latLng(loc.geometry.viewport.southwest)); + results[i] = { + name: loc.formatted_address, + bbox: latLngBounds, + center: latLng, + properties: loc.address_components + }; + } + } + + cb.call(context, results); + }); + }, + + reverse: function(location, scale, cb, context) { + var params = { + latlng: encodeURIComponent(location.lat) + ',' + encodeURIComponent(location.lng) + }; + params = L.Util.extend(params, this.options.reverseQueryParams); + if (this._key && this._key.length) { + params.key = this._key; + } + + Util.getJSON(this.options.serviceUrl, params, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + if (data.results && data.results.length) { + for (var i = 0; i <= data.results.length - 1; i++) { + loc = data.results[i]; + latLng = L.latLng(loc.geometry.location); + latLngBounds = L.latLngBounds(L.latLng(loc.geometry.viewport.northeast), L.latLng(loc.geometry.viewport.southwest)); + results[i] = { + name: loc.formatted_address, + bbox: latLngBounds, + center: latLng, + properties: loc.address_components + }; + } + } + + cb.call(context, results); + }); + } + }), + + factory: function(key, options) { + return new L.Control.Geocoder.Google(key, options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],5:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + geocodeUrl: 'http://geocoder.api.here.com/6.2/geocode.json', + reverseGeocodeUrl: 'http://reverse.geocoder.api.here.com/6.2/reversegeocode.json', + app_id: '', + app_code: '', + geocodingQueryParams: {}, + reverseQueryParams: {} + }, + + initialize: function(options) { + L.setOptions(this, options); + }, + + geocode: function(query, cb, context) { + var params = { + searchtext: query, + gen: 9, + app_id: this.options.app_id, + app_code: this.options.app_code, + jsonattributes: 1 + }; + params = L.Util.extend(params, this.options.geocodingQueryParams); + this.getJSON(this.options.geocodeUrl, params, cb, context); + }, + + reverse: function(location, scale, cb, context) { + var params = { + prox: encodeURIComponent(location.lat) + ',' + encodeURIComponent(location.lng), + mode: 'retrieveAddresses', + app_id: this.options.app_id, + app_code: this.options.app_code, + gen: 9, + jsonattributes: 1 + }; + params = L.Util.extend(params, this.options.reverseQueryParams); + this.getJSON(this.options.reverseGeocodeUrl, params, cb, context); + }, + + getJSON: function(url, params, cb, context) { + Util.getJSON(url, params, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + if (data.response.view && data.response.view.length) { + for (var i = 0; i <= data.response.view[0].result.length - 1; i++) { + loc = data.response.view[0].result[i].location; + latLng = L.latLng(loc.displayPosition.latitude, loc.displayPosition.longitude); + latLngBounds = L.latLngBounds(L.latLng(loc.mapView.topLeft.latitude, loc.mapView.topLeft.longitude), L.latLng(loc.mapView.bottomRight.latitude, loc.mapView.bottomRight.longitude)); + results[i] = { + name: loc.address.label, + bbox: latLngBounds, + center: latLng + }; + } + } + cb.call(context, results); + }) + } + }), + + factory: function(options) { + return new L.Control.Geocoder.HERE(options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],6:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://api.tiles.mapbox.com/v4/geocode/mapbox.places-v1/', + geocodingQueryParams: {}, + reverseQueryParams: {} + }, + + initialize: function(accessToken, options) { + L.setOptions(this, options); + this.options.geocodingQueryParams.access_token = accessToken; + this.options.reverseQueryParams.access_token = accessToken; + }, + + geocode: function(query, cb, context) { + var params = this.options.geocodingQueryParams; + if (typeof params.proximity !== 'undefined' + && params.proximity.hasOwnProperty('lat') + && params.proximity.hasOwnProperty('lng')) + { + params.proximity = params.proximity.lng + ',' + params.proximity.lat; + } + Util.getJSON(this.options.serviceUrl + encodeURIComponent(query) + '.json', params, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + if (data.features && data.features.length) { + for (var i = 0; i <= data.features.length - 1; i++) { + loc = data.features[i]; + latLng = L.latLng(loc.center.reverse()); + if (loc.hasOwnProperty('bbox')) + { + latLngBounds = L.latLngBounds(L.latLng(loc.bbox.slice(0, 2).reverse()), L.latLng(loc.bbox.slice(2, 4).reverse())); + } + else + { + latLngBounds = L.latLngBounds(latLng, latLng); + } + results[i] = { + name: loc.place_name, + bbox: latLngBounds, + center: latLng + }; + } + } + + cb.call(context, results); + }); + }, + + suggest: function(query, cb, context) { + return this.geocode(query, cb, context); + }, + + reverse: function(location, scale, cb, context) { + Util.getJSON(this.options.serviceUrl + encodeURIComponent(location.lng) + ',' + encodeURIComponent(location.lat) + '.json', this.options.reverseQueryParams, function(data) { + var results = [], + loc, + latLng, + latLngBounds; + if (data.features && data.features.length) { + for (var i = 0; i <= data.features.length - 1; i++) { + loc = data.features[i]; + latLng = L.latLng(loc.center.reverse()); + if (loc.hasOwnProperty('bbox')) + { + latLngBounds = L.latLngBounds(L.latLng(loc.bbox.slice(0, 2).reverse()), L.latLng(loc.bbox.slice(2, 4).reverse())); + } + else + { + latLngBounds = L.latLngBounds(latLng, latLng); + } + results[i] = { + name: loc.place_name, + bbox: latLngBounds, + center: latLng + }; + } + } + + cb.call(context, results); + }); + } + }), + + factory: function(accessToken, options) { + return new L.Control.Geocoder.Mapbox(accessToken, options); + } +}; + + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],7:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://www.mapquestapi.com/geocoding/v1' + }, + + initialize: function(key, options) { + // MapQuest seems to provide URI encoded API keys, + // so to avoid encoding them twice, we decode them here + this._key = decodeURIComponent(key); + + L.Util.setOptions(this, options); + }, + + _formatName: function() { + var r = [], + i; + for (i = 0; i < arguments.length; i++) { + if (arguments[i]) { + r.push(arguments[i]); + } + } + + return r.join(', '); + }, + + geocode: function(query, cb, context) { + Util.jsonp(this.options.serviceUrl + '/address', { + key: this._key, + location: query, + limit: 5, + outFormat: 'json' + }, function(data) { + var results = [], + loc, + latLng; + if (data.results && data.results[0].locations) { + for (var i = data.results[0].locations.length - 1; i >= 0; i--) { + loc = data.results[0].locations[i]; + latLng = L.latLng(loc.latLng); + results[i] = { + name: this._formatName(loc.street, loc.adminArea4, loc.adminArea3, loc.adminArea1), + bbox: L.latLngBounds(latLng, latLng), + center: latLng + }; + } + } + + cb.call(context, results); + }, this); + }, + + reverse: function(location, scale, cb, context) { + Util.jsonp(this.options.serviceUrl + '/reverse', { + key: this._key, + location: location.lat + ',' + location.lng, + outputFormat: 'json' + }, function(data) { + var results = [], + loc, + latLng; + if (data.results && data.results[0].locations) { + for (var i = data.results[0].locations.length - 1; i >= 0; i--) { + loc = data.results[0].locations[i]; + latLng = L.latLng(loc.latLng); + results[i] = { + name: this._formatName(loc.street, loc.adminArea4, loc.adminArea3, loc.adminArea1), + bbox: L.latLngBounds(latLng, latLng), + center: latLng + }; + } + } + + cb.call(context, results); + }, this); + } + }), + + factory: function(key, options) { + return new L.Control.Geocoder.MapQuest(key, options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],8:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://search.mapzen.com/v1', + geocodingQueryParams: {}, + reverseQueryParams: {} + }, + + initialize: function(apiKey, options) { + L.Util.setOptions(this, options); + this._apiKey = apiKey; + this._lastSuggest = 0; + }, + + geocode: function(query, cb, context) { + var _this = this; + Util.getJSON(this.options.serviceUrl + "/search", L.extend({ + 'api_key': this._apiKey, + 'text': query + }, this.options.geocodingQueryParams), function(data) { + cb.call(context, _this._parseResults(data, "bbox")); + }); + }, + + suggest: function(query, cb, context) { + var _this = this; + Util.getJSON(this.options.serviceUrl + "/autocomplete", L.extend({ + 'api_key': this._apiKey, + 'text': query + }, this.options.geocodingQueryParams), L.bind(function(data) { + if (data.geocoding.timestamp > this._lastSuggest) { + this._lastSuggest = data.geocoding.timestamp; + cb.call(context, _this._parseResults(data, "bbox")); + } + }, this)); + }, + + reverse: function(location, scale, cb, context) { + var _this = this; + Util.getJSON(this.options.serviceUrl + "/reverse", L.extend({ + 'api_key': this._apiKey, + 'point.lat': location.lat, + 'point.lon': location.lng + }, this.options.reverseQueryParams), function(data) { + cb.call(context, _this._parseResults(data, "bounds")); + }); + }, + + _parseResults: function(data, bboxname) { + var results = []; + L.geoJson(data, { + pointToLayer: function (feature, latlng) { + return L.circleMarker(latlng); + }, + onEachFeature: function(feature, layer) { + var result = {}, + bbox, + center; + + if (layer.getBounds) { + bbox = layer.getBounds(); + center = bbox.getCenter(); + } else { + center = layer.getLatLng(); + bbox = L.latLngBounds(center, center); + } + + result.name = layer.feature.properties.label; + result.center = center; + result[bboxname] = bbox; + result.properties = layer.feature.properties; + results.push(result); + } + }); + return results; + } + }), + + factory: function(apiKey, options) { + return new L.Control.Geocoder.Mapzen(apiKey, options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],9:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://nominatim.openstreetmap.org/', + geocodingQueryParams: {}, + reverseQueryParams: {}, + htmlTemplate: function(r) { + var a = r.address, + parts = []; + if (a.road || a.building) { + parts.push('{building} {road} {house_number}'); + } + + if (a.city || a.town || a.village || a.hamlet) { + parts.push('{postcode} {city} {town} {village} {hamlet}'); + } + + if (a.state || a.country) { + parts.push('{state} {country}'); + } + + return Util.template(parts.join('
'), a, true); + } + }, + + initialize: function(options) { + L.Util.setOptions(this, options); + }, + + geocode: function(query, cb, context) { + Util.jsonp(this.options.serviceUrl + 'search', L.extend({ + q: query, + limit: 5, + format: 'json', + addressdetails: 1 + }, this.options.geocodingQueryParams), + function(data) { + var results = []; + for (var i = data.length - 1; i >= 0; i--) { + var bbox = data[i].boundingbox; + for (var j = 0; j < 4; j++) bbox[j] = parseFloat(bbox[j]); + results[i] = { + icon: data[i].icon, + name: data[i].display_name, + html: this.options.htmlTemplate ? + this.options.htmlTemplate(data[i]) + : undefined, + bbox: L.latLngBounds([bbox[0], bbox[2]], [bbox[1], bbox[3]]), + center: L.latLng(data[i].lat, data[i].lon), + properties: data[i] + }; + } + cb.call(context, results); + }, this, 'json_callback'); + }, + + reverse: function(location, scale, cb, context) { + Util.jsonp(this.options.serviceUrl + 'reverse', L.extend({ + lat: location.lat, + lon: location.lng, + zoom: Math.round(Math.log(scale / 256) / Math.log(2)), + addressdetails: 1, + format: 'json' + }, this.options.reverseQueryParams), function(data) { + var result = [], + loc; + + if (data && data.lat && data.lon) { + loc = L.latLng(data.lat, data.lon); + result.push({ + name: data.display_name, + html: this.options.htmlTemplate ? + this.options.htmlTemplate(data) + : undefined, + center: loc, + bounds: L.latLngBounds(loc, loc), + properties: data + }); + } + + cb.call(context, result); + }, this, 'json_callback'); + } + }), + + factory: function(options) { + return new L.Control.Geocoder.Nominatim(options); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],10:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://photon.komoot.de/api/', + reverseUrl: 'https://photon.komoot.de/reverse/', + nameProperties: [ + 'name', + 'street', + 'suburb', + 'hamlet', + 'town', + 'city', + 'state', + 'country' + ] + }, + + initialize: function(options) { + L.setOptions(this, options); + }, + + geocode: function(query, cb, context) { + var params = L.extend({ + q: query + }, this.options.geocodingQueryParams); + + Util.getJSON(this.options.serviceUrl, params, L.bind(function(data) { + cb.call(context, this._decodeFeatures(data)); + }, this)); + }, + + suggest: function(query, cb, context) { + return this.geocode(query, cb, context); + }, + + reverse: function(latLng, scale, cb, context) { + var params = L.extend({ + lat: latLng.lat, + lon: latLng.lng + }, this.options.geocodingQueryParams); + + Util.getJSON(this.options.reverseUrl, params, L.bind(function(data) { + cb.call(context, this._decodeFeatures(data)); + }, this)); + }, + + _decodeFeatures: function(data) { + var results = [], + i, + f, + c, + latLng, + extent, + bbox; + + if (data && data.features) { + for (i = 0; i < data.features.length; i++) { + f = data.features[i]; + c = f.geometry.coordinates; + latLng = L.latLng(c[1], c[0]); + extent = f.properties.extent; + + if (extent) { + bbox = L.latLngBounds([extent[1], extent[0]], [extent[3], extent[2]]); + } else { + bbox = L.latLngBounds(latLng, latLng); + } + + results.push({ + name: this._deocodeFeatureName(f), + html: this.options.htmlTemplate ? + this.options.htmlTemplate(f) + : undefined, + center: latLng, + bbox: bbox, + properties: f.properties + }); + } + } + + return results; + }, + + _deocodeFeatureName: function(f) { + var j, + name; + for (j = 0; !name && j < this.options.nameProperties.length; j++) { + name = f.properties[this.options.nameProperties[j]]; + } + + return name; + } + }), + + factory: function(options) { + return new L.Control.Geocoder.Photon(options); + } +}; + + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],11:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Util = _dereq_('../util'); + +module.exports = { + "class": L.Class.extend({ + options: { + serviceUrl: 'https://api.what3words.com/v2/' + }, + + initialize: function(accessToken) { + this._accessToken = accessToken; + }, + + geocode: function(query, cb, context) { + //get three words and make a dot based string + Util.getJSON(this.options.serviceUrl +'forward', { + key: this._accessToken, + addr: query.split(/\s+/).join('.') + }, function(data) { + var results = [], loc, latLng, latLngBounds; + if (data.hasOwnProperty('geometry')) { + latLng = L.latLng(data.geometry['lat'],data.geometry['lng']); + latLngBounds = L.latLngBounds(latLng, latLng); + results[0] = { + name: data.words, + bbox: latLngBounds, + center: latLng + }; + } + + cb.call(context, results); + }); + }, + + suggest: function(query, cb, context) { + return this.geocode(query, cb, context); + }, + + reverse: function(location, scale, cb, context) { + Util.getJSON(this.options.serviceUrl +'reverse', { + key: this._accessToken, + coords: [location.lat,location.lng].join(',') + }, function(data) { + var results = [],loc,latLng,latLngBounds; + if (data.status.status == 200) { + latLng = L.latLng(data.geometry['lat'],data.geometry['lng']); + latLngBounds = L.latLngBounds(latLng, latLng); + results[0] = { + name: data.words, + bbox: latLngBounds, + center: latLng + }; + } + cb.call(context, results); + }); + } + }), + + factory: function(accessToken) { + return new L.Control.Geocoder.What3Words(accessToken); + } +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"../util":13}],12:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + Control = _dereq_('./control'), + Nominatim = _dereq_('./geocoders/nominatim'), + Bing = _dereq_('./geocoders/bing'), + MapQuest = _dereq_('./geocoders/mapquest'), + Mapbox = _dereq_('./geocoders/mapbox'), + What3Words = _dereq_('./geocoders/what3words'), + Google = _dereq_('./geocoders/google'), + Photon = _dereq_('./geocoders/photon'), + Mapzen = _dereq_('./geocoders/mapzen'), + ArcGis = _dereq_('./geocoders/arcgis'), + HERE = _dereq_('./geocoders/here'); + +module.exports = L.Util.extend(Control["class"], { + Nominatim: Nominatim["class"], + nominatim: Nominatim.factory, + Bing: Bing["class"], + bing: Bing.factory, + MapQuest: MapQuest["class"], + mapQuest: MapQuest.factory, + Mapbox: Mapbox["class"], + mapbox: Mapbox.factory, + What3Words: What3Words["class"], + what3words: What3Words.factory, + Google: Google["class"], + google: Google.factory, + Photon: Photon["class"], + photon: Photon.factory, + Mapzen: Mapzen["class"], + mapzen: Mapzen.factory, + ArcGis: ArcGis["class"], + arcgis: ArcGis.factory, + HERE: HERE["class"], + here: HERE.factory +}); + +L.Util.extend(L.Control, { + Geocoder: module.exports, + geocoder: Control.factory +}); + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./control":1,"./geocoders/arcgis":2,"./geocoders/bing":3,"./geocoders/google":4,"./geocoders/here":5,"./geocoders/mapbox":6,"./geocoders/mapquest":7,"./geocoders/mapzen":8,"./geocoders/nominatim":9,"./geocoders/photon":10,"./geocoders/what3words":11}],13:[function(_dereq_,module,exports){ +(function (global){ +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null), + lastCallbackId = 0, + htmlEscape = (function() { + // Adapted from handlebars.js + // https://github.com/wycats/handlebars.js/ + var badChars = /[&<>"'`]/g; + var possible = /[&<>"'`]/; + var escape = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + '\'': ''', + '`': '`' + }; + + function escapeChar(chr) { + return escape[chr]; + } + + return function(string) { + if (string == null) { + return ''; + } else if (!string) { + return string + ''; + } + + // Force a string conversion as this will be done by the append regardless and + // the regex test will do this transparently behind the scenes, causing issues if + // an object's to string has escaped characters in it. + string = '' + string; + + if (!possible.test(string)) { + return string; + } + return string.replace(badChars, escapeChar); + }; + })(); + +module.exports = { + jsonp: function(url, params, callback, context, jsonpParam) { + var callbackId = '_l_geocoder_' + (lastCallbackId++); + params[jsonpParam || 'callback'] = callbackId; + window[callbackId] = L.Util.bind(callback, context); + var script = document.createElement('script'); + script.type = 'text/javascript'; + script.src = url + L.Util.getParamString(params); + script.id = callbackId; + document.getElementsByTagName('head')[0].appendChild(script); + }, + + getJSON: function(url, params, callback) { + var xmlHttp = new XMLHttpRequest(); + xmlHttp.onreadystatechange = function () { + if (xmlHttp.readyState !== 4){ + return; + } + if (xmlHttp.status !== 200 && xmlHttp.status !== 304){ + callback(''); + return; + } + callback(JSON.parse(xmlHttp.response)); + }; + xmlHttp.open('GET', url + L.Util.getParamString(params), true); + xmlHttp.setRequestHeader('Accept', 'application/json'); + xmlHttp.send(null); + }, + + template: function (str, data) { + return str.replace(/\{ *([\w_]+) *\}/g, function (str, key) { + var value = data[key]; + if (value === undefined) { + value = ''; + } else if (typeof value === 'function') { + value = value(data); + } + return htmlEscape(value); + }); + }, + + htmlEscape: htmlEscape +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{}]},{},[12])(12) +}); \ No newline at end of file diff --git a/js/leaflet-hash.js b/js/leaflet-hash.js new file mode 100644 index 0000000..ef88d96 --- /dev/null +++ b/js/leaflet-hash.js @@ -0,0 +1,162 @@ +(function(window) { + var HAS_HASHCHANGE = (function() { + var doc_mode = window.documentMode; + return ('onhashchange' in window) && + (doc_mode === undefined || doc_mode > 7); + })(); + + L.Hash = function(map) { + this.onHashChange = L.Util.bind(this.onHashChange, this); + + if (map) { + this.init(map); + } + }; + + L.Hash.parseHash = function(hash) { + if(hash.indexOf('#') === 0) { + hash = hash.substr(1); + } + var args = hash.split("/"); + if (args.length == 3) { + var zoom = parseInt(args[0], 10), + lat = parseFloat(args[1]), + lon = parseFloat(args[2]); + if (isNaN(zoom) || isNaN(lat) || isNaN(lon)) { + return false; + } else { + return { + center: new L.LatLng(lat, lon), + zoom: zoom + }; + } + } else { + return false; + } + }; + + L.Hash.formatHash = function(map) { + var center = map.getCenter(), + zoom = map.getZoom(), + precision = Math.max(0, Math.ceil(Math.log(zoom) / Math.LN2)); + + return "#" + [zoom, + center.lat.toFixed(precision), + center.lng.toFixed(precision) + ].join("/"); + }, + + L.Hash.prototype = { + map: null, + lastHash: null, + + parseHash: L.Hash.parseHash, + formatHash: L.Hash.formatHash, + + init: function(map) { + this.map = map; + + // reset the hash + this.lastHash = null; + this.onHashChange(); + + if (!this.isListening) { + this.startListening(); + } + }, + + removeFrom: function(map) { + if (this.changeTimeout) { + clearTimeout(this.changeTimeout); + } + + if (this.isListening) { + this.stopListening(); + } + + this.map = null; + }, + + onMapMove: function() { + // bail if we're moving the map (updating from a hash), + // or if the map is not yet loaded + + if (this.movingMap || !this.map._loaded) { + return false; + } + + var hash = this.formatHash(this.map); + if (this.lastHash != hash) { + location.replace(hash); + this.lastHash = hash; + } + }, + + movingMap: false, + update: function() { + var hash = location.hash; + if (hash === this.lastHash) { + return; + } + var parsed = this.parseHash(hash); + if (parsed) { + this.movingMap = true; + + this.map.setView(parsed.center, parsed.zoom); + + this.movingMap = false; + } else { + this.onMapMove(this.map); + } + }, + + // defer hash change updates every 100ms + changeDefer: 100, + changeTimeout: null, + onHashChange: function() { + // throttle calls to update() so that they only happen every + // `changeDefer` ms + if (!this.changeTimeout) { + var that = this; + this.changeTimeout = setTimeout(function() { + that.update(); + that.changeTimeout = null; + }, this.changeDefer); + } + }, + + isListening: false, + hashChangeInterval: null, + startListening: function() { + this.map.on("moveend", this.onMapMove, this); + + if (HAS_HASHCHANGE) { + L.DomEvent.addListener(window, "hashchange", this.onHashChange); + } else { + clearInterval(this.hashChangeInterval); + this.hashChangeInterval = setInterval(this.onHashChange, 50); + } + this.isListening = true; + }, + + stopListening: function() { + this.map.off("moveend", this.onMapMove, this); + + if (HAS_HASHCHANGE) { + L.DomEvent.removeListener(window, "hashchange", this.onHashChange); + } else { + clearInterval(this.hashChangeInterval); + } + this.isListening = false; + } + }; + L.hash = function(map) { + return new L.Hash(map); + }; + L.Map.prototype.addHash = function() { + this._hash = L.hash(this); + }; + L.Map.prototype.removeHash = function() { + this._hash.removeFrom(); + }; +})(window); diff --git a/js/leaflet-heat.js b/js/leaflet-heat.js new file mode 100644 index 0000000..afe8887 --- /dev/null +++ b/js/leaflet-heat.js @@ -0,0 +1,11 @@ +/* + (c) 2014, Vladimir Agafonkin + simpleheat, a tiny JavaScript library for drawing heatmaps with Canvas + https://github.com/mourner/simpleheat +*/ +!function(){"use strict";function t(i){return this instanceof t?(this._canvas=i="string"==typeof i?document.getElementById(i):i,this._ctx=i.getContext("2d"),this._width=i.width,this._height=i.height,this._max=1,void this.clear()):new t(i)}t.prototype={defaultRadius:25,defaultGradient:{.4:"blue",.6:"cyan",.7:"lime",.8:"yellow",1:"red"},data:function(t,i){return this._data=t,this},max:function(t){return this._max=t,this},add:function(t){return this._data.push(t),this},clear:function(){return this._data=[],this},radius:function(t,i){i=i||15;var a=this._circle=document.createElement("canvas"),s=a.getContext("2d"),e=this._r=t+i;return a.width=a.height=2*e,s.shadowOffsetX=s.shadowOffsetY=200,s.shadowBlur=i,s.shadowColor="black",s.beginPath(),s.arc(e-200,e-200,t,0,2*Math.PI,!0),s.closePath(),s.fill(),this},gradient:function(t){var i=document.createElement("canvas"),a=i.getContext("2d"),s=a.createLinearGradient(0,0,0,256);i.width=1,i.height=256;for(var e in t)s.addColorStop(e,t[e]);return a.fillStyle=s,a.fillRect(0,0,1,256),this._grad=a.getImageData(0,0,1,256).data,this},draw:function(t){this._circle||this.radius(this.defaultRadius),this._grad||this.gradient(this.defaultGradient);var i=this._ctx;i.clearRect(0,0,this._width,this._height);for(var a,s=0,e=this._data.length;e>s;s++)a=this._data[s],i.globalAlpha=Math.max(a[2]/this._max,t||.05),i.drawImage(this._circle,a[0]-this._r,a[1]-this._r);var n=i.getImageData(0,0,this._width,this._height);return this._colorize(n.data,this._grad),i.putImageData(n,0,0),this},_colorize:function(t,i){for(var a,s=3,e=t.length;e>s;s+=4)a=4*t[s],a&&(t[s-3]=i[a],t[s-2]=i[a+1],t[s-1]=i[a+2])}},window.simpleheat=t}(),/* + (c) 2014, Vladimir Agafonkin + Leaflet.heat, a tiny and fast heatmap plugin for Leaflet. + https://github.com/Leaflet/Leaflet.heat +*/ +L.HeatLayer=(L.Layer?L.Layer:L.Class).extend({initialize:function(t,i){this._latlngs=t,L.setOptions(this,i)},setLatLngs:function(t){return this._latlngs=t,this.redraw()},addLatLng:function(t){return this._latlngs.push(t),this.redraw()},setOptions:function(t){return L.setOptions(this,t),this._heat&&this._updateOptions(),this.redraw()},redraw:function(){return!this._heat||this._frame||this._map._animating||(this._frame=L.Util.requestAnimFrame(this._redraw,this)),this},onAdd:function(t){this._map=t,this._canvas||this._initCanvas(),t._panes.overlayPane.appendChild(this._canvas),t.on("moveend",this._reset,this),t.options.zoomAnimation&&L.Browser.any3d&&t.on("zoomanim",this._animateZoom,this),this._reset()},onRemove:function(t){t.getPanes().overlayPane.removeChild(this._canvas),t.off("moveend",this._reset,this),t.options.zoomAnimation&&t.off("zoomanim",this._animateZoom,this)},addTo:function(t){return t.addLayer(this),this},_initCanvas:function(){var t=this._canvas=L.DomUtil.create("canvas","leaflet-heatmap-layer leaflet-layer"),i=L.DomUtil.testProp(["transformOrigin","WebkitTransformOrigin","msTransformOrigin"]);t.style[i]="50% 50%";var a=this._map.getSize();t.width=a.x,t.height=a.y;var s=this._map.options.zoomAnimation&&L.Browser.any3d;L.DomUtil.addClass(t,"leaflet-zoom-"+(s?"animated":"hide")),this._heat=simpleheat(t),this._updateOptions()},_updateOptions:function(){this._heat.radius(this.options.radius||this._heat.defaultRadius,this.options.blur),this.options.gradient&&this._heat.gradient(this.options.gradient),this.options.max&&this._heat.max(this.options.max)},_reset:function(){var t=this._map.containerPointToLayerPoint([0,0]);L.DomUtil.setPosition(this._canvas,t);var i=this._map.getSize();this._heat._width!==i.x&&(this._canvas.width=this._heat._width=i.x),this._heat._height!==i.y&&(this._canvas.height=this._heat._height=i.y),this._redraw()},_redraw:function(){var t,i,a,s,e,n,h,o,r,d=[],_=this._heat._r,l=this._map.getSize(),m=new L.Bounds(L.point([-_,-_]),l.add([_,_])),c=void 0===this.options.max?1:this.options.max,u=void 0===this.options.maxZoom?this._map.getMaxZoom():this.options.maxZoom,f=1/Math.pow(2,Math.max(0,Math.min(u-this._map.getZoom(),12))),g=_/2,p=[],v=this._map._getMapPanePos(),w=v.x%g,y=v.y%g;for(t=0,i=this._latlngs.length;i>t;t++)if(a=this._map.latLngToContainerPoint(this._latlngs[t]),m.contains(a)){e=Math.floor((a.x-w)/g)+2,n=Math.floor((a.y-y)/g)+2;var x=void 0!==this._latlngs[t].alt?this._latlngs[t].alt:void 0!==this._latlngs[t][2]?+this._latlngs[t][2]:1;r=x*f,p[n]=p[n]||[],s=p[n][e],s?(s[0]=(s[0]*s[2]+a.x*r)/(s[2]+r),s[1]=(s[1]*s[2]+a.y*r)/(s[2]+r),s[2]+=r):p[n][e]=[a.x,a.y,r]}for(t=0,i=p.length;i>t;t++)if(p[t])for(h=0,o=p[t].length;o>h;h++)s=p[t][h],s&&d.push([Math.round(s[0]),Math.round(s[1]),Math.min(s[2],c)]);this._heat.data(d).draw(this.options.minOpacity),this._frame=null},_animateZoom:function(t){var i=this._map.getZoomScale(t.zoom),a=this._map._getCenterOffset(t.center)._multiplyBy(-i).subtract(this._map._getMapPanePos());L.DomUtil.setTransform?L.DomUtil.setTransform(this._canvas,a,i):this._canvas.style[L.DomUtil.TRANSFORM]=L.DomUtil.getTranslateString(a)+" scale("+i+")"}}),L.heatLayer=function(t,i){return new L.HeatLayer(t,i)}; \ No newline at end of file diff --git a/js/leaflet-measure.js b/js/leaflet-measure.js new file mode 100644 index 0000000..e3854c3 --- /dev/null +++ b/js/leaflet-measure.js @@ -0,0 +1,7648 @@ +(function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y *100, z * 100]; +} + +function rgb2lab(rgb) { + var xyz = rgb2xyz(rgb), + x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function rgb2lch(args) { + return lab2lch(rgb2lab(args)); +} + +function hsl2rgb(hsl) { + var h = hsl[0] / 360, + s = hsl[1] / 100, + l = hsl[2] / 100, + t1, t2, t3, rgb, val; + + if (s == 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) + t2 = l * (1 + s); + else + t2 = l + s - l * s; + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * - (i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + + if (6 * t3 < 1) + val = t1 + (t2 - t1) * 6 * t3; + else if (2 * t3 < 1) + val = t2; + else if (3 * t3 < 2) + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + else + val = t1; + + rgb[i] = val * 255; + } + + return rgb; +} + +function hsl2hsv(hsl) { + var h = hsl[0], + s = hsl[1] / 100, + l = hsl[2] / 100, + sv, v; + + if(l === 0) { + // no need to do calc on black + // also avoids divide by 0 error + return [0, 0, 0]; + } + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + v = (l + s) / 2; + sv = (2 * s) / (l + s); + return [h, sv * 100, v * 100]; +} + +function hsl2hwb(args) { + return rgb2hwb(hsl2rgb(args)); +} + +function hsl2cmyk(args) { + return rgb2cmyk(hsl2rgb(args)); +} + +function hsl2keyword(args) { + return rgb2keyword(hsl2rgb(args)); +} + + +function hsv2rgb(hsv) { + var h = hsv[0] / 60, + s = hsv[1] / 100, + v = hsv[2] / 100, + hi = Math.floor(h) % 6; + + var f = h - Math.floor(h), + p = 255 * v * (1 - s), + q = 255 * v * (1 - (s * f)), + t = 255 * v * (1 - (s * (1 - f))), + v = 255 * v; + + switch(hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } +} + +function hsv2hsl(hsv) { + var h = hsv[0], + s = hsv[1] / 100, + v = hsv[2] / 100, + sl, l; + + l = (2 - s) * v; + sl = s * v; + sl /= (l <= 1) ? l : 2 - l; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; +} + +function hsv2hwb(args) { + return rgb2hwb(hsv2rgb(args)) +} + +function hsv2cmyk(args) { + return rgb2cmyk(hsv2rgb(args)); +} + +function hsv2keyword(args) { + return rgb2keyword(hsv2rgb(args)); +} + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb +function hwb2rgb(hwb) { + var h = hwb[0] / 360, + wh = hwb[1] / 100, + bl = hwb[2] / 100, + ratio = wh + bl, + i, v, f, n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + if ((i & 0x01) != 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation + + switch (i) { + default: + case 6: + case 0: r = v; g = n; b = wh; break; + case 1: r = n; g = v; b = wh; break; + case 2: r = wh; g = v; b = n; break; + case 3: r = wh; g = n; b = v; break; + case 4: r = n; g = wh; b = v; break; + case 5: r = v; g = wh; b = n; break; + } + + return [r * 255, g * 255, b * 255]; +} + +function hwb2hsl(args) { + return rgb2hsl(hwb2rgb(args)); +} + +function hwb2hsv(args) { + return rgb2hsv(hwb2rgb(args)); +} + +function hwb2cmyk(args) { + return rgb2cmyk(hwb2rgb(args)); +} + +function hwb2keyword(args) { + return rgb2keyword(hwb2rgb(args)); +} + +function cmyk2rgb(cmyk) { + var c = cmyk[0] / 100, + m = cmyk[1] / 100, + y = cmyk[2] / 100, + k = cmyk[3] / 100, + r, g, b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; +} + +function cmyk2hsl(args) { + return rgb2hsl(cmyk2rgb(args)); +} + +function cmyk2hsv(args) { + return rgb2hsv(cmyk2rgb(args)); +} + +function cmyk2hwb(args) { + return rgb2hwb(cmyk2rgb(args)); +} + +function cmyk2keyword(args) { + return rgb2keyword(cmyk2rgb(args)); +} + + +function xyz2rgb(xyz) { + var x = xyz[0] / 100, + y = xyz[1] / 100, + z = xyz[2] / 100, + r, g, b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r = (r * 12.92); + + g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g = (g * 12.92); + + b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b = (b * 12.92); + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; +} + +function xyz2lab(xyz) { + var x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1/3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1/3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1/3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; +} + +function xyz2lch(args) { + return lab2lch(xyz2lab(args)); +} + +function lab2xyz(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + x, y, z, y2; + + if (l <= 8) { + y = (l * 100) / 903.3; + y2 = (7.787 * (y / 100)) + (16 / 116); + } else { + y = 100 * Math.pow((l + 16) / 116, 3); + y2 = Math.pow(y / 100, 1/3); + } + + x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); + + z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); + + return [x, y, z]; +} + +function lab2lch(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + hr, h, c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + c = Math.sqrt(a * a + b * b); + return [l, c, h]; +} + +function lab2rgb(args) { + return xyz2rgb(lab2xyz(args)); +} + +function lch2lab(lch) { + var l = lch[0], + c = lch[1], + h = lch[2], + a, b, hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + return [l, a, b]; +} + +function lch2xyz(args) { + return lab2xyz(lch2lab(args)); +} + +function lch2rgb(args) { + return lab2rgb(lch2lab(args)); +} + +function keyword2rgb(keyword) { + return cssKeywords[keyword]; +} + +function keyword2hsl(args) { + return rgb2hsl(keyword2rgb(args)); +} + +function keyword2hsv(args) { + return rgb2hsv(keyword2rgb(args)); +} + +function keyword2hwb(args) { + return rgb2hwb(keyword2rgb(args)); +} + +function keyword2cmyk(args) { + return rgb2cmyk(keyword2rgb(args)); +} + +function keyword2lab(args) { + return rgb2lab(keyword2rgb(args)); +} + +function keyword2xyz(args) { + return rgb2xyz(keyword2rgb(args)); +} + +var cssKeywords = { + aliceblue: [240,248,255], + antiquewhite: [250,235,215], + aqua: [0,255,255], + aquamarine: [127,255,212], + azure: [240,255,255], + beige: [245,245,220], + bisque: [255,228,196], + black: [0,0,0], + blanchedalmond: [255,235,205], + blue: [0,0,255], + blueviolet: [138,43,226], + brown: [165,42,42], + burlywood: [222,184,135], + cadetblue: [95,158,160], + chartreuse: [127,255,0], + chocolate: [210,105,30], + coral: [255,127,80], + cornflowerblue: [100,149,237], + cornsilk: [255,248,220], + crimson: [220,20,60], + cyan: [0,255,255], + darkblue: [0,0,139], + darkcyan: [0,139,139], + darkgoldenrod: [184,134,11], + darkgray: [169,169,169], + darkgreen: [0,100,0], + darkgrey: [169,169,169], + darkkhaki: [189,183,107], + darkmagenta: [139,0,139], + darkolivegreen: [85,107,47], + darkorange: [255,140,0], + darkorchid: [153,50,204], + darkred: [139,0,0], + darksalmon: [233,150,122], + darkseagreen: [143,188,143], + darkslateblue: [72,61,139], + darkslategray: [47,79,79], + darkslategrey: [47,79,79], + darkturquoise: [0,206,209], + darkviolet: [148,0,211], + deeppink: [255,20,147], + deepskyblue: [0,191,255], + dimgray: [105,105,105], + dimgrey: [105,105,105], + dodgerblue: [30,144,255], + firebrick: [178,34,34], + floralwhite: [255,250,240], + forestgreen: [34,139,34], + fuchsia: [255,0,255], + gainsboro: [220,220,220], + ghostwhite: [248,248,255], + gold: [255,215,0], + goldenrod: [218,165,32], + gray: [128,128,128], + green: [0,128,0], + greenyellow: [173,255,47], + grey: [128,128,128], + honeydew: [240,255,240], + hotpink: [255,105,180], + indianred: [205,92,92], + indigo: [75,0,130], + ivory: [255,255,240], + khaki: [240,230,140], + lavender: [230,230,250], + lavenderblush: [255,240,245], + lawngreen: [124,252,0], + lemonchiffon: [255,250,205], + lightblue: [173,216,230], + lightcoral: [240,128,128], + lightcyan: [224,255,255], + lightgoldenrodyellow: [250,250,210], + lightgray: [211,211,211], + lightgreen: [144,238,144], + lightgrey: [211,211,211], + lightpink: [255,182,193], + lightsalmon: [255,160,122], + lightseagreen: [32,178,170], + lightskyblue: [135,206,250], + lightslategray: [119,136,153], + lightslategrey: [119,136,153], + lightsteelblue: [176,196,222], + lightyellow: [255,255,224], + lime: [0,255,0], + limegreen: [50,205,50], + linen: [250,240,230], + magenta: [255,0,255], + maroon: [128,0,0], + mediumaquamarine: [102,205,170], + mediumblue: [0,0,205], + mediumorchid: [186,85,211], + mediumpurple: [147,112,219], + mediumseagreen: [60,179,113], + mediumslateblue: [123,104,238], + mediumspringgreen: [0,250,154], + mediumturquoise: [72,209,204], + mediumvioletred: [199,21,133], + midnightblue: [25,25,112], + mintcream: [245,255,250], + mistyrose: [255,228,225], + moccasin: [255,228,181], + navajowhite: [255,222,173], + navy: [0,0,128], + oldlace: [253,245,230], + olive: [128,128,0], + olivedrab: [107,142,35], + orange: [255,165,0], + orangered: [255,69,0], + orchid: [218,112,214], + palegoldenrod: [238,232,170], + palegreen: [152,251,152], + paleturquoise: [175,238,238], + palevioletred: [219,112,147], + papayawhip: [255,239,213], + peachpuff: [255,218,185], + peru: [205,133,63], + pink: [255,192,203], + plum: [221,160,221], + powderblue: [176,224,230], + purple: [128,0,128], + rebeccapurple: [102, 51, 153], + red: [255,0,0], + rosybrown: [188,143,143], + royalblue: [65,105,225], + saddlebrown: [139,69,19], + salmon: [250,128,114], + sandybrown: [244,164,96], + seagreen: [46,139,87], + seashell: [255,245,238], + sienna: [160,82,45], + silver: [192,192,192], + skyblue: [135,206,235], + slateblue: [106,90,205], + slategray: [112,128,144], + slategrey: [112,128,144], + snow: [255,250,250], + springgreen: [0,255,127], + steelblue: [70,130,180], + tan: [210,180,140], + teal: [0,128,128], + thistle: [216,191,216], + tomato: [255,99,71], + turquoise: [64,224,208], + violet: [238,130,238], + wheat: [245,222,179], + white: [255,255,255], + whitesmoke: [245,245,245], + yellow: [255,255,0], + yellowgreen: [154,205,50] +}; + +var reverseKeywords = {}; +for (var key in cssKeywords) { + reverseKeywords[JSON.stringify(cssKeywords[key])] = key; +} + +},{}],3:[function(require,module,exports){ +var conversions = require("./conversions"); + +var convert = function() { + return new Converter(); +} + +for (var func in conversions) { + // export Raw versions + convert[func + "Raw"] = (function(func) { + // accept array or plain args + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + return conversions[func](arg); + } + })(func); + + var pair = /(\w+)2(\w+)/.exec(func), + from = pair[1], + to = pair[2]; + + // export rgb2hsl and ["rgb"]["hsl"] + convert[from] = convert[from] || {}; + + convert[from][to] = convert[func] = (function(func) { + return function(arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + + var val = conversions[func](arg); + if (typeof val == "string" || val === undefined) + return val; // keyword + + for (var i = 0; i < val.length; i++) + val[i] = Math.round(val[i]); + return val; + } + })(func); +} + + +/* Converter does lazy conversion and caching */ +var Converter = function() { + this.convs = {}; +}; + +/* Either get the values for a space or + set the values for a space, depending on args */ +Converter.prototype.routeSpace = function(space, args) { + var values = args[0]; + if (values === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof values == "number") { + values = Array.prototype.slice.call(args); + } + + return this.setValues(space, values); +}; + +/* Set the values for a space, invalidating cache */ +Converter.prototype.setValues = function(space, values) { + this.space = space; + this.convs = {}; + this.convs[space] = values; + return this; +}; + +/* Get the values for a space. If there's already + a conversion for the space, fetch it, otherwise + compute it */ +Converter.prototype.getValues = function(space) { + var vals = this.convs[space]; + if (!vals) { + var fspace = this.space, + from = this.convs[fspace]; + vals = convert[fspace][space](from); + + this.convs[space] = vals; + } + return vals; +}; + +["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function(space) { + Converter.prototype[space] = function(vals) { + return this.routeSpace(space, arguments); + } +}); + +module.exports = convert; +},{"./conversions":2}],4:[function(require,module,exports){ +module.exports = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] +}; +},{}],5:[function(require,module,exports){ +/* MIT license */ +var colorNames = require('color-name'); + +module.exports = { + getRgba: getRgba, + getHsla: getHsla, + getRgb: getRgb, + getHsl: getHsl, + getHwb: getHwb, + getAlpha: getAlpha, + + hexString: hexString, + rgbString: rgbString, + rgbaString: rgbaString, + percentString: percentString, + percentaString: percentaString, + hslString: hslString, + hslaString: hslaString, + hwbString: hwbString, + keyword: keyword +} + +function getRgba(string) { + if (!string) { + return; + } + var abbr = /^#([a-fA-F0-9]{3})$/, + hex = /^#([a-fA-F0-9]{6})$/, + rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/, + per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/, + keyword = /(\D+)/; + + var rgb = [0, 0, 0], + a = 1, + match = string.match(abbr); + if (match) { + match = match[1]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i] + match[i], 16); + } + } + else if (match = string.match(hex)) { + match = match[1]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); + } + } + else if (match = string.match(rgba)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i + 1]); + } + a = parseFloat(match[4]); + } + else if (match = string.match(per)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); + } + a = parseFloat(match[4]); + } + else if (match = string.match(keyword)) { + if (match[1] == "transparent") { + return [0, 0, 0, 0]; + } + rgb = colorNames[match[1]]; + if (!rgb) { + return; + } + } + + for (var i = 0; i < rgb.length; i++) { + rgb[i] = scale(rgb[i], 0, 255); + } + if (!a && a != 0) { + a = 1; + } + else { + a = scale(a, 0, 1); + } + rgb[3] = a; + return rgb; +} + +function getHsla(string) { + if (!string) { + return; + } + var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hsl); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + s = scale(parseFloat(match[2]), 0, 100), + l = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, s, l, a]; + } +} + +function getHwb(string) { + if (!string) { + return; + } + var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hwb); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + w = scale(parseFloat(match[2]), 0, 100), + b = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, w, b, a]; + } +} + +function getRgb(string) { + var rgba = getRgba(string); + return rgba && rgba.slice(0, 3); +} + +function getHsl(string) { + var hsla = getHsla(string); + return hsla && hsla.slice(0, 3); +} + +function getAlpha(string) { + var vals = getRgba(string); + if (vals) { + return vals[3]; + } + else if (vals = getHsla(string)) { + return vals[3]; + } + else if (vals = getHwb(string)) { + return vals[3]; + } +} + +// generators +function hexString(rgb) { + return "#" + hexDouble(rgb[0]) + hexDouble(rgb[1]) + + hexDouble(rgb[2]); +} + +function rgbString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return rgbaString(rgba, alpha); + } + return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; +} + +function rgbaString(rgba, alpha) { + if (alpha === undefined) { + alpha = (rgba[3] !== undefined ? rgba[3] : 1); + } + return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + + ", " + alpha + ")"; +} + +function percentString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return percentaString(rgba, alpha); + } + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + + return "rgb(" + r + "%, " + g + "%, " + b + "%)"; +} + +function percentaString(rgba, alpha) { + var r = Math.round(rgba[0]/255 * 100), + g = Math.round(rgba[1]/255 * 100), + b = Math.round(rgba[2]/255 * 100); + return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; +} + +function hslString(hsla, alpha) { + if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { + return hslaString(hsla, alpha); + } + return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; +} + +function hslaString(hsla, alpha) { + if (alpha === undefined) { + alpha = (hsla[3] !== undefined ? hsla[3] : 1); + } + return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + + alpha + ")"; +} + +// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax +// (hwb have alpha optional & 1 is default value) +function hwbString(hwb, alpha) { + if (alpha === undefined) { + alpha = (hwb[3] !== undefined ? hwb[3] : 1); + } + return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; +} + +function keyword(rgb) { + return reverseNames[rgb.slice(0, 3)]; +} + +// helpers +function scale(num, min, max) { + return Math.min(Math.max(min, num), max); +} + +function hexDouble(num) { + var str = num.toString(16).toUpperCase(); + return (str.length < 2) ? "0" + str : str; +} + + +//create a list of reverse color names +var reverseNames = {}; +for (var name in colorNames) { + reverseNames[colorNames[name]] = name; +} + +},{"color-name":4}],6:[function(require,module,exports){ +/* MIT license */ +var convert = require("color-convert"), + string = require("color-string"); + +var Color = function(obj) { + if (obj instanceof Color) return obj; + if (! (this instanceof Color)) return new Color(obj); + + this.values = { + rgb: [0, 0, 0], + hsl: [0, 0, 0], + hsv: [0, 0, 0], + hwb: [0, 0, 0], + cmyk: [0, 0, 0, 0], + alpha: 1 + } + + // parse Color() argument + if (typeof obj == "string") { + var vals = string.getRgba(obj); + if (vals) { + this.setValues("rgb", vals); + } + else if(vals = string.getHsla(obj)) { + this.setValues("hsl", vals); + } + else if(vals = string.getHwb(obj)) { + this.setValues("hwb", vals); + } + else { + throw new Error("Unable to parse color from string \"" + obj + "\""); + } + } + else if (typeof obj == "object") { + var vals = obj; + if(vals["r"] !== undefined || vals["red"] !== undefined) { + this.setValues("rgb", vals) + } + else if(vals["l"] !== undefined || vals["lightness"] !== undefined) { + this.setValues("hsl", vals) + } + else if(vals["v"] !== undefined || vals["value"] !== undefined) { + this.setValues("hsv", vals) + } + else if(vals["w"] !== undefined || vals["whiteness"] !== undefined) { + this.setValues("hwb", vals) + } + else if(vals["c"] !== undefined || vals["cyan"] !== undefined) { + this.setValues("cmyk", vals) + } + else { + throw new Error("Unable to parse color from object " + JSON.stringify(obj)); + } + } +} + +Color.prototype = { + rgb: function (vals) { + return this.setSpace("rgb", arguments); + }, + hsl: function(vals) { + return this.setSpace("hsl", arguments); + }, + hsv: function(vals) { + return this.setSpace("hsv", arguments); + }, + hwb: function(vals) { + return this.setSpace("hwb", arguments); + }, + cmyk: function(vals) { + return this.setSpace("cmyk", arguments); + }, + + rgbArray: function() { + return this.values.rgb; + }, + hslArray: function() { + return this.values.hsl; + }, + hsvArray: function() { + return this.values.hsv; + }, + hwbArray: function() { + if (this.values.alpha !== 1) { + return this.values.hwb.concat([this.values.alpha]) + } + return this.values.hwb; + }, + cmykArray: function() { + return this.values.cmyk; + }, + rgbaArray: function() { + var rgb = this.values.rgb; + return rgb.concat([this.values.alpha]); + }, + hslaArray: function() { + var hsl = this.values.hsl; + return hsl.concat([this.values.alpha]); + }, + alpha: function(val) { + if (val === undefined) { + return this.values.alpha; + } + this.setValues("alpha", val); + return this; + }, + + red: function(val) { + return this.setChannel("rgb", 0, val); + }, + green: function(val) { + return this.setChannel("rgb", 1, val); + }, + blue: function(val) { + return this.setChannel("rgb", 2, val); + }, + hue: function(val) { + return this.setChannel("hsl", 0, val); + }, + saturation: function(val) { + return this.setChannel("hsl", 1, val); + }, + lightness: function(val) { + return this.setChannel("hsl", 2, val); + }, + saturationv: function(val) { + return this.setChannel("hsv", 1, val); + }, + whiteness: function(val) { + return this.setChannel("hwb", 1, val); + }, + blackness: function(val) { + return this.setChannel("hwb", 2, val); + }, + value: function(val) { + return this.setChannel("hsv", 2, val); + }, + cyan: function(val) { + return this.setChannel("cmyk", 0, val); + }, + magenta: function(val) { + return this.setChannel("cmyk", 1, val); + }, + yellow: function(val) { + return this.setChannel("cmyk", 2, val); + }, + black: function(val) { + return this.setChannel("cmyk", 3, val); + }, + + hexString: function() { + return string.hexString(this.values.rgb); + }, + rgbString: function() { + return string.rgbString(this.values.rgb, this.values.alpha); + }, + rgbaString: function() { + return string.rgbaString(this.values.rgb, this.values.alpha); + }, + percentString: function() { + return string.percentString(this.values.rgb, this.values.alpha); + }, + hslString: function() { + return string.hslString(this.values.hsl, this.values.alpha); + }, + hslaString: function() { + return string.hslaString(this.values.hsl, this.values.alpha); + }, + hwbString: function() { + return string.hwbString(this.values.hwb, this.values.alpha); + }, + keyword: function() { + return string.keyword(this.values.rgb, this.values.alpha); + }, + + rgbNumber: function() { + return (this.values.rgb[0] << 16) | (this.values.rgb[1] << 8) | this.values.rgb[2]; + }, + + luminosity: function() { + // http://www.w3.org/TR/WCAG20/#relativeluminancedef + var rgb = this.values.rgb; + var lum = []; + for (var i = 0; i < rgb.length; i++) { + var chan = rgb[i] / 255; + lum[i] = (chan <= 0.03928) ? chan / 12.92 + : Math.pow(((chan + 0.055) / 1.055), 2.4) + } + return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; + }, + + contrast: function(color2) { + // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + var lum1 = this.luminosity(); + var lum2 = color2.luminosity(); + if (lum1 > lum2) { + return (lum1 + 0.05) / (lum2 + 0.05) + }; + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function(color2) { + var contrastRatio = this.contrast(color2); + return (contrastRatio >= 7.1) + ? 'AAA' + : (contrastRatio >= 4.5) + ? 'AA' + : ''; + }, + + dark: function() { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb, + yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function() { + return !this.dark(); + }, + + negate: function() { + var rgb = [] + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues("rgb", rgb); + return this; + }, + + lighten: function(ratio) { + this.values.hsl[2] += this.values.hsl[2] * ratio; + this.setValues("hsl", this.values.hsl); + return this; + }, + + darken: function(ratio) { + this.values.hsl[2] -= this.values.hsl[2] * ratio; + this.setValues("hsl", this.values.hsl); + return this; + }, + + saturate: function(ratio) { + this.values.hsl[1] += this.values.hsl[1] * ratio; + this.setValues("hsl", this.values.hsl); + return this; + }, + + desaturate: function(ratio) { + this.values.hsl[1] -= this.values.hsl[1] * ratio; + this.setValues("hsl", this.values.hsl); + return this; + }, + + whiten: function(ratio) { + this.values.hwb[1] += this.values.hwb[1] * ratio; + this.setValues("hwb", this.values.hwb); + return this; + }, + + blacken: function(ratio) { + this.values.hwb[2] += this.values.hwb[2] * ratio; + this.setValues("hwb", this.values.hwb); + return this; + }, + + greyscale: function() { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues("rgb", [val, val, val]); + return this; + }, + + clearer: function(ratio) { + this.setValues("alpha", this.values.alpha - (this.values.alpha * ratio)); + return this; + }, + + opaquer: function(ratio) { + this.setValues("alpha", this.values.alpha + (this.values.alpha * ratio)); + return this; + }, + + rotate: function(degrees) { + var hue = this.values.hsl[0]; + hue = (hue + degrees) % 360; + hue = hue < 0 ? 360 + hue : hue; + this.values.hsl[0] = hue; + this.setValues("hsl", this.values.hsl); + return this; + }, + + mix: function(color2, weight) { + weight = 1 - (weight == null ? 0.5 : weight); + + // algorithm from Sass's mix(). Ratio of first color in mix is + // determined by the alphas of both colors and the weight + var t1 = weight * 2 - 1, + d = this.alpha() - color2.alpha(); + + var weight1 = (((t1 * d == -1) ? t1 : (t1 + d) / (1 + t1 * d)) + 1) / 2; + var weight2 = 1 - weight1; + + var rgb = this.rgbArray(); + var rgb2 = color2.rgbArray(); + + for (var i = 0; i < rgb.length; i++) { + rgb[i] = rgb[i] * weight1 + rgb2[i] * weight2; + } + this.setValues("rgb", rgb); + + var alpha = this.alpha() * weight + color2.alpha() * (1 - weight); + this.setValues("alpha", alpha); + + return this; + }, + + toJSON: function() { + return this.rgb(); + }, + + clone: function() { + return new Color(this.rgb()); + } +} + + +Color.prototype.getValues = function(space) { + var vals = {}; + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = this.values[space][i]; + } + if (this.values.alpha != 1) { + vals["a"] = this.values.alpha; + } + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; +} + +Color.prototype.setValues = function(space, vals) { + var spaces = { + "rgb": ["red", "green", "blue"], + "hsl": ["hue", "saturation", "lightness"], + "hsv": ["hue", "saturation", "value"], + "hwb": ["hue", "whiteness", "blackness"], + "cmyk": ["cyan", "magenta", "yellow", "black"] + }; + + var maxes = { + "rgb": [255, 255, 255], + "hsl": [360, 100, 100], + "hsv": [360, 100, 100], + "hwb": [360, 100, 100], + "cmyk": [100, 100, 100, 100] + }; + + var alpha = 1; + if (space == "alpha") { + alpha = vals; + } + else if (vals.length) { + // [10, 10, 10] + this.values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } + else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (var i = 0; i < space.length; i++) { + this.values[space][i] = vals[space.charAt(i)]; + } + alpha = vals.a; + } + else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + for (var i = 0; i < space.length; i++) { + this.values[space][i] = vals[chans[i]]; + } + alpha = vals.alpha; + } + this.values.alpha = Math.max(0, Math.min(1, (alpha !== undefined ? alpha : this.values.alpha) )); + if (space == "alpha") { + return; + } + + // cap values of the space prior converting all values + for (var i = 0; i < space.length; i++) { + var capped = Math.max(0, Math.min(maxes[space][i], this.values[space][i])); + this.values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname != space) { + this.values[sname] = convert[space][sname](this.values[space]) + } + + // cap values + for (var i = 0; i < sname.length; i++) { + var capped = Math.max(0, Math.min(maxes[sname][i], this.values[sname][i])); + this.values[sname][i] = Math.round(capped); + } + } + return true; +} + +Color.prototype.setSpace = function(space, args) { + var vals = args[0]; + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof vals == "number") { + vals = Array.prototype.slice.call(args); + } + this.setValues(space, vals); + return this; +} + +Color.prototype.setChannel = function(space, index, val) { + if (val === undefined) { + // color.red() + return this.values[space][index]; + } + // color.red(100) + this.values[space][index] = val; + this.setValues(space, this.values[space]); + return this; +} + +module.exports = Color; + +},{"color-convert":3,"color-string":5}],7:[function(require,module,exports){ +module.exports = require('./lib/geocrunch'); +},{"./lib/geocrunch":12}],8:[function(require,module,exports){ +// distance.js - Distance mixins for Paths + +var _ = require('underscore'); + +var R = require('./constants').EARTHRADIUS; +var units = require('./units'); +var flipCoords = require('./flipcoords'); + +// Area conversions (from sqmeters) +var convertFuncs = { + sqmeters: function (a) { + return a; + }, + sqmiles: function (a) { + return units.sqMeters.toSqMiles(a); + }, + acres: function (a) { + return units.sqMeters.toAcres(a); + } +}; + +// Calculates area in square meters +// Method taken from OpenLayers API, https://github.com/openlayers/openlayers/blob/master/lib/OpenLayers/Geometry/LinearRing.js#L270 +var calcArea = function (coordArray) { + var area = 0, i, l, c1, c2; + for (i = 0, l = coordArray.length; i < l; i += 1) { + c1 = coordArray[i]; + c2 = coordArray[(i + 1) % coordArray.length]; // Access next item in array until last item is i, then accesses first (0) + area = area + units.degrees.toRadians(c2[0] - c1[0]) * (2 + Math.sin(units.degrees.toRadians(c1[1])) + Math.sin(units.degrees.toRadians(c2[1]))); + } + return Math.abs(area * R * R / 2); +}; + +var calcCenter = function (coordArray) { + var offset = coordArray[0], twiceArea = 0, x = 0, y = 0, i, l, c1, c2, f; + if (coordArray.length === 1) { + return coordArray[0]; + } + for (i = 0, l = coordArray.length; i < l; i += 1) { + c1 = coordArray[i]; + c2 = coordArray[(i + 1) % coordArray.length]; // Access next item in array until last item is i, then accesses first (0) + f = (c1[1] - offset[1]) * (c2[0] - offset[0]) - (c2[1] - offset[1]) * (c1[0] - offset[0]); + twiceArea = twiceArea + f; + x = x + ((c1[0] + c2[0] - 2 * offset[0]) * f); + y = y + ((c1[1] + c2[1] - 2 * offset[1]) * f); + } + f = twiceArea * 3; + return [x / f + offset[0], y / f + offset[1]]; +}; + +module.exports = { + _internalAreaCalc: function () { + // If not set, set this._calcedArea to total area in UNITS + // Checks for cache to prevent additional unnecessary calcs + if (!this._calcedArea) { + if (this._coords.length < 3) { + this._calcedArea = 0; + } else { + this._calcedArea = calcArea(this._coords); + } + } + }, + _internalCenterCalc: function () { + if (!this._calcedCenter && this._coords.length) { + this._calcedCenter = calcCenter(this._coords); + } + }, + area: function (options) { + var opts = _.extend({ + units: 'sqmeters' + }, options); + this._internalAreaCalc(); + if (_.isFunction(convertFuncs[opts.units])) { + return convertFuncs[opts.units](this._calcedArea); + } + // TODO. Handle non-matching units + }, + center: function () { + this._internalCenterCalc(); + return this._options.imBackwards === true ? flipCoords(this._calcedCenter) : this._calcedCenter; + } +}; +},{"./constants":9,"./flipcoords":11,"./units":14,"underscore":15}],9:[function(require,module,exports){ +// utils/constants.js + +module.exports = { + EARTHRADIUS: 6371000 // R in meters +}; +},{}],10:[function(require,module,exports){ +// distance.js - Distance mixins for Paths + +var _ = require('underscore'); + +var R = require('./constants').EARTHRADIUS; +var units = require('./units'); + +// Distance conversions (from meters) +var convertFuncs = { + meters: function (d) { + return d; + }, + kilometers: function (d) { + return units.meters.toKilometers(d); + }, + feet: function (d) { + return units.meters.toFeet(d); + }, + miles: function (d) { + return units.meters.toMiles(d); + } +}; + +// Distance in meters +// Always positive regardless of direction +// Calculation based on Haversine Formula http://en.wikipedia.org/wiki/Haversine_formula +// Another method is @ http://www.movable-type.co.uk/scripts/latlong-vincenty.html but seems way overcomplicated +var calcDistance = function (coord1, coord2) { + var deltaLng = units.degrees.toRadians(coord1[0] - coord2[0]), + deltaLat = units.degrees.toRadians(coord1[1] - coord2[1]), + lat1 = units.degrees.toRadians(coord1[1]), + lat2 = units.degrees.toRadians(coord2[1]), + hvsLng = Math.sin(deltaLng / 2), + hvsLat = Math.sin(deltaLat / 2); + + var a = hvsLat * hvsLat + hvsLng * hvsLng * Math.cos(lat1) * Math.cos(lat2); + return R * 2 * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a)); +}; + +module.exports = { + _internalDistanceCalc: function () { + // If not set, set this._calcedDistance to total distance in meters + // Checks for cache to prevent additional unnecessary calcs + var distance = 0, i, l; + if (!this._calcedDistance) { + for (i = 0, l = this._coords.length; i < l; i += 1) { + if (i > 0) { + distance = distance + calcDistance(this._coords[i - 1], this._coords[i]); + } + } + this._calcedDistance = distance; + } + }, + distance: function (options) { + var opts = _.extend({ + units: 'meters' + }, options); + this._internalDistanceCalc(); + if (_.isFunction(convertFuncs[opts.units])) { + return convertFuncs[opts.units](this._calcedDistance); + } + // TODO. Handle non-matching units + } +}; +},{"./constants":9,"./units":14,"underscore":15}],11:[function(require,module,exports){ +// utils/flipcoords.js - Util functions for working with backwards coordinates [lat, lng] + +var _ = require('underscore'); + +module.exports = function (backwardsCoordArray) { + return _.map(backwardsCoordArray, function (backwardsCoord) { + return [backwardsCoord[1], backwardsCoord[0]]; + }); +}; +},{"underscore":15}],12:[function(require,module,exports){ +// geocrunch.js + +var _ = require('underscore'); + +var Path = require('./path'); +var distanceMixins = require('./distance'), + areaMixins = require('./area'); + +_.extend(Path.prototype, distanceMixins, areaMixins); + +exports.path = function (coords, options) { + return new Path(coords, options); +}; +},{"./area":8,"./distance":10,"./path":13,"underscore":15}],13:[function(require,module,exports){ +// path.js - Object for working with a linear path of coordinates + +var flipCoords = require('./flipcoords'); + +var Path = function (coords, options) { + this._options = options || {}; + + // Set this._coords... Think about flipping at time of calcs for less iterations/better perf. May risk code clarity and mixin ease. + coords = coords || []; + this._coords = this._options.imBackwards === true ? flipCoords(coords) : coords; +}; + +module.exports = Path; + +},{"./flipcoords":11}],14:[function(require,module,exports){ +// units.js - Standard unit conversions + +exports.meters = { + toFeet: function (m) { + return m * 3.28084; + }, + toKilometers: function (m) { + return m * 0.001; + }, + toMiles: function (m) { + return m * 0.000621371; + } +}; + +exports.sqMeters = { + toSqMiles: function (m) { + return m * 0.000000386102; + }, + toAcres: function (m) { + return m * 0.000247105; + } +}; + +exports.degrees = { + toRadians: function (d) { + return d * Math.PI / 180; + } +}; +},{}],15:[function(require,module,exports){ +// Underscore.js 1.5.2 +// http://underscorejs.org +// (c) 2009-2013 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `exports` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Establish the object that gets returned to break out of a loop iteration. + var breaker = {}; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var + push = ArrayProto.push, + slice = ArrayProto.slice, + concat = ArrayProto.concat, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeForEach = ArrayProto.forEach, + nativeMap = ArrayProto.map, + nativeReduce = ArrayProto.reduce, + nativeReduceRight = ArrayProto.reduceRight, + nativeFilter = ArrayProto.filter, + nativeEvery = ArrayProto.every, + nativeSome = ArrayProto.some, + nativeIndexOf = ArrayProto.indexOf, + nativeLastIndexOf = ArrayProto.lastIndexOf, + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object via a string identifier, + // for Closure Compiler "advanced" mode. + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.5.2'; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles objects with the built-in `forEach`, arrays, and raw objects. + // Delegates to **ECMAScript 5**'s native `forEach` if available. + var each = _.each = _.forEach = function(obj, iterator, context) { + if (obj == null) return; + if (nativeForEach && obj.forEach === nativeForEach) { + obj.forEach(iterator, context); + } else if (obj.length === +obj.length) { + for (var i = 0, length = obj.length; i < length; i++) { + if (iterator.call(context, obj[i], i, obj) === breaker) return; + } + } else { + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + if (iterator.call(context, obj[keys[i]], keys[i], obj) === breaker) return; + } + } + }; + + // Return the results of applying the iterator to each element. + // Delegates to **ECMAScript 5**'s native `map` if available. + _.map = _.collect = function(obj, iterator, context) { + var results = []; + if (obj == null) return results; + if (nativeMap && obj.map === nativeMap) return obj.map(iterator, context); + each(obj, function(value, index, list) { + results.push(iterator.call(context, value, index, list)); + }); + return results; + }; + + var reduceError = 'Reduce of empty array with no initial value'; + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. Delegates to **ECMAScript 5**'s native `reduce` if available. + _.reduce = _.foldl = _.inject = function(obj, iterator, memo, context) { + var initial = arguments.length > 2; + if (obj == null) obj = []; + if (nativeReduce && obj.reduce === nativeReduce) { + if (context) iterator = _.bind(iterator, context); + return initial ? obj.reduce(iterator, memo) : obj.reduce(iterator); + } + each(obj, function(value, index, list) { + if (!initial) { + memo = value; + initial = true; + } else { + memo = iterator.call(context, memo, value, index, list); + } + }); + if (!initial) throw new TypeError(reduceError); + return memo; + }; + + // The right-associative version of reduce, also known as `foldr`. + // Delegates to **ECMAScript 5**'s native `reduceRight` if available. + _.reduceRight = _.foldr = function(obj, iterator, memo, context) { + var initial = arguments.length > 2; + if (obj == null) obj = []; + if (nativeReduceRight && obj.reduceRight === nativeReduceRight) { + if (context) iterator = _.bind(iterator, context); + return initial ? obj.reduceRight(iterator, memo) : obj.reduceRight(iterator); + } + var length = obj.length; + if (length !== +length) { + var keys = _.keys(obj); + length = keys.length; + } + each(obj, function(value, index, list) { + index = keys ? keys[--length] : --length; + if (!initial) { + memo = obj[index]; + initial = true; + } else { + memo = iterator.call(context, memo, obj[index], index, list); + } + }); + if (!initial) throw new TypeError(reduceError); + return memo; + }; + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, iterator, context) { + var result; + any(obj, function(value, index, list) { + if (iterator.call(context, value, index, list)) { + result = value; + return true; + } + }); + return result; + }; + + // Return all the elements that pass a truth test. + // Delegates to **ECMAScript 5**'s native `filter` if available. + // Aliased as `select`. + _.filter = _.select = function(obj, iterator, context) { + var results = []; + if (obj == null) return results; + if (nativeFilter && obj.filter === nativeFilter) return obj.filter(iterator, context); + each(obj, function(value, index, list) { + if (iterator.call(context, value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, iterator, context) { + return _.filter(obj, function(value, index, list) { + return !iterator.call(context, value, index, list); + }, context); + }; + + // Determine whether all of the elements match a truth test. + // Delegates to **ECMAScript 5**'s native `every` if available. + // Aliased as `all`. + _.every = _.all = function(obj, iterator, context) { + iterator || (iterator = _.identity); + var result = true; + if (obj == null) return result; + if (nativeEvery && obj.every === nativeEvery) return obj.every(iterator, context); + each(obj, function(value, index, list) { + if (!(result = result && iterator.call(context, value, index, list))) return breaker; + }); + return !!result; + }; + + // Determine if at least one element in the object matches a truth test. + // Delegates to **ECMAScript 5**'s native `some` if available. + // Aliased as `any`. + var any = _.some = _.any = function(obj, iterator, context) { + iterator || (iterator = _.identity); + var result = false; + if (obj == null) return result; + if (nativeSome && obj.some === nativeSome) return obj.some(iterator, context); + each(obj, function(value, index, list) { + if (result || (result = iterator.call(context, value, index, list))) return breaker; + }); + return !!result; + }; + + // Determine if the array or object contains a given value (using `===`). + // Aliased as `include`. + _.contains = _.include = function(obj, target) { + if (obj == null) return false; + if (nativeIndexOf && obj.indexOf === nativeIndexOf) return obj.indexOf(target) != -1; + return any(obj, function(value) { + return value === target; + }); + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + var isFunc = _.isFunction(method); + return _.map(obj, function(value) { + return (isFunc ? method : value[method]).apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, function(value){ return value[key]; }); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs, first) { + if (_.isEmpty(attrs)) return first ? void 0 : []; + return _[first ? 'find' : 'filter'](obj, function(value) { + for (var key in attrs) { + if (attrs[key] !== value[key]) return false; + } + return true; + }); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.where(obj, attrs, true); + }; + + // Return the maximum element or (element-based computation). + // Can't optimize arrays of integers longer than 65,535 elements. + // See [WebKit Bug 80797](https://bugs.webkit.org/show_bug.cgi?id=80797) + _.max = function(obj, iterator, context) { + if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { + return Math.max.apply(Math, obj); + } + if (!iterator && _.isEmpty(obj)) return -Infinity; + var result = {computed : -Infinity, value: -Infinity}; + each(obj, function(value, index, list) { + var computed = iterator ? iterator.call(context, value, index, list) : value; + computed > result.computed && (result = {value : value, computed : computed}); + }); + return result.value; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iterator, context) { + if (!iterator && _.isArray(obj) && obj[0] === +obj[0] && obj.length < 65535) { + return Math.min.apply(Math, obj); + } + if (!iterator && _.isEmpty(obj)) return Infinity; + var result = {computed : Infinity, value: Infinity}; + each(obj, function(value, index, list) { + var computed = iterator ? iterator.call(context, value, index, list) : value; + computed < result.computed && (result = {value : value, computed : computed}); + }); + return result.value; + }; + + // Shuffle an array, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + _.shuffle = function(obj) { + var rand; + var index = 0; + var shuffled = []; + each(obj, function(value) { + rand = _.random(index++); + shuffled[index - 1] = shuffled[rand]; + shuffled[rand] = value; + }); + return shuffled; + }; + + // Sample **n** random values from an array. + // If **n** is not specified, returns a single random element from the array. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (arguments.length < 2 || guard) { + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); + }; + + // An internal function to generate lookup iterators. + var lookupIterator = function(value) { + return _.isFunction(value) ? value : function(obj){ return obj[value]; }; + }; + + // Sort the object's values by a criterion produced by an iterator. + _.sortBy = function(obj, value, context) { + var iterator = lookupIterator(value); + return _.pluck(_.map(obj, function(value, index, list) { + return { + value: value, + index: index, + criteria: iterator.call(context, value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior) { + return function(obj, value, context) { + var result = {}; + var iterator = value == null ? _.identity : lookupIterator(value); + each(obj, function(value, index) { + var key = iterator.call(context, value, index, obj); + behavior(result, key, value); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, key, value) { + (_.has(result, key) ? result[key] : (result[key] = [])).push(value); + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, key, value) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, key) { + _.has(result, key) ? result[key]++ : result[key] = 1; + }); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iterator, context) { + iterator = iterator == null ? _.identity : lookupIterator(iterator); + var value = iterator.call(context, obj); + var low = 0, high = array.length; + while (low < high) { + var mid = (low + high) >>> 1; + iterator.call(context, array[mid]) < value ? low = mid + 1 : high = mid; + } + return low; + }; + + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (obj.length === +obj.length) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return (obj.length === +obj.length) ? obj.length : _.keys(obj).length; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null) return void 0; + return (n == null) || guard ? array[0] : slice.call(array, 0, n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. The **guard** check allows it to work with + // `_.map`. + _.initial = function(array, n, guard) { + return slice.call(array, 0, array.length - ((n == null) || guard ? 1 : n)); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. The **guard** check allows it to work with `_.map`. + _.last = function(array, n, guard) { + if (array == null) return void 0; + if ((n == null) || guard) { + return array[array.length - 1]; + } else { + return slice.call(array, Math.max(array.length - n, 0)); + } + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. The **guard** + // check allows it to work with `_.map`. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, (n == null) || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, _.identity); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, output) { + if (shallow && _.every(input, _.isArray)) { + return concat.apply(output, input); + } + each(input, function(value) { + if (_.isArray(value) || _.isArguments(value)) { + shallow ? push.apply(output, value) : flatten(value, shallow, output); + } else { + output.push(value); + } + }); + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, []); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iterator, context) { + if (_.isFunction(isSorted)) { + context = iterator; + iterator = isSorted; + isSorted = false; + } + var initial = iterator ? _.map(array, iterator, context) : array; + var results = []; + var seen = []; + each(initial, function(value, index) { + if (isSorted ? (!index || seen[seen.length - 1] !== value) : !_.contains(seen, value)) { + seen.push(value); + results.push(array[index]); + } + }); + return results; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(_.flatten(arguments, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var rest = slice.call(arguments, 1); + return _.filter(_.uniq(array), function(item) { + return _.every(rest, function(other) { + return _.indexOf(other, item) >= 0; + }); + }); + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = concat.apply(ArrayProto, slice.call(arguments, 1)); + return _.filter(array, function(value){ return !_.contains(rest, value); }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + var length = _.max(_.pluck(arguments, "length").concat(0)); + var results = new Array(length); + for (var i = 0; i < length; i++) { + results[i] = _.pluck(arguments, '' + i); + } + return results; + }; + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. + _.object = function(list, values) { + if (list == null) return {}; + var result = {}; + for (var i = 0, length = list.length; i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // If the browser doesn't supply us with indexOf (I'm looking at you, **MSIE**), + // we need this function. Return the position of the first occurrence of an + // item in an array, or -1 if the item is not included in the array. + // Delegates to **ECMAScript 5**'s native `indexOf` if available. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = function(array, item, isSorted) { + if (array == null) return -1; + var i = 0, length = array.length; + if (isSorted) { + if (typeof isSorted == 'number') { + i = (isSorted < 0 ? Math.max(0, length + isSorted) : isSorted); + } else { + i = _.sortedIndex(array, item); + return array[i] === item ? i : -1; + } + } + if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted); + for (; i < length; i++) if (array[i] === item) return i; + return -1; + }; + + // Delegates to **ECMAScript 5**'s native `lastIndexOf` if available. + _.lastIndexOf = function(array, item, from) { + if (array == null) return -1; + var hasIndex = from != null; + if (nativeLastIndexOf && array.lastIndexOf === nativeLastIndexOf) { + return hasIndex ? array.lastIndexOf(item, from) : array.lastIndexOf(item); + } + var i = (hasIndex ? from : array.length); + while (i--) if (array[i] === item) return i; + return -1; + }; + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (arguments.length <= 1) { + stop = start || 0; + start = 0; + } + step = arguments[2] || 1; + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var idx = 0; + var range = new Array(length); + + while(idx < length) { + range[idx++] = start; + start += step; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Reusable constructor function for prototype setting. + var ctor = function(){}; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = function(func, context) { + var args, bound; + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError; + args = slice.call(arguments, 2); + return bound = function() { + if (!(this instanceof bound)) return func.apply(context, args.concat(slice.call(arguments))); + ctor.prototype = func.prototype; + var self = new ctor; + ctor.prototype = null; + var result = func.apply(self, args.concat(slice.call(arguments))); + if (Object(result) === result) return result; + return self; + }; + }; + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. + _.partial = function(func) { + var args = slice.call(arguments, 1); + return function() { + return func.apply(this, args.concat(slice.call(arguments))); + }; + }; + + // Bind all of an object's methods to that object. Useful for ensuring that + // all callbacks defined on an object belong to it. + _.bindAll = function(obj) { + var funcs = slice.call(arguments, 1); + if (funcs.length === 0) throw new Error("bindAll must be passed function names"); + each(funcs, function(f) { obj[f] = _.bind(obj[f], obj); }); + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memo = {}; + hasher || (hasher = _.identity); + return function() { + var key = hasher.apply(this, arguments); + return _.has(memo, key) ? memo[key] : (memo[key] = func.apply(this, arguments)); + }; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ return func.apply(null, args); }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = function(func) { + return _.delay.apply(_, [func, 1].concat(slice.call(arguments, 1))); + }; + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + options || (options = {}); + var later = function() { + previous = options.leading === false ? 0 : new Date; + timeout = null; + result = func.apply(context, args); + }; + return function() { + var now = new Date; + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0) { + clearTimeout(timeout); + timeout = null; + previous = now; + result = func.apply(context, args); + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, args, context, timestamp, result; + return function() { + context = this; + args = arguments; + timestamp = new Date(); + var later = function() { + var last = (new Date()) - timestamp; + if (last < wait) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) result = func.apply(context, args); + } + }; + var callNow = immediate && !timeout; + if (!timeout) { + timeout = setTimeout(later, wait); + } + if (callNow) result = func.apply(context, args); + return result; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = function(func) { + var ran = false, memo; + return function() { + if (ran) return memo; + ran = true; + memo = func.apply(this, arguments); + func = null; + return memo; + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return function() { + var args = [func]; + push.apply(args, arguments); + return wrapper.apply(this, args); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var funcs = arguments; + return function() { + var args = arguments; + for (var i = funcs.length - 1; i >= 0; i--) { + args = [funcs[i].apply(this, args)]; + } + return args[0]; + }; + }; + + // Returns a function that will only be executed after being called N times. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Object Functions + // ---------------- + + // Retrieve the names of an object's properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = nativeKeys || function(obj) { + if (obj !== Object(obj)) throw new TypeError('Invalid object'); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys.push(key); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = new Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Convert an object into a list of `[key, value]` pairs. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = new Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = function(obj) { + each(slice.call(arguments, 1), function(source) { + if (source) { + for (var prop in source) { + obj[prop] = source[prop]; + } + } + }); + return obj; + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(obj) { + var copy = {}; + var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); + each(keys, function(key) { + if (key in obj) copy[key] = obj[key]; + }); + return copy; + }; + + // Return a copy of the object without the blacklisted properties. + _.omit = function(obj) { + var copy = {}; + var keys = concat.apply(ArrayProto, slice.call(arguments, 1)); + for (var key in obj) { + if (!_.contains(keys, key)) copy[key] = obj[key]; + } + return copy; + }; + + // Fill in a given object with default properties. + _.defaults = function(obj) { + each(slice.call(arguments, 1), function(source) { + if (source) { + for (var prop in source) { + if (obj[prop] === void 0) obj[prop] = source[prop]; + } + } + }); + return obj; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Internal recursive comparison function for `isEqual`. + var eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a == 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className != toString.call(b)) return false; + switch (className) { + // Strings, numbers, dates, and booleans are compared by value. + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return a == String(b); + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. An `egal` comparison is performed for + // other numeric values. + return a != +a ? b != +b : (a == 0 ? 1 / a == 1 / b : a == +b); + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a == +b; + // RegExps are compared by their source patterns and flags. + case '[object RegExp]': + return a.source == b.source && + a.global == b.global && + a.multiline == b.multiline && + a.ignoreCase == b.ignoreCase; + } + if (typeof a != 'object' || typeof b != 'object') return false; + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] == a) return bStack[length] == b; + } + // Objects with different constructors are not equivalent, but `Object`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && (aCtor instanceof aCtor) && + _.isFunction(bCtor) && (bCtor instanceof bCtor))) { + return false; + } + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + var size = 0, result = true; + // Recursively compare objects and arrays. + if (className == '[object Array]') { + // Compare array lengths to determine if a deep comparison is necessary. + size = a.length; + result = size == b.length; + if (result) { + // Deep compare the contents, ignoring non-numeric properties. + while (size--) { + if (!(result = eq(a[size], b[size], aStack, bStack))) break; + } + } + } else { + // Deep compare objects. + for (var key in a) { + if (_.has(a, key)) { + // Count the expected number of properties. + size++; + // Deep compare each member. + if (!(result = _.has(b, key) && eq(a[key], b[key], aStack, bStack))) break; + } + } + // Ensure that both objects contain the same number of properties. + if (result) { + for (key in b) { + if (_.has(b, key) && !(size--)) break; + } + result = !size; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return result; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b, [], []); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (_.isArray(obj) || _.isString(obj)) return obj.length === 0; + for (var key in obj) if (_.has(obj, key)) return false; + return true; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) == '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + return obj === Object(obj); + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp. + each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) == '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return !!(obj && _.has(obj, 'callee')); + }; + } + + // Optimize `isFunction` if appropriate. + if (typeof (/./) !== 'function') { + _.isFunction = function(obj) { + return typeof obj === 'function'; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? (NaN is the only number which does not equal itself). + _.isNaN = function(obj) { + return _.isNumber(obj) && obj != +obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) == '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, key) { + return hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iterators. + _.identity = function(value) { + return value; + }; + + // Run a function **n** times. + _.times = function(n, iterator, context) { + var accum = Array(Math.max(0, n)); + for (var i = 0; i < n; i++) accum[i] = iterator.call(context, i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // List of HTML entities for escaping. + var entityMap = { + escape: { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''' + } + }; + entityMap.unescape = _.invert(entityMap.escape); + + // Regexes containing the keys and values listed immediately above. + var entityRegexes = { + escape: new RegExp('[' + _.keys(entityMap.escape).join('') + ']', 'g'), + unescape: new RegExp('(' + _.keys(entityMap.unescape).join('|') + ')', 'g') + }; + + // Functions for escaping and unescaping strings to/from HTML interpolation. + _.each(['escape', 'unescape'], function(method) { + _[method] = function(string) { + if (string == null) return ''; + return ('' + string).replace(entityRegexes[method], function(match) { + return entityMap[method][match]; + }); + }; + }); + + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property) { + if (object == null) return void 0; + var value = object[property]; + return _.isFunction(value) ? value.call(object) : value; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result.call(this, func.apply(_, args)); + }; + }); + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\t': 't', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escaper = /\\|'|\r|\n|\t|\u2028|\u2029/g; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + _.template = function(text, data, settings) { + var render; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = new RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset) + .replace(escaper, function(match) { return '\\' + escapes[match]; }); + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } + if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } + if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + index = offset + match.length; + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + "return __p;\n"; + + try { + render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + if (data) return render(data, _); + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled function source as a convenience for precompilation. + template.source = 'function(' + (settings.variable || 'obj') + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function, which will delegate to the wrapper. + _.chain = function(obj) { + return _(obj).chain(); + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var result = function(obj) { + return this._chain ? _(obj).chain() : obj; + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name == 'shift' || name == 'splice') && obj.length === 0) delete obj[0]; + return result.call(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return result.call(this, method.apply(this._wrapped, arguments)); + }; + }); + + _.extend(_.prototype, { + + // Start chaining a wrapped Underscore object. + chain: function() { + this._chain = true; + return this; + }, + + // Extracts the result from a wrapped and chained object. + value: function() { + return this._wrapped; + } + + }); + +}).call(this); + +},{}],16:[function(require,module,exports){ + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `global` on the server. + var root = this; + + // Save the previous value of the `humanize` variable. + var previousHumanize = root.humanize; + + var humanize = {}; + + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = humanize; + } + exports.humanize = humanize; + } else { + if (typeof define === 'function' && define.amd) { + define('humanize', function() { + return humanize; + }); + } + root.humanize = humanize; + } + + humanize.noConflict = function() { + root.humanize = previousHumanize; + return this; + }; + + humanize.pad = function(str, count, padChar, type) { + str += ''; + if (!padChar) { + padChar = ' '; + } else if (padChar.length > 1) { + padChar = padChar.charAt(0); + } + type = (type === undefined) ? 'left' : 'right'; + + if (type === 'right') { + while (str.length < count) { + str = str + padChar; + } + } else { + // default to left + while (str.length < count) { + str = padChar + str; + } + } + + return str; + }; + + // gets current unix time + humanize.time = function() { + return new Date().getTime() / 1000; + }; + + /** + * PHP-inspired date + */ + + /* jan feb mar apr may jun jul aug sep oct nov dec */ + var dayTableCommon = [ 0, 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 ]; + var dayTableLeap = [ 0, 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 ]; + // var mtable_common[13] = { 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + // static int ml_table_leap[13] = { 0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; + + + humanize.date = function(format, timestamp) { + var jsdate = ((timestamp === undefined) ? new Date() : // Not provided + (timestamp instanceof Date) ? new Date(timestamp) : // JS Date() + new Date(timestamp * 1000) // UNIX timestamp (auto-convert to int) + ); + + var formatChr = /\\?([a-z])/gi; + var formatChrCb = function (t, s) { + return f[t] ? f[t]() : s; + }; + + var shortDayTxt = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday']; + var monthTxt = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + + var f = { + /* Day */ + // Day of month w/leading 0; 01..31 + d: function () { return humanize.pad(f.j(), 2, '0'); }, + + // Shorthand day name; Mon..Sun + D: function () { return f.l().slice(0, 3); }, + + // Day of month; 1..31 + j: function () { return jsdate.getDate(); }, + + // Full day name; Monday..Sunday + l: function () { return shortDayTxt[f.w()]; }, + + // ISO-8601 day of week; 1[Mon]..7[Sun] + N: function () { return f.w() || 7; }, + + // Ordinal suffix for day of month; st, nd, rd, th + S: function () { + var j = f.j(); + return j > 4 && j < 21 ? 'th' : {1: 'st', 2: 'nd', 3: 'rd'}[j % 10] || 'th'; + }, + + // Day of week; 0[Sun]..6[Sat] + w: function () { return jsdate.getDay(); }, + + // Day of year; 0..365 + z: function () { + return (f.L() ? dayTableLeap[f.n()] : dayTableCommon[f.n()]) + f.j() - 1; + }, + + /* Week */ + // ISO-8601 week number + W: function () { + // days between midweek of this week and jan 4 + // (f.z() - f.N() + 1 + 3.5) - 3 + var midWeekDaysFromJan4 = f.z() - f.N() + 1.5; + // 1 + number of weeks + rounded week + return humanize.pad(1 + Math.floor(Math.abs(midWeekDaysFromJan4) / 7) + (midWeekDaysFromJan4 % 7 > 3.5 ? 1 : 0), 2, '0'); + }, + + /* Month */ + // Full month name; January..December + F: function () { return monthTxt[jsdate.getMonth()]; }, + + // Month w/leading 0; 01..12 + m: function () { return humanize.pad(f.n(), 2, '0'); }, + + // Shorthand month name; Jan..Dec + M: function () { return f.F().slice(0, 3); }, + + // Month; 1..12 + n: function () { return jsdate.getMonth() + 1; }, + + // Days in month; 28..31 + t: function () { return (new Date(f.Y(), f.n(), 0)).getDate(); }, + + /* Year */ + // Is leap year?; 0 or 1 + L: function () { return new Date(f.Y(), 1, 29).getMonth() === 1 ? 1 : 0; }, + + // ISO-8601 year + o: function () { + var n = f.n(); + var W = f.W(); + return f.Y() + (n === 12 && W < 9 ? -1 : n === 1 && W > 9); + }, + + // Full year; e.g. 1980..2010 + Y: function () { return jsdate.getFullYear(); }, + + // Last two digits of year; 00..99 + y: function () { return (String(f.Y())).slice(-2); }, + + /* Time */ + // am or pm + a: function () { return jsdate.getHours() > 11 ? 'pm' : 'am'; }, + + // AM or PM + A: function () { return f.a().toUpperCase(); }, + + // Swatch Internet time; 000..999 + B: function () { + var unixTime = jsdate.getTime() / 1000; + var secondsPassedToday = unixTime % 86400 + 3600; // since it's based off of UTC+1 + if (secondsPassedToday < 0) { secondsPassedToday += 86400; } + var beats = ((secondsPassedToday) / 86.4) % 1000; + if (unixTime < 0) { + return Math.ceil(beats); + } + return Math.floor(beats); + }, + + // 12-Hours; 1..12 + g: function () { return f.G() % 12 || 12; }, + + // 24-Hours; 0..23 + G: function () { return jsdate.getHours(); }, + + // 12-Hours w/leading 0; 01..12 + h: function () { return humanize.pad(f.g(), 2, '0'); }, + + // 24-Hours w/leading 0; 00..23 + H: function () { return humanize.pad(f.G(), 2, '0'); }, + + // Minutes w/leading 0; 00..59 + i: function () { return humanize.pad(jsdate.getMinutes(), 2, '0'); }, + + // Seconds w/leading 0; 00..59 + s: function () { return humanize.pad(jsdate.getSeconds(), 2, '0'); }, + + // Microseconds; 000000-999000 + u: function () { return humanize.pad(jsdate.getMilliseconds() * 1000, 6, '0'); }, + + // Whether or not the date is in daylight savings time + /* + I: function () { + // Compares Jan 1 minus Jan 1 UTC to Jul 1 minus Jul 1 UTC. + // If they are not equal, then DST is observed. + var Y = f.Y(); + return 0 + ((new Date(Y, 0) - Date.UTC(Y, 0)) !== (new Date(Y, 6) - Date.UTC(Y, 6))); + }, + */ + + // Difference to GMT in hour format; e.g. +0200 + O: function () { + var tzo = jsdate.getTimezoneOffset(); + var tzoNum = Math.abs(tzo); + return (tzo > 0 ? '-' : '+') + humanize.pad(Math.floor(tzoNum / 60) * 100 + tzoNum % 60, 4, '0'); + }, + + // Difference to GMT w/colon; e.g. +02:00 + P: function () { + var O = f.O(); + return (O.substr(0, 3) + ':' + O.substr(3, 2)); + }, + + // Timezone offset in seconds (-43200..50400) + Z: function () { return -jsdate.getTimezoneOffset() * 60; }, + + // Full Date/Time, ISO-8601 date + c: function () { return 'Y-m-d\\TH:i:sP'.replace(formatChr, formatChrCb); }, + + // RFC 2822 + r: function () { return 'D, d M Y H:i:s O'.replace(formatChr, formatChrCb); }, + + // Seconds since UNIX epoch + U: function () { return jsdate.getTime() / 1000 || 0; } + }; + + return format.replace(formatChr, formatChrCb); + }; + + + /** + * format number by adding thousands separaters and significant digits while rounding + */ + humanize.numberFormat = function(number, decimals, decPoint, thousandsSep) { + decimals = isNaN(decimals) ? 2 : Math.abs(decimals); + decPoint = (decPoint === undefined) ? '.' : decPoint; + thousandsSep = (thousandsSep === undefined) ? ',' : thousandsSep; + + var sign = number < 0 ? '-' : ''; + number = Math.abs(+number || 0); + + var intPart = parseInt(number.toFixed(decimals), 10) + ''; + var j = intPart.length > 3 ? intPart.length % 3 : 0; + + return sign + (j ? intPart.substr(0, j) + thousandsSep : '') + intPart.substr(j).replace(/(\d{3})(?=\d)/g, '$1' + thousandsSep) + (decimals ? decPoint + Math.abs(number - intPart).toFixed(decimals).slice(2) : ''); + }; + + + /** + * For dates that are the current day or within one day, return 'today', 'tomorrow' or 'yesterday', as appropriate. + * Otherwise, format the date using the passed in format string. + * + * Examples (when 'today' is 17 Feb 2007): + * 16 Feb 2007 becomes yesterday. + * 17 Feb 2007 becomes today. + * 18 Feb 2007 becomes tomorrow. + * Any other day is formatted according to given argument or the DATE_FORMAT setting if no argument is given. + */ + humanize.naturalDay = function(timestamp, format) { + timestamp = (timestamp === undefined) ? humanize.time() : timestamp; + format = (format === undefined) ? 'Y-m-d' : format; + + var oneDay = 86400; + var d = new Date(); + var today = (new Date(d.getFullYear(), d.getMonth(), d.getDate())).getTime() / 1000; + + if (timestamp < today && timestamp >= today - oneDay) { + return 'yesterday'; + } else if (timestamp >= today && timestamp < today + oneDay) { + return 'today'; + } else if (timestamp >= today + oneDay && timestamp < today + 2 * oneDay) { + return 'tomorrow'; + } + + return humanize.date(format, timestamp); + }; + + /** + * returns a string representing how many seconds, minutes or hours ago it was or will be in the future + * Will always return a relative time, most granular of seconds to least granular of years. See unit tests for more details + */ + humanize.relativeTime = function(timestamp) { + timestamp = (timestamp === undefined) ? humanize.time() : timestamp; + + var currTime = humanize.time(); + var timeDiff = currTime - timestamp; + + // within 2 seconds + if (timeDiff < 2 && timeDiff > -2) { + return (timeDiff >= 0 ? 'just ' : '') + 'now'; + } + + // within a minute + if (timeDiff < 60 && timeDiff > -60) { + return (timeDiff >= 0 ? Math.floor(timeDiff) + ' seconds ago' : 'in ' + Math.floor(-timeDiff) + ' seconds'); + } + + // within 2 minutes + if (timeDiff < 120 && timeDiff > -120) { + return (timeDiff >= 0 ? 'about a minute ago' : 'in about a minute'); + } + + // within an hour + if (timeDiff < 3600 && timeDiff > -3600) { + return (timeDiff >= 0 ? Math.floor(timeDiff / 60) + ' minutes ago' : 'in ' + Math.floor(-timeDiff / 60) + ' minutes'); + } + + // within 2 hours + if (timeDiff < 7200 && timeDiff > -7200) { + return (timeDiff >= 0 ? 'about an hour ago' : 'in about an hour'); + } + + // within 24 hours + if (timeDiff < 86400 && timeDiff > -86400) { + return (timeDiff >= 0 ? Math.floor(timeDiff / 3600) + ' hours ago' : 'in ' + Math.floor(-timeDiff / 3600) + ' hours'); + } + + // within 2 days + var days2 = 2 * 86400; + if (timeDiff < days2 && timeDiff > -days2) { + return (timeDiff >= 0 ? '1 day ago' : 'in 1 day'); + } + + // within 29 days + var days29 = 29 * 86400; + if (timeDiff < days29 && timeDiff > -days29) { + return (timeDiff >= 0 ? Math.floor(timeDiff / 86400) + ' days ago' : 'in ' + Math.floor(-timeDiff / 86400) + ' days'); + } + + // within 60 days + var days60 = 60 * 86400; + if (timeDiff < days60 && timeDiff > -days60) { + return (timeDiff >= 0 ? 'about a month ago' : 'in about a month'); + } + + var currTimeYears = parseInt(humanize.date('Y', currTime), 10); + var timestampYears = parseInt(humanize.date('Y', timestamp), 10); + var currTimeMonths = currTimeYears * 12 + parseInt(humanize.date('n', currTime), 10); + var timestampMonths = timestampYears * 12 + parseInt(humanize.date('n', timestamp), 10); + + // within a year + var monthDiff = currTimeMonths - timestampMonths; + if (monthDiff < 12 && monthDiff > -12) { + return (monthDiff >= 0 ? monthDiff + ' months ago' : 'in ' + (-monthDiff) + ' months'); + } + + var yearDiff = currTimeYears - timestampYears; + if (yearDiff < 2 && yearDiff > -2) { + return (yearDiff >= 0 ? 'a year ago' : 'in a year'); + } + + return (yearDiff >= 0 ? yearDiff + ' years ago' : 'in ' + (-yearDiff) + ' years'); + }; + + /** + * Converts an integer to its ordinal as a string. + * + * 1 becomes 1st + * 2 becomes 2nd + * 3 becomes 3rd etc + */ + humanize.ordinal = function(number) { + number = parseInt(number, 10); + number = isNaN(number) ? 0 : number; + var sign = number < 0 ? '-' : ''; + number = Math.abs(number); + var tens = number % 100; + + return sign + number + (tens > 4 && tens < 21 ? 'th' : {1: 'st', 2: 'nd', 3: 'rd'}[number % 10] || 'th'); + }; + + /** + * Formats the value like a 'human-readable' file size (i.e. '13 KB', '4.1 MB', '102 bytes', etc). + * + * For example: + * If value is 123456789, the output would be 117.7 MB. + */ + humanize.filesize = function(filesize, kilo, decimals, decPoint, thousandsSep, suffixSep) { + kilo = (kilo === undefined) ? 1024 : kilo; + if (filesize <= 0) { return '0 bytes'; } + if (filesize < kilo && decimals === undefined) { decimals = 0; } + if (suffixSep === undefined) { suffixSep = ' '; } + return humanize.intword(filesize, ['bytes', 'KB', 'MB', 'GB', 'TB', 'PB'], kilo, decimals, decPoint, thousandsSep, suffixSep); + }; + + /** + * Formats the value like a 'human-readable' number (i.e. '13 K', '4.1 M', '102', etc). + * + * For example: + * If value is 123456789, the output would be 117.7 M. + */ + humanize.intword = function(number, units, kilo, decimals, decPoint, thousandsSep, suffixSep) { + var humanized, unit; + + units = units || ['', 'K', 'M', 'B', 'T'], + unit = units.length - 1, + kilo = kilo || 1000, + decimals = isNaN(decimals) ? 2 : Math.abs(decimals), + decPoint = decPoint || '.', + thousandsSep = thousandsSep || ',', + suffixSep = suffixSep || ''; + + for (var i=0; i < units.length; i++) { + if (number < Math.pow(kilo, i+1)) { + unit = i; + break; + } + } + humanized = number / Math.pow(kilo, unit); + + var suffix = units[unit] ? suffixSep + units[unit] : ''; + return humanize.numberFormat(humanized, decimals, decPoint, thousandsSep) + suffix; + }; + + /** + * Replaces line breaks in plain text with appropriate HTML + * A single newline becomes an HTML line break (
) and a new line followed by a blank line becomes a paragraph break (

). + * + * For example: + * If value is Joel\nis a\n\nslug, the output will be

Joel
is a

slug

+ */ + humanize.linebreaks = function(str) { + // remove beginning and ending newlines + str = str.replace(/^([\n|\r]*)/, ''); + str = str.replace(/([\n|\r]*)$/, ''); + + // normalize all to \n + str = str.replace(/(\r\n|\n|\r)/g, "\n"); + + // any consecutive new lines more than 2 gets turned into p tags + str = str.replace(/(\n{2,})/g, '

'); + + // any that are singletons get turned into br + str = str.replace(/\n/g, '
'); + return '

' + str + '

'; + }; + + /** + * Converts all newlines in a piece of plain text to HTML line breaks (
). + */ + humanize.nl2br = function(str) { + return str.replace(/(\r\n|\n|\r)/g, '
'); + }; + + /** + * Truncates a string if it is longer than the specified number of characters. + * Truncated strings will end with a translatable ellipsis sequence ('…'). + */ + humanize.truncatechars = function(string, length) { + if (string.length <= length) { return string; } + return string.substr(0, length) + '…'; + }; + + /** + * Truncates a string after a certain number of words. + * Newlines within the string will be removed. + */ + humanize.truncatewords = function(string, numWords) { + var words = string.split(' '); + if (words.length < numWords) { return string; } + return words.slice(0, numWords).join(' ') + '…'; + }; + +}).call(this); + +},{}],17:[function(require,module,exports){ +(function (process){ +/** + * @author John Resig + * @author Originally by Marcus Spiegel + * @link https://github.com/jeresig/i18n-node + * @license http://opensource.org/licenses/MIT + * + * @version 0.4.7 + */ + +// dependencies +var vsprintf = require("sprintf").vsprintf, + fs = require("fs"), + path = require("path"); + + +function dotNotation (obj, is, value) { + if (obj.hasOwnProperty(is)) { + return obj[is]; + } + + if (typeof is === 'string') { + return dotNotation(obj, is.split('.'), value); + } else if (is.length === 1 && value !== undefined) { + return obj[is[0]] = value; + } else if (is.length === 0) { + return obj; + } else { + if (obj.hasOwnProperty(is[0])) { + return dotNotation(obj[is[0]], is.slice(1), value); + } else { + return obj[is.join('.')] = is.join('.'); + } + } +} + +var i18n = module.exports = function (opt) { + var self = this; + + // Put into dev or production mode + this.devMode = process.env.NODE_ENV !== "production"; + + // Copy over options + for (var prop in opt) { + this[prop] = opt[prop]; + } + + // you may register helpers in global scope, up to you + if (typeof this.register === "object") { + i18n.resMethods.forEach(function (method) { + self.register[method] = self[method].bind(self); + }); + } + + // implicitly read all locales + // if it's an array of locale names, read in the data + if (opt.locales && opt.locales.forEach) { + this.locales = {}; + + opt.locales.forEach(function (locale) { + self.readFile(locale); + }); + + this.defaultLocale = opt.locales[0]; + } + + // Set the locale to the default locale + this.setLocale(this.defaultLocale); + + // Check the defaultLocale + if (!this.locales[this.defaultLocale]) { + console.error("Not a valid default locale."); + } + + if (this.request) { + if (this.subdomain) { + this.setLocaleFromSubdomain(this.request); + } + + if (this.query !== false) { + this.setLocaleFromQuery(this.request); + } + + if (this.session !== false) { + this.setLocaleFromSessionVar(this.request); + } + + this.prefLocale = this.preferredLocale(); + + if (this.prefLocale !== false && this.prefLocale !== this.locale) { + this.setLocale(this.prefLocale); + } + } +}; + +i18n.version = "0.4.7"; + +i18n.localeCache = {}; +i18n.resMethods = ["__", "__n", "getLocale", "isPreferredLocale"]; + +i18n.expressBind = function (app, opt) { + if (!app) { + return; + } + + app.use(function (req, res, next) { + opt.request = req; + req.i18n = new i18n(opt); + + // Express 3 + if (res.locals) { + i18n.registerMethods(res.locals, req) + } + + next(); + }); + + // Express 2 + if (app.dynamicHelpers) { + app.dynamicHelpers(i18n.registerMethods({})); + } +}; + +i18n.registerMethods = function (helpers, req) { + i18n.resMethods.forEach(function (method) { + if (req) { + helpers[method] = req.i18n[method].bind(req.i18n); + } else { + helpers[method] = function (req) { + return req.i18n[method].bind(req.i18n); + }; + } + + }); + + return helpers; +}; + +i18n.prototype = { + defaultLocale: "en", + extension: ".js", + directory: "./locales", + cookieName: "lang", + sessionVarName: "locale", + indent: "\t", + + parse: JSON.parse, + + dump: function (data, indent) { + return JSON.stringify(data, null, indent); + }, + + __: function () { + var msg = this.translate(this.locale, arguments[0]); + + if (arguments.length > 1) { + msg = vsprintf(msg, Array.prototype.slice.call(arguments, 1)); + } + + return msg; + }, + + __n: function (pathOrSingular, countOrPlural, additionalOrCount) { + var msg; + if (typeof countOrPlural === 'number') { + var path = pathOrSingular; + var count = countOrPlural; + msg = this.translate(this.locale, path); + + msg = vsprintf(parseInt(count, 10) > 1 ? msg.other : msg.one, Array.prototype.slice.call(arguments, 1)); + } else { + var singular = pathOrSingular; + var plural = countOrPlural; + var count = additionalOrCount; + msg = this.translate(this.locale, singular, plural); + + msg = vsprintf(parseInt(count, 10) > 1 ? msg.other : msg.one, [count]); + + if (arguments.length > 3) { + msg = vsprintf(msg, Array.prototype.slice.call(arguments, 3)); + } + } + + return msg; + }, + + setLocale: function (locale) { + + if (!locale) return; + + if (!this.locales[locale]) { + if (this.devMode) { + console.warn("Locale (" + locale + ") not found."); + } + + locale = this.defaultLocale; + } + + return (this.locale = locale); + }, + + getLocale: function () { + return this.locale; + }, + + isPreferredLocale: function () { + return !this.prefLocale || + this.prefLocale === this.getLocale(); + }, + + setLocaleFromSessionVar: function (req) { + req = req || this.request; + + if (!req || !req.session || !req.session[this.sessionVarName]) { + return; + } + + var locale = req.session[this.sessionVarName]; + + if (this.locales[locale]) { + if (this.devMode) { + console.log("Overriding locale from query: " + locale); + } + this.setLocale(locale); + } + + }, + + setLocaleFromQuery: function (req) { + req = req || this.request; + + if (!req || !req.query || !req.query.lang) { + return; + } + + var locale = (req.query.lang+'').toLowerCase(); + + if (this.locales[locale]) { + if (this.devMode) { + console.log("Overriding locale from query: " + locale); + } + + this.setLocale(locale); + } + }, + + setLocaleFromSubdomain: function (req) { + req = req || this.request; + + if (!req || !req.headers || !req.headers.host) { + return; + } + + if (/^([^.]+)/.test(req.headers.host) && this.locales[RegExp.$1]) { + if (this.devMode) { + console.log("Overriding locale from host: " + RegExp.$1); + } + + this.setLocale(RegExp.$1); + } + }, + + setLocaleFromCookie: function (req) { + req = req || this.request; + + if (!req || !req.cookies || !this.cookieName || !req.cookies[this.cookieName]) { + return; + } + + var locale = req.cookies[this.cookieName].toLowerCase(); + + if (this.locales[locale]) { + if (this.devMode) { + console.log("Overriding locale from cookie: " + locale); + } + + this.setLocale(locale); + } + }, + + setLocaleFromEnvironmentVariable: function () { + if (!process.env.LANG) { + return; + } + var locale = process.env.LANG.split("_")[0]; + if (this.locales[locale]) { + if (this.devMode) { + console.log("Overriding locale from environment variable: " + locale); + } + + this.setLocale(locale); + } + }, + + preferredLocale: function (req) { + req = req || this.request; + + if (!req || !req.headers) { + return; + } + + var accept = req.headers["accept-language"] || "", + regExp = /(^|,\s*)([a-z0-9-]+)/gi, + self = this, + prefLocale; + + while (!prefLocale && (match = regExp.exec(accept))) { + var locale = match[2].toLowerCase(); + var parts = locale.split("-"); + + if (self.locales[locale]) { + prefLocale = locale; + } else if (parts.length > 1 && self.locales[parts[0]]) { + prefLocale = parts[0]; + } + } + + return prefLocale || this.defaultLocale; + }, + + // read locale file, translate a msg and write to fs if new + translate: function (locale, singular, plural) { + if (!locale || !this.locales[locale]) { + if (this.devMode) { + console.warn("WARN: No locale found. Using the default (" + + this.defaultLocale + ") as current locale"); + } + + locale = this.defaultLocale; + + this.initLocale(locale, {}); + } + + if (!this.locales[locale][singular]) { + if (this.devMode) { + dotNotation(this.locales[locale], singular, plural ? { one: singular, other: plural } : undefined); + this.writeFile(locale); + } + } + + return dotNotation(this.locales[locale], singular, plural ? { one: singular, other: plural } : undefined); + }, + + // try reading a file + readFile: function (locale) { + var file = this.locateFile(locale); + + if (!this.devMode && i18n.localeCache[file]) { + this.initLocale(locale, i18n.localeCache[file]); + return; + } + + try { + var localeFile = fs.readFileSync(file); + var base; + + // reading base file if 'base' provided + if (typeof this.base === "function") { + var baseFilename; + + try { + baseFilename = this.base(locale); + } catch (e) { + console.error('base function threw exception for locale %s', locale, e); + } + + if (typeof baseFilename === "string") { + try { + base = this.parse(fs.readFileSync(this.locateFile(baseFilename))); + } catch (e) { + console.error('unable to read or parse base file %s for locale %s', baseFilename, locale, e); + } + } + } + + try { + // parsing file content + var content = this.parse(localeFile); + + if (base) { + // writing content to the base and swapping + for (var prop in content) { + base[prop] = content[prop]; + } + content = base; + } + + // putting content to locales[locale] + this.initLocale(locale, content); + } catch (e) { + console.error('unable to parse locales from file (maybe ' + file + + ' is empty or invalid ' + this.extension + '?): ', e); + } + + } catch (e) { + // unable to read, so intialize that file + // locales[locale] are already set in memory, so no extra read required + // or locales[locale] are empty, which initializes an empty locale.json file + if (!fs.existsSync(file)) { + this.writeFile(locale); + } + } + }, + + // try writing a file in a created directory + writeFile: function (locale) { + // don't write new locale information to disk if we're not in dev mode + if (!this.devMode) { + // Initialize the locale if didn't exist already + this.initLocale(locale, {}); + return; + } + + // creating directory if necessary + try { + fs.lstatSync(this.directory); + + } catch (e) { + if (this.devMode) { + console.log('creating locales dir in: ' + this.directory); + } + + fs.mkdirSync(this.directory, 0755); + } + + // Initialize the locale if didn't exist already + this.initLocale(locale, {}); + + // writing to tmp and rename on success + try { + var target = this.locateFile(locale), + tmp = target + ".tmp"; + + fs.writeFileSync(tmp, + this.dump(this.locales[locale], this.indent), + "utf8"); + + if (fs.statSync(tmp).isFile()) { + fs.renameSync(tmp, target); + + } else { + console.error('unable to write locales to file (either ' + tmp + + ' or ' + target + ' are not writeable?): '); + } + + } catch (e) { + console.error('unexpected error writing files (either ' + tmp + + ' or ' + target + ' are not writeable?): ', e); + } + }, + + // basic normalization of filepath + locateFile: function (locale) { + return path.normalize(this.directory + '/' + locale + this.extension); + }, + + initLocale: function (locale, data) { + if (!this.locales[locale]) { + this.locales[locale] = data; + + // Only cache the files when we're not in dev mode + if (!this.devMode) { + var file = this.locateFile(locale); + if (!i18n.localeCache[file]) { + i18n.localeCache[file] = data; + } + } + } + } +}; + +}).call(this,require('_process')) +},{"_process":20,"fs":1,"path":19,"sprintf":21}],18:[function(require,module,exports){ +module.exports = require('./i18n'); + +},{"./i18n":17}],19:[function(require,module,exports){ +(function (process){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. + +// resolves . and .. elements in a path array with directory names there +// must be no slashes, empty elements, or device names (c:\) in the array +// (so also no leading and trailing slashes - it does not distinguish +// relative and absolute paths) +function normalizeArray(parts, allowAboveRoot) { + // if the path tries to go above the root, `up` ends up > 0 + var up = 0; + for (var i = parts.length - 1; i >= 0; i--) { + var last = parts[i]; + if (last === '.') { + parts.splice(i, 1); + } else if (last === '..') { + parts.splice(i, 1); + up++; + } else if (up) { + parts.splice(i, 1); + up--; + } + } + + // if the path is allowed to go above the root, restore leading ..s + if (allowAboveRoot) { + for (; up--; up) { + parts.unshift('..'); + } + } + + return parts; +} + +// Split a filename into [root, dir, basename, ext], unix version +// 'root' is just a slash, or nothing. +var splitPathRe = + /^(\/?|)([\s\S]*?)((?:\.{1,2}|[^\/]+?|)(\.[^.\/]*|))(?:[\/]*)$/; +var splitPath = function(filename) { + return splitPathRe.exec(filename).slice(1); +}; + +// path.resolve([from ...], to) +// posix version +exports.resolve = function() { + var resolvedPath = '', + resolvedAbsolute = false; + + for (var i = arguments.length - 1; i >= -1 && !resolvedAbsolute; i--) { + var path = (i >= 0) ? arguments[i] : process.cwd(); + + // Skip empty and invalid entries + if (typeof path !== 'string') { + throw new TypeError('Arguments to path.resolve must be strings'); + } else if (!path) { + continue; + } + + resolvedPath = path + '/' + resolvedPath; + resolvedAbsolute = path.charAt(0) === '/'; + } + + // At this point the path should be resolved to a full absolute path, but + // handle relative paths to be safe (might happen when process.cwd() fails) + + // Normalize the path + resolvedPath = normalizeArray(filter(resolvedPath.split('/'), function(p) { + return !!p; + }), !resolvedAbsolute).join('/'); + + return ((resolvedAbsolute ? '/' : '') + resolvedPath) || '.'; +}; + +// path.normalize(path) +// posix version +exports.normalize = function(path) { + var isAbsolute = exports.isAbsolute(path), + trailingSlash = substr(path, -1) === '/'; + + // Normalize the path + path = normalizeArray(filter(path.split('/'), function(p) { + return !!p; + }), !isAbsolute).join('/'); + + if (!path && !isAbsolute) { + path = '.'; + } + if (path && trailingSlash) { + path += '/'; + } + + return (isAbsolute ? '/' : '') + path; +}; + +// posix version +exports.isAbsolute = function(path) { + return path.charAt(0) === '/'; +}; + +// posix version +exports.join = function() { + var paths = Array.prototype.slice.call(arguments, 0); + return exports.normalize(filter(paths, function(p, index) { + if (typeof p !== 'string') { + throw new TypeError('Arguments to path.join must be strings'); + } + return p; + }).join('/')); +}; + + +// path.relative(from, to) +// posix version +exports.relative = function(from, to) { + from = exports.resolve(from).substr(1); + to = exports.resolve(to).substr(1); + + function trim(arr) { + var start = 0; + for (; start < arr.length; start++) { + if (arr[start] !== '') break; + } + + var end = arr.length - 1; + for (; end >= 0; end--) { + if (arr[end] !== '') break; + } + + if (start > end) return []; + return arr.slice(start, end - start + 1); + } + + var fromParts = trim(from.split('/')); + var toParts = trim(to.split('/')); + + var length = Math.min(fromParts.length, toParts.length); + var samePartsLength = length; + for (var i = 0; i < length; i++) { + if (fromParts[i] !== toParts[i]) { + samePartsLength = i; + break; + } + } + + var outputParts = []; + for (var i = samePartsLength; i < fromParts.length; i++) { + outputParts.push('..'); + } + + outputParts = outputParts.concat(toParts.slice(samePartsLength)); + + return outputParts.join('/'); +}; + +exports.sep = '/'; +exports.delimiter = ':'; + +exports.dirname = function(path) { + var result = splitPath(path), + root = result[0], + dir = result[1]; + + if (!root && !dir) { + // No dirname whatsoever + return '.'; + } + + if (dir) { + // It has a dirname, strip trailing slash + dir = dir.substr(0, dir.length - 1); + } + + return root + dir; +}; + + +exports.basename = function(path, ext) { + var f = splitPath(path)[2]; + // TODO: make this comparison case-insensitive on windows? + if (ext && f.substr(-1 * ext.length) === ext) { + f = f.substr(0, f.length - ext.length); + } + return f; +}; + + +exports.extname = function(path) { + return splitPath(path)[3]; +}; + +function filter (xs, f) { + if (xs.filter) return xs.filter(f); + var res = []; + for (var i = 0; i < xs.length; i++) { + if (f(xs[i], i, xs)) res.push(xs[i]); + } + return res; +} + +// String.prototype.substr - negative index don't work in IE8 +var substr = 'ab'.substr(-1) === 'b' + ? function (str, start, len) { return str.substr(start, len) } + : function (str, start, len) { + if (start < 0) start = str.length + start; + return str.substr(start, len); + } +; + +}).call(this,require('_process')) +},{"_process":20}],20:[function(require,module,exports){ +// shim for using process in browser +var process = module.exports = {}; + +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. + +var cachedSetTimeout; +var cachedClearTimeout; + +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } + + + +} +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; + +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} + +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} + +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; +} +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; + +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; + +},{}],21:[function(require,module,exports){ +/** +sprintf() for JavaScript 0.7-beta1 +http://www.diveintojavascript.com/projects/javascript-sprintf + +Copyright (c) Alexandru Marasteanu +All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of sprintf() for JavaScript nor the + names of its contributors may be used to endorse or promote products + derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND +ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL Alexandru Marasteanu BE LIABLE FOR ANY +DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND +ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +Changelog: +2010.11.07 - 0.7-beta1-node + - converted it to a node.js compatible module + +2010.09.06 - 0.7-beta1 + - features: vsprintf, support for named placeholders + - enhancements: format cache, reduced global namespace pollution + +2010.05.22 - 0.6: + - reverted to 0.4 and fixed the bug regarding the sign of the number 0 + Note: + Thanks to Raphael Pigulla (http://www.n3rd.org/) + who warned me about a bug in 0.5, I discovered that the last update was + a regress. I appologize for that. + +2010.05.09 - 0.5: + - bug fix: 0 is now preceeded with a + sign + - bug fix: the sign was not at the right position on padded results (Kamal Abdali) + - switched from GPL to BSD license + +2007.10.21 - 0.4: + - unit test and patch (David Baird) + +2007.09.17 - 0.3: + - bug fix: no longer throws exception on empty paramenters (Hans Pufal) + +2007.09.11 - 0.2: + - feature: added argument swapping + +2007.04.03 - 0.1: + - initial release +**/ + +var sprintf = (function() { + function get_type(variable) { + return Object.prototype.toString.call(variable).slice(8, -1).toLowerCase(); + } + function str_repeat(input, multiplier) { + for (var output = []; multiplier > 0; output[--multiplier] = input) {/* do nothing */} + return output.join(''); + } + + var str_format = function() { + if (!str_format.cache.hasOwnProperty(arguments[0])) { + str_format.cache[arguments[0]] = str_format.parse(arguments[0]); + } + return str_format.format.call(null, str_format.cache[arguments[0]], arguments); + }; + + // convert object to simple one line string without indentation or + // newlines. Note that this implementation does not print array + // values to their actual place for sparse arrays. + // + // For example sparse array like this + // l = [] + // l[4] = 1 + // Would be printed as "[1]" instead of "[, , , , 1]" + // + // If argument 'seen' is not null and array the function will check for + // circular object references from argument. + str_format.object_stringify = function(obj, depth, maxdepth, seen) { + var str = ''; + if (obj != null) { + switch( typeof(obj) ) { + case 'function': + return '[Function' + (obj.name ? ': '+obj.name : '') + ']'; + break; + case 'object': + if ( obj instanceof Error) { return '[' + obj.toString() + ']' }; + if (depth >= maxdepth) return '[Object]' + if (seen) { + // add object to seen list + seen = seen.slice(0) + seen.push(obj); + } + if (obj.length != null) { //array + str += '['; + var arr = [] + for (var i in obj) { + if (seen && seen.indexOf(obj[i]) >= 0) arr.push('[Circular]'); + else arr.push(str_format.object_stringify(obj[i], depth+1, maxdepth, seen)); + } + str += arr.join(', ') + ']'; + } else if ('getMonth' in obj) { // date + return 'Date(' + obj + ')'; + } else { // object + str += '{'; + var arr = [] + for (var k in obj) { + if(obj.hasOwnProperty(k)) { + if (seen && seen.indexOf(obj[k]) >= 0) arr.push(k + ': [Circular]'); + else arr.push(k +': ' +str_format.object_stringify(obj[k], depth+1, maxdepth, seen)); + } + } + str += arr.join(', ') + '}'; + } + return str; + break; + case 'string': + return '"' + obj + '"'; + break + } + } + return '' + obj; + } + + str_format.format = function(parse_tree, argv) { + var cursor = 1, tree_length = parse_tree.length, node_type = '', arg, output = [], i, k, match, pad, pad_character, pad_length; + for (i = 0; i < tree_length; i++) { + node_type = get_type(parse_tree[i]); + if (node_type === 'string') { + output.push(parse_tree[i]); + } + else if (node_type === 'array') { + match = parse_tree[i]; // convenience purposes only + if (match[2]) { // keyword argument + arg = argv[cursor]; + for (k = 0; k < match[2].length; k++) { + if (!arg.hasOwnProperty(match[2][k])) { + throw new Error(sprintf('[sprintf] property "%s" does not exist', match[2][k])); + } + arg = arg[match[2][k]]; + } + } + else if (match[1]) { // positional argument (explicit) + arg = argv[match[1]]; + } + else { // positional argument (implicit) + arg = argv[cursor++]; + } + + if (/[^sO]/.test(match[8]) && (get_type(arg) != 'number')) { + throw new Error(sprintf('[sprintf] expecting number but found %s "' + arg + '"', get_type(arg))); + } + switch (match[8]) { + case 'b': arg = arg.toString(2); break; + case 'c': arg = String.fromCharCode(arg); break; + case 'd': arg = parseInt(arg, 10); break; + case 'e': arg = match[7] ? arg.toExponential(match[7]) : arg.toExponential(); break; + case 'f': arg = match[7] ? parseFloat(arg).toFixed(match[7]) : parseFloat(arg); break; + case 'O': arg = str_format.object_stringify(arg, 0, parseInt(match[7]) || 5); break; + case 'o': arg = arg.toString(8); break; + case 's': arg = ((arg = String(arg)) && match[7] ? arg.substring(0, match[7]) : arg); break; + case 'u': arg = Math.abs(arg); break; + case 'x': arg = arg.toString(16); break; + case 'X': arg = arg.toString(16).toUpperCase(); break; + } + arg = (/[def]/.test(match[8]) && match[3] && arg >= 0 ? '+'+ arg : arg); + pad_character = match[4] ? match[4] == '0' ? '0' : match[4].charAt(1) : ' '; + pad_length = match[6] - String(arg).length; + pad = match[6] ? str_repeat(pad_character, pad_length) : ''; + output.push(match[5] ? arg + pad : pad + arg); + } + } + return output.join(''); + }; + + str_format.cache = {}; + + str_format.parse = function(fmt) { + var _fmt = fmt, match = [], parse_tree = [], arg_names = 0; + while (_fmt) { + if ((match = /^[^\x25]+/.exec(_fmt)) !== null) { + parse_tree.push(match[0]); + } + else if ((match = /^\x25{2}/.exec(_fmt)) !== null) { + parse_tree.push('%'); + } + else if ((match = /^\x25(?:([1-9]\d*)\$|\(([^\)]+)\))?(\+)?(0|'[^$])?(-)?(\d+)?(?:\.(\d+))?([b-fosOuxX])/.exec(_fmt)) !== null) { + if (match[2]) { + arg_names |= 1; + var field_list = [], replacement_field = match[2], field_match = []; + if ((field_match = /^([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + while ((replacement_field = replacement_field.substring(field_match[0].length)) !== '') { + if ((field_match = /^\.([a-z_][a-z_\d]*)/i.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else if ((field_match = /^\[(\d+)\]/.exec(replacement_field)) !== null) { + field_list.push(field_match[1]); + } + else { + throw new Error('[sprintf] ' + replacement_field); + } + } + } + else { + throw new Error('[sprintf] ' + replacement_field); + } + match[2] = field_list; + } + else { + arg_names |= 2; + } + if (arg_names === 3) { + throw new Error('[sprintf] mixing positional and named placeholders is not (yet) supported'); + } + parse_tree.push(match); + } + else { + throw new Error('[sprintf] ' + _fmt); + } + _fmt = _fmt.substring(match[0].length); + } + return parse_tree; + }; + + return str_format; +})(); + +var vsprintf = function(fmt, argv) { + var argvClone = argv.slice(); + argvClone.unshift(fmt); + return sprintf.apply(null, argvClone); +}; + +module.exports = sprintf; +sprintf.sprintf = sprintf; +sprintf.vsprintf = vsprintf; + +},{}],22:[function(require,module,exports){ +// Underscore.js 1.8.3 +// http://underscorejs.org +// (c) 2009-2015 Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors +// Underscore may be freely distributed under the MIT license. + +(function() { + + // Baseline setup + // -------------- + + // Establish the root object, `window` in the browser, or `exports` on the server. + var root = this; + + // Save the previous value of the `_` variable. + var previousUnderscore = root._; + + // Save bytes in the minified (but not gzipped) version: + var ArrayProto = Array.prototype, ObjProto = Object.prototype, FuncProto = Function.prototype; + + // Create quick reference variables for speed access to core prototypes. + var + push = ArrayProto.push, + slice = ArrayProto.slice, + toString = ObjProto.toString, + hasOwnProperty = ObjProto.hasOwnProperty; + + // All **ECMAScript 5** native function implementations that we hope to use + // are declared here. + var + nativeIsArray = Array.isArray, + nativeKeys = Object.keys, + nativeBind = FuncProto.bind, + nativeCreate = Object.create; + + // Naked function reference for surrogate-prototype-swapping. + var Ctor = function(){}; + + // Create a safe reference to the Underscore object for use below. + var _ = function(obj) { + if (obj instanceof _) return obj; + if (!(this instanceof _)) return new _(obj); + this._wrapped = obj; + }; + + // Export the Underscore object for **Node.js**, with + // backwards-compatibility for the old `require()` API. If we're in + // the browser, add `_` as a global object. + if (typeof exports !== 'undefined') { + if (typeof module !== 'undefined' && module.exports) { + exports = module.exports = _; + } + exports._ = _; + } else { + root._ = _; + } + + // Current version. + _.VERSION = '1.8.3'; + + // Internal function that returns an efficient (for current engines) version + // of the passed-in callback, to be repeatedly applied in other Underscore + // functions. + var optimizeCb = function(func, context, argCount) { + if (context === void 0) return func; + switch (argCount == null ? 3 : argCount) { + case 1: return function(value) { + return func.call(context, value); + }; + case 2: return function(value, other) { + return func.call(context, value, other); + }; + case 3: return function(value, index, collection) { + return func.call(context, value, index, collection); + }; + case 4: return function(accumulator, value, index, collection) { + return func.call(context, accumulator, value, index, collection); + }; + } + return function() { + return func.apply(context, arguments); + }; + }; + + // A mostly-internal function to generate callbacks that can be applied + // to each element in a collection, returning the desired result — either + // identity, an arbitrary callback, a property matcher, or a property accessor. + var cb = function(value, context, argCount) { + if (value == null) return _.identity; + if (_.isFunction(value)) return optimizeCb(value, context, argCount); + if (_.isObject(value)) return _.matcher(value); + return _.property(value); + }; + _.iteratee = function(value, context) { + return cb(value, context, Infinity); + }; + + // An internal function for creating assigner functions. + var createAssigner = function(keysFunc, undefinedOnly) { + return function(obj) { + var length = arguments.length; + if (length < 2 || obj == null) return obj; + for (var index = 1; index < length; index++) { + var source = arguments[index], + keys = keysFunc(source), + l = keys.length; + for (var i = 0; i < l; i++) { + var key = keys[i]; + if (!undefinedOnly || obj[key] === void 0) obj[key] = source[key]; + } + } + return obj; + }; + }; + + // An internal function for creating a new object that inherits from another. + var baseCreate = function(prototype) { + if (!_.isObject(prototype)) return {}; + if (nativeCreate) return nativeCreate(prototype); + Ctor.prototype = prototype; + var result = new Ctor; + Ctor.prototype = null; + return result; + }; + + var property = function(key) { + return function(obj) { + return obj == null ? void 0 : obj[key]; + }; + }; + + // Helper for collection methods to determine whether a collection + // should be iterated as an array or as an object + // Related: http://people.mozilla.org/~jorendorff/es6-draft.html#sec-tolength + // Avoids a very nasty iOS 8 JIT bug on ARM-64. #2094 + var MAX_ARRAY_INDEX = Math.pow(2, 53) - 1; + var getLength = property('length'); + var isArrayLike = function(collection) { + var length = getLength(collection); + return typeof length == 'number' && length >= 0 && length <= MAX_ARRAY_INDEX; + }; + + // Collection Functions + // -------------------- + + // The cornerstone, an `each` implementation, aka `forEach`. + // Handles raw objects in addition to array-likes. Treats all + // sparse array-likes as if they were dense. + _.each = _.forEach = function(obj, iteratee, context) { + iteratee = optimizeCb(iteratee, context); + var i, length; + if (isArrayLike(obj)) { + for (i = 0, length = obj.length; i < length; i++) { + iteratee(obj[i], i, obj); + } + } else { + var keys = _.keys(obj); + for (i = 0, length = keys.length; i < length; i++) { + iteratee(obj[keys[i]], keys[i], obj); + } + } + return obj; + }; + + // Return the results of applying the iteratee to each element. + _.map = _.collect = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + results = Array(length); + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + results[index] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Create a reducing function iterating left or right. + function createReduce(dir) { + // Optimized iterator function as using arguments.length + // in the main function will deoptimize the, see #1991. + function iterator(obj, iteratee, memo, keys, index, length) { + for (; index >= 0 && index < length; index += dir) { + var currentKey = keys ? keys[index] : index; + memo = iteratee(memo, obj[currentKey], currentKey, obj); + } + return memo; + } + + return function(obj, iteratee, memo, context) { + iteratee = optimizeCb(iteratee, context, 4); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length, + index = dir > 0 ? 0 : length - 1; + // Determine the initial value if none is provided. + if (arguments.length < 3) { + memo = obj[keys ? keys[index] : index]; + index += dir; + } + return iterator(obj, iteratee, memo, keys, index, length); + }; + } + + // **Reduce** builds up a single result from a list of values, aka `inject`, + // or `foldl`. + _.reduce = _.foldl = _.inject = createReduce(1); + + // The right-associative version of reduce, also known as `foldr`. + _.reduceRight = _.foldr = createReduce(-1); + + // Return the first value which passes a truth test. Aliased as `detect`. + _.find = _.detect = function(obj, predicate, context) { + var key; + if (isArrayLike(obj)) { + key = _.findIndex(obj, predicate, context); + } else { + key = _.findKey(obj, predicate, context); + } + if (key !== void 0 && key !== -1) return obj[key]; + }; + + // Return all the elements that pass a truth test. + // Aliased as `select`. + _.filter = _.select = function(obj, predicate, context) { + var results = []; + predicate = cb(predicate, context); + _.each(obj, function(value, index, list) { + if (predicate(value, index, list)) results.push(value); + }); + return results; + }; + + // Return all the elements for which a truth test fails. + _.reject = function(obj, predicate, context) { + return _.filter(obj, _.negate(cb(predicate)), context); + }; + + // Determine whether all of the elements match a truth test. + // Aliased as `all`. + _.every = _.all = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (!predicate(obj[currentKey], currentKey, obj)) return false; + } + return true; + }; + + // Determine if at least one element in the object matches a truth test. + // Aliased as `any`. + _.some = _.any = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = !isArrayLike(obj) && _.keys(obj), + length = (keys || obj).length; + for (var index = 0; index < length; index++) { + var currentKey = keys ? keys[index] : index; + if (predicate(obj[currentKey], currentKey, obj)) return true; + } + return false; + }; + + // Determine if the array or object contains a given item (using `===`). + // Aliased as `includes` and `include`. + _.contains = _.includes = _.include = function(obj, item, fromIndex, guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + if (typeof fromIndex != 'number' || guard) fromIndex = 0; + return _.indexOf(obj, item, fromIndex) >= 0; + }; + + // Invoke a method (with arguments) on every item in a collection. + _.invoke = function(obj, method) { + var args = slice.call(arguments, 2); + var isFunc = _.isFunction(method); + return _.map(obj, function(value) { + var func = isFunc ? method : value[method]; + return func == null ? func : func.apply(value, args); + }); + }; + + // Convenience version of a common use case of `map`: fetching a property. + _.pluck = function(obj, key) { + return _.map(obj, _.property(key)); + }; + + // Convenience version of a common use case of `filter`: selecting only objects + // containing specific `key:value` pairs. + _.where = function(obj, attrs) { + return _.filter(obj, _.matcher(attrs)); + }; + + // Convenience version of a common use case of `find`: getting the first object + // containing specific `key:value` pairs. + _.findWhere = function(obj, attrs) { + return _.find(obj, _.matcher(attrs)); + }; + + // Return the maximum element (or element-based computation). + _.max = function(obj, iteratee, context) { + var result = -Infinity, lastComputed = -Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value > result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed > lastComputed || computed === -Infinity && result === -Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Return the minimum element (or element-based computation). + _.min = function(obj, iteratee, context) { + var result = Infinity, lastComputed = Infinity, + value, computed; + if (iteratee == null && obj != null) { + obj = isArrayLike(obj) ? obj : _.values(obj); + for (var i = 0, length = obj.length; i < length; i++) { + value = obj[i]; + if (value < result) { + result = value; + } + } + } else { + iteratee = cb(iteratee, context); + _.each(obj, function(value, index, list) { + computed = iteratee(value, index, list); + if (computed < lastComputed || computed === Infinity && result === Infinity) { + result = value; + lastComputed = computed; + } + }); + } + return result; + }; + + // Shuffle a collection, using the modern version of the + // [Fisher-Yates shuffle](http://en.wikipedia.org/wiki/Fisher–Yates_shuffle). + _.shuffle = function(obj) { + var set = isArrayLike(obj) ? obj : _.values(obj); + var length = set.length; + var shuffled = Array(length); + for (var index = 0, rand; index < length; index++) { + rand = _.random(0, index); + if (rand !== index) shuffled[index] = shuffled[rand]; + shuffled[rand] = set[index]; + } + return shuffled; + }; + + // Sample **n** random values from a collection. + // If **n** is not specified, returns a single random element. + // The internal `guard` argument allows it to work with `map`. + _.sample = function(obj, n, guard) { + if (n == null || guard) { + if (!isArrayLike(obj)) obj = _.values(obj); + return obj[_.random(obj.length - 1)]; + } + return _.shuffle(obj).slice(0, Math.max(0, n)); + }; + + // Sort the object's values by a criterion produced by an iteratee. + _.sortBy = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + return _.pluck(_.map(obj, function(value, index, list) { + return { + value: value, + index: index, + criteria: iteratee(value, index, list) + }; + }).sort(function(left, right) { + var a = left.criteria; + var b = right.criteria; + if (a !== b) { + if (a > b || a === void 0) return 1; + if (a < b || b === void 0) return -1; + } + return left.index - right.index; + }), 'value'); + }; + + // An internal function used for aggregate "group by" operations. + var group = function(behavior) { + return function(obj, iteratee, context) { + var result = {}; + iteratee = cb(iteratee, context); + _.each(obj, function(value, index) { + var key = iteratee(value, index, obj); + behavior(result, value, key); + }); + return result; + }; + }; + + // Groups the object's values by a criterion. Pass either a string attribute + // to group by, or a function that returns the criterion. + _.groupBy = group(function(result, value, key) { + if (_.has(result, key)) result[key].push(value); else result[key] = [value]; + }); + + // Indexes the object's values by a criterion, similar to `groupBy`, but for + // when you know that your index values will be unique. + _.indexBy = group(function(result, value, key) { + result[key] = value; + }); + + // Counts instances of an object that group by a certain criterion. Pass + // either a string attribute to count by, or a function that returns the + // criterion. + _.countBy = group(function(result, value, key) { + if (_.has(result, key)) result[key]++; else result[key] = 1; + }); + + // Safely create a real, live array from anything iterable. + _.toArray = function(obj) { + if (!obj) return []; + if (_.isArray(obj)) return slice.call(obj); + if (isArrayLike(obj)) return _.map(obj, _.identity); + return _.values(obj); + }; + + // Return the number of elements in an object. + _.size = function(obj) { + if (obj == null) return 0; + return isArrayLike(obj) ? obj.length : _.keys(obj).length; + }; + + // Split a collection into two arrays: one whose elements all satisfy the given + // predicate, and one whose elements all do not satisfy the predicate. + _.partition = function(obj, predicate, context) { + predicate = cb(predicate, context); + var pass = [], fail = []; + _.each(obj, function(value, key, obj) { + (predicate(value, key, obj) ? pass : fail).push(value); + }); + return [pass, fail]; + }; + + // Array Functions + // --------------- + + // Get the first element of an array. Passing **n** will return the first N + // values in the array. Aliased as `head` and `take`. The **guard** check + // allows it to work with `_.map`. + _.first = _.head = _.take = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[0]; + return _.initial(array, array.length - n); + }; + + // Returns everything but the last entry of the array. Especially useful on + // the arguments object. Passing **n** will return all the values in + // the array, excluding the last N. + _.initial = function(array, n, guard) { + return slice.call(array, 0, Math.max(0, array.length - (n == null || guard ? 1 : n))); + }; + + // Get the last element of an array. Passing **n** will return the last N + // values in the array. + _.last = function(array, n, guard) { + if (array == null) return void 0; + if (n == null || guard) return array[array.length - 1]; + return _.rest(array, Math.max(0, array.length - n)); + }; + + // Returns everything but the first entry of the array. Aliased as `tail` and `drop`. + // Especially useful on the arguments object. Passing an **n** will return + // the rest N values in the array. + _.rest = _.tail = _.drop = function(array, n, guard) { + return slice.call(array, n == null || guard ? 1 : n); + }; + + // Trim out all falsy values from an array. + _.compact = function(array) { + return _.filter(array, _.identity); + }; + + // Internal implementation of a recursive `flatten` function. + var flatten = function(input, shallow, strict, startIndex) { + var output = [], idx = 0; + for (var i = startIndex || 0, length = getLength(input); i < length; i++) { + var value = input[i]; + if (isArrayLike(value) && (_.isArray(value) || _.isArguments(value))) { + //flatten current level of array or arguments object + if (!shallow) value = flatten(value, shallow, strict); + var j = 0, len = value.length; + output.length += len; + while (j < len) { + output[idx++] = value[j++]; + } + } else if (!strict) { + output[idx++] = value; + } + } + return output; + }; + + // Flatten out an array, either recursively (by default), or just one level. + _.flatten = function(array, shallow) { + return flatten(array, shallow, false); + }; + + // Return a version of the array that does not contain the specified value(s). + _.without = function(array) { + return _.difference(array, slice.call(arguments, 1)); + }; + + // Produce a duplicate-free version of the array. If the array has already + // been sorted, you have the option of using a faster algorithm. + // Aliased as `unique`. + _.uniq = _.unique = function(array, isSorted, iteratee, context) { + if (!_.isBoolean(isSorted)) { + context = iteratee; + iteratee = isSorted; + isSorted = false; + } + if (iteratee != null) iteratee = cb(iteratee, context); + var result = []; + var seen = []; + for (var i = 0, length = getLength(array); i < length; i++) { + var value = array[i], + computed = iteratee ? iteratee(value, i, array) : value; + if (isSorted) { + if (!i || seen !== computed) result.push(value); + seen = computed; + } else if (iteratee) { + if (!_.contains(seen, computed)) { + seen.push(computed); + result.push(value); + } + } else if (!_.contains(result, value)) { + result.push(value); + } + } + return result; + }; + + // Produce an array that contains the union: each distinct element from all of + // the passed-in arrays. + _.union = function() { + return _.uniq(flatten(arguments, true, true)); + }; + + // Produce an array that contains every item shared between all the + // passed-in arrays. + _.intersection = function(array) { + var result = []; + var argsLength = arguments.length; + for (var i = 0, length = getLength(array); i < length; i++) { + var item = array[i]; + if (_.contains(result, item)) continue; + for (var j = 1; j < argsLength; j++) { + if (!_.contains(arguments[j], item)) break; + } + if (j === argsLength) result.push(item); + } + return result; + }; + + // Take the difference between one array and a number of other arrays. + // Only the elements present in just the first array will remain. + _.difference = function(array) { + var rest = flatten(arguments, true, true, 1); + return _.filter(array, function(value){ + return !_.contains(rest, value); + }); + }; + + // Zip together multiple lists into a single array -- elements that share + // an index go together. + _.zip = function() { + return _.unzip(arguments); + }; + + // Complement of _.zip. Unzip accepts an array of arrays and groups + // each array's elements on shared indices + _.unzip = function(array) { + var length = array && _.max(array, getLength).length || 0; + var result = Array(length); + + for (var index = 0; index < length; index++) { + result[index] = _.pluck(array, index); + } + return result; + }; + + // Converts lists into objects. Pass either a single array of `[key, value]` + // pairs, or two parallel arrays of the same length -- one of keys, and one of + // the corresponding values. + _.object = function(list, values) { + var result = {}; + for (var i = 0, length = getLength(list); i < length; i++) { + if (values) { + result[list[i]] = values[i]; + } else { + result[list[i][0]] = list[i][1]; + } + } + return result; + }; + + // Generator function to create the findIndex and findLastIndex functions + function createPredicateIndexFinder(dir) { + return function(array, predicate, context) { + predicate = cb(predicate, context); + var length = getLength(array); + var index = dir > 0 ? 0 : length - 1; + for (; index >= 0 && index < length; index += dir) { + if (predicate(array[index], index, array)) return index; + } + return -1; + }; + } + + // Returns the first index on an array-like that passes a predicate test + _.findIndex = createPredicateIndexFinder(1); + _.findLastIndex = createPredicateIndexFinder(-1); + + // Use a comparator function to figure out the smallest index at which + // an object should be inserted so as to maintain order. Uses binary search. + _.sortedIndex = function(array, obj, iteratee, context) { + iteratee = cb(iteratee, context, 1); + var value = iteratee(obj); + var low = 0, high = getLength(array); + while (low < high) { + var mid = Math.floor((low + high) / 2); + if (iteratee(array[mid]) < value) low = mid + 1; else high = mid; + } + return low; + }; + + // Generator function to create the indexOf and lastIndexOf functions + function createIndexFinder(dir, predicateFind, sortedIndex) { + return function(array, item, idx) { + var i = 0, length = getLength(array); + if (typeof idx == 'number') { + if (dir > 0) { + i = idx >= 0 ? idx : Math.max(idx + length, i); + } else { + length = idx >= 0 ? Math.min(idx + 1, length) : idx + length + 1; + } + } else if (sortedIndex && idx && length) { + idx = sortedIndex(array, item); + return array[idx] === item ? idx : -1; + } + if (item !== item) { + idx = predicateFind(slice.call(array, i, length), _.isNaN); + return idx >= 0 ? idx + i : -1; + } + for (idx = dir > 0 ? i : length - 1; idx >= 0 && idx < length; idx += dir) { + if (array[idx] === item) return idx; + } + return -1; + }; + } + + // Return the position of the first occurrence of an item in an array, + // or -1 if the item is not included in the array. + // If the array is large and already in sort order, pass `true` + // for **isSorted** to use binary search. + _.indexOf = createIndexFinder(1, _.findIndex, _.sortedIndex); + _.lastIndexOf = createIndexFinder(-1, _.findLastIndex); + + // Generate an integer Array containing an arithmetic progression. A port of + // the native Python `range()` function. See + // [the Python documentation](http://docs.python.org/library/functions.html#range). + _.range = function(start, stop, step) { + if (stop == null) { + stop = start || 0; + start = 0; + } + step = step || 1; + + var length = Math.max(Math.ceil((stop - start) / step), 0); + var range = Array(length); + + for (var idx = 0; idx < length; idx++, start += step) { + range[idx] = start; + } + + return range; + }; + + // Function (ahem) Functions + // ------------------ + + // Determines whether to execute a function as a constructor + // or a normal function with the provided arguments + var executeBound = function(sourceFunc, boundFunc, context, callingContext, args) { + if (!(callingContext instanceof boundFunc)) return sourceFunc.apply(context, args); + var self = baseCreate(sourceFunc.prototype); + var result = sourceFunc.apply(self, args); + if (_.isObject(result)) return result; + return self; + }; + + // Create a function bound to a given object (assigning `this`, and arguments, + // optionally). Delegates to **ECMAScript 5**'s native `Function.bind` if + // available. + _.bind = function(func, context) { + if (nativeBind && func.bind === nativeBind) return nativeBind.apply(func, slice.call(arguments, 1)); + if (!_.isFunction(func)) throw new TypeError('Bind must be called on a function'); + var args = slice.call(arguments, 2); + var bound = function() { + return executeBound(func, bound, context, this, args.concat(slice.call(arguments))); + }; + return bound; + }; + + // Partially apply a function by creating a version that has had some of its + // arguments pre-filled, without changing its dynamic `this` context. _ acts + // as a placeholder, allowing any combination of arguments to be pre-filled. + _.partial = function(func) { + var boundArgs = slice.call(arguments, 1); + var bound = function() { + var position = 0, length = boundArgs.length; + var args = Array(length); + for (var i = 0; i < length; i++) { + args[i] = boundArgs[i] === _ ? arguments[position++] : boundArgs[i]; + } + while (position < arguments.length) args.push(arguments[position++]); + return executeBound(func, bound, this, this, args); + }; + return bound; + }; + + // Bind a number of an object's methods to that object. Remaining arguments + // are the method names to be bound. Useful for ensuring that all callbacks + // defined on an object belong to it. + _.bindAll = function(obj) { + var i, length = arguments.length, key; + if (length <= 1) throw new Error('bindAll must be passed function names'); + for (i = 1; i < length; i++) { + key = arguments[i]; + obj[key] = _.bind(obj[key], obj); + } + return obj; + }; + + // Memoize an expensive function by storing its results. + _.memoize = function(func, hasher) { + var memoize = function(key) { + var cache = memoize.cache; + var address = '' + (hasher ? hasher.apply(this, arguments) : key); + if (!_.has(cache, address)) cache[address] = func.apply(this, arguments); + return cache[address]; + }; + memoize.cache = {}; + return memoize; + }; + + // Delays a function for the given number of milliseconds, and then calls + // it with the arguments supplied. + _.delay = function(func, wait) { + var args = slice.call(arguments, 2); + return setTimeout(function(){ + return func.apply(null, args); + }, wait); + }; + + // Defers a function, scheduling it to run after the current call stack has + // cleared. + _.defer = _.partial(_.delay, _, 1); + + // Returns a function, that, when invoked, will only be triggered at most once + // during a given window of time. Normally, the throttled function will run + // as much as it can, without ever going more than once per `wait` duration; + // but if you'd like to disable the execution on the leading edge, pass + // `{leading: false}`. To disable execution on the trailing edge, ditto. + _.throttle = function(func, wait, options) { + var context, args, result; + var timeout = null; + var previous = 0; + if (!options) options = {}; + var later = function() { + previous = options.leading === false ? 0 : _.now(); + timeout = null; + result = func.apply(context, args); + if (!timeout) context = args = null; + }; + return function() { + var now = _.now(); + if (!previous && options.leading === false) previous = now; + var remaining = wait - (now - previous); + context = this; + args = arguments; + if (remaining <= 0 || remaining > wait) { + if (timeout) { + clearTimeout(timeout); + timeout = null; + } + previous = now; + result = func.apply(context, args); + if (!timeout) context = args = null; + } else if (!timeout && options.trailing !== false) { + timeout = setTimeout(later, remaining); + } + return result; + }; + }; + + // Returns a function, that, as long as it continues to be invoked, will not + // be triggered. The function will be called after it stops being called for + // N milliseconds. If `immediate` is passed, trigger the function on the + // leading edge, instead of the trailing. + _.debounce = function(func, wait, immediate) { + var timeout, args, context, timestamp, result; + + var later = function() { + var last = _.now() - timestamp; + + if (last < wait && last >= 0) { + timeout = setTimeout(later, wait - last); + } else { + timeout = null; + if (!immediate) { + result = func.apply(context, args); + if (!timeout) context = args = null; + } + } + }; + + return function() { + context = this; + args = arguments; + timestamp = _.now(); + var callNow = immediate && !timeout; + if (!timeout) timeout = setTimeout(later, wait); + if (callNow) { + result = func.apply(context, args); + context = args = null; + } + + return result; + }; + }; + + // Returns the first function passed as an argument to the second, + // allowing you to adjust arguments, run code before and after, and + // conditionally execute the original function. + _.wrap = function(func, wrapper) { + return _.partial(wrapper, func); + }; + + // Returns a negated version of the passed-in predicate. + _.negate = function(predicate) { + return function() { + return !predicate.apply(this, arguments); + }; + }; + + // Returns a function that is the composition of a list of functions, each + // consuming the return value of the function that follows. + _.compose = function() { + var args = arguments; + var start = args.length - 1; + return function() { + var i = start; + var result = args[start].apply(this, arguments); + while (i--) result = args[i].call(this, result); + return result; + }; + }; + + // Returns a function that will only be executed on and after the Nth call. + _.after = function(times, func) { + return function() { + if (--times < 1) { + return func.apply(this, arguments); + } + }; + }; + + // Returns a function that will only be executed up to (but not including) the Nth call. + _.before = function(times, func) { + var memo; + return function() { + if (--times > 0) { + memo = func.apply(this, arguments); + } + if (times <= 1) func = null; + return memo; + }; + }; + + // Returns a function that will be executed at most one time, no matter how + // often you call it. Useful for lazy initialization. + _.once = _.partial(_.before, 2); + + // Object Functions + // ---------------- + + // Keys in IE < 9 that won't be iterated by `for key in ...` and thus missed. + var hasEnumBug = !{toString: null}.propertyIsEnumerable('toString'); + var nonEnumerableProps = ['valueOf', 'isPrototypeOf', 'toString', + 'propertyIsEnumerable', 'hasOwnProperty', 'toLocaleString']; + + function collectNonEnumProps(obj, keys) { + var nonEnumIdx = nonEnumerableProps.length; + var constructor = obj.constructor; + var proto = (_.isFunction(constructor) && constructor.prototype) || ObjProto; + + // Constructor is a special case. + var prop = 'constructor'; + if (_.has(obj, prop) && !_.contains(keys, prop)) keys.push(prop); + + while (nonEnumIdx--) { + prop = nonEnumerableProps[nonEnumIdx]; + if (prop in obj && obj[prop] !== proto[prop] && !_.contains(keys, prop)) { + keys.push(prop); + } + } + } + + // Retrieve the names of an object's own properties. + // Delegates to **ECMAScript 5**'s native `Object.keys` + _.keys = function(obj) { + if (!_.isObject(obj)) return []; + if (nativeKeys) return nativeKeys(obj); + var keys = []; + for (var key in obj) if (_.has(obj, key)) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve all the property names of an object. + _.allKeys = function(obj) { + if (!_.isObject(obj)) return []; + var keys = []; + for (var key in obj) keys.push(key); + // Ahem, IE < 9. + if (hasEnumBug) collectNonEnumProps(obj, keys); + return keys; + }; + + // Retrieve the values of an object's properties. + _.values = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var values = Array(length); + for (var i = 0; i < length; i++) { + values[i] = obj[keys[i]]; + } + return values; + }; + + // Returns the results of applying the iteratee to each element of the object + // In contrast to _.map it returns an object + _.mapObject = function(obj, iteratee, context) { + iteratee = cb(iteratee, context); + var keys = _.keys(obj), + length = keys.length, + results = {}, + currentKey; + for (var index = 0; index < length; index++) { + currentKey = keys[index]; + results[currentKey] = iteratee(obj[currentKey], currentKey, obj); + } + return results; + }; + + // Convert an object into a list of `[key, value]` pairs. + _.pairs = function(obj) { + var keys = _.keys(obj); + var length = keys.length; + var pairs = Array(length); + for (var i = 0; i < length; i++) { + pairs[i] = [keys[i], obj[keys[i]]]; + } + return pairs; + }; + + // Invert the keys and values of an object. The values must be serializable. + _.invert = function(obj) { + var result = {}; + var keys = _.keys(obj); + for (var i = 0, length = keys.length; i < length; i++) { + result[obj[keys[i]]] = keys[i]; + } + return result; + }; + + // Return a sorted list of the function names available on the object. + // Aliased as `methods` + _.functions = _.methods = function(obj) { + var names = []; + for (var key in obj) { + if (_.isFunction(obj[key])) names.push(key); + } + return names.sort(); + }; + + // Extend a given object with all the properties in passed-in object(s). + _.extend = createAssigner(_.allKeys); + + // Assigns a given object with all the own properties in the passed-in object(s) + // (https://developer.mozilla.org/docs/Web/JavaScript/Reference/Global_Objects/Object/assign) + _.extendOwn = _.assign = createAssigner(_.keys); + + // Returns the first key on an object that passes a predicate test + _.findKey = function(obj, predicate, context) { + predicate = cb(predicate, context); + var keys = _.keys(obj), key; + for (var i = 0, length = keys.length; i < length; i++) { + key = keys[i]; + if (predicate(obj[key], key, obj)) return key; + } + }; + + // Return a copy of the object only containing the whitelisted properties. + _.pick = function(object, oiteratee, context) { + var result = {}, obj = object, iteratee, keys; + if (obj == null) return result; + if (_.isFunction(oiteratee)) { + keys = _.allKeys(obj); + iteratee = optimizeCb(oiteratee, context); + } else { + keys = flatten(arguments, false, false, 1); + iteratee = function(value, key, obj) { return key in obj; }; + obj = Object(obj); + } + for (var i = 0, length = keys.length; i < length; i++) { + var key = keys[i]; + var value = obj[key]; + if (iteratee(value, key, obj)) result[key] = value; + } + return result; + }; + + // Return a copy of the object without the blacklisted properties. + _.omit = function(obj, iteratee, context) { + if (_.isFunction(iteratee)) { + iteratee = _.negate(iteratee); + } else { + var keys = _.map(flatten(arguments, false, false, 1), String); + iteratee = function(value, key) { + return !_.contains(keys, key); + }; + } + return _.pick(obj, iteratee, context); + }; + + // Fill in a given object with default properties. + _.defaults = createAssigner(_.allKeys, true); + + // Creates an object that inherits from the given prototype object. + // If additional properties are provided then they will be added to the + // created object. + _.create = function(prototype, props) { + var result = baseCreate(prototype); + if (props) _.extendOwn(result, props); + return result; + }; + + // Create a (shallow-cloned) duplicate of an object. + _.clone = function(obj) { + if (!_.isObject(obj)) return obj; + return _.isArray(obj) ? obj.slice() : _.extend({}, obj); + }; + + // Invokes interceptor with the obj, and then returns obj. + // The primary purpose of this method is to "tap into" a method chain, in + // order to perform operations on intermediate results within the chain. + _.tap = function(obj, interceptor) { + interceptor(obj); + return obj; + }; + + // Returns whether an object has a given set of `key:value` pairs. + _.isMatch = function(object, attrs) { + var keys = _.keys(attrs), length = keys.length; + if (object == null) return !length; + var obj = Object(object); + for (var i = 0; i < length; i++) { + var key = keys[i]; + if (attrs[key] !== obj[key] || !(key in obj)) return false; + } + return true; + }; + + + // Internal recursive comparison function for `isEqual`. + var eq = function(a, b, aStack, bStack) { + // Identical objects are equal. `0 === -0`, but they aren't identical. + // See the [Harmony `egal` proposal](http://wiki.ecmascript.org/doku.php?id=harmony:egal). + if (a === b) return a !== 0 || 1 / a === 1 / b; + // A strict comparison is necessary because `null == undefined`. + if (a == null || b == null) return a === b; + // Unwrap any wrapped objects. + if (a instanceof _) a = a._wrapped; + if (b instanceof _) b = b._wrapped; + // Compare `[[Class]]` names. + var className = toString.call(a); + if (className !== toString.call(b)) return false; + switch (className) { + // Strings, numbers, regular expressions, dates, and booleans are compared by value. + case '[object RegExp]': + // RegExps are coerced to strings for comparison (Note: '' + /a/i === '/a/i') + case '[object String]': + // Primitives and their corresponding object wrappers are equivalent; thus, `"5"` is + // equivalent to `new String("5")`. + return '' + a === '' + b; + case '[object Number]': + // `NaN`s are equivalent, but non-reflexive. + // Object(NaN) is equivalent to NaN + if (+a !== +a) return +b !== +b; + // An `egal` comparison is performed for other numeric values. + return +a === 0 ? 1 / +a === 1 / b : +a === +b; + case '[object Date]': + case '[object Boolean]': + // Coerce dates and booleans to numeric primitive values. Dates are compared by their + // millisecond representations. Note that invalid dates with millisecond representations + // of `NaN` are not equivalent. + return +a === +b; + } + + var areArrays = className === '[object Array]'; + if (!areArrays) { + if (typeof a != 'object' || typeof b != 'object') return false; + + // Objects with different constructors are not equivalent, but `Object`s or `Array`s + // from different frames are. + var aCtor = a.constructor, bCtor = b.constructor; + if (aCtor !== bCtor && !(_.isFunction(aCtor) && aCtor instanceof aCtor && + _.isFunction(bCtor) && bCtor instanceof bCtor) + && ('constructor' in a && 'constructor' in b)) { + return false; + } + } + // Assume equality for cyclic structures. The algorithm for detecting cyclic + // structures is adapted from ES 5.1 section 15.12.3, abstract operation `JO`. + + // Initializing stack of traversed objects. + // It's done here since we only need them for objects and arrays comparison. + aStack = aStack || []; + bStack = bStack || []; + var length = aStack.length; + while (length--) { + // Linear search. Performance is inversely proportional to the number of + // unique nested structures. + if (aStack[length] === a) return bStack[length] === b; + } + + // Add the first object to the stack of traversed objects. + aStack.push(a); + bStack.push(b); + + // Recursively compare objects and arrays. + if (areArrays) { + // Compare array lengths to determine if a deep comparison is necessary. + length = a.length; + if (length !== b.length) return false; + // Deep compare the contents, ignoring non-numeric properties. + while (length--) { + if (!eq(a[length], b[length], aStack, bStack)) return false; + } + } else { + // Deep compare objects. + var keys = _.keys(a), key; + length = keys.length; + // Ensure that both objects contain the same number of properties before comparing deep equality. + if (_.keys(b).length !== length) return false; + while (length--) { + // Deep compare each member + key = keys[length]; + if (!(_.has(b, key) && eq(a[key], b[key], aStack, bStack))) return false; + } + } + // Remove the first object from the stack of traversed objects. + aStack.pop(); + bStack.pop(); + return true; + }; + + // Perform a deep comparison to check if two objects are equal. + _.isEqual = function(a, b) { + return eq(a, b); + }; + + // Is a given array, string, or object empty? + // An "empty" object has no enumerable own-properties. + _.isEmpty = function(obj) { + if (obj == null) return true; + if (isArrayLike(obj) && (_.isArray(obj) || _.isString(obj) || _.isArguments(obj))) return obj.length === 0; + return _.keys(obj).length === 0; + }; + + // Is a given value a DOM element? + _.isElement = function(obj) { + return !!(obj && obj.nodeType === 1); + }; + + // Is a given value an array? + // Delegates to ECMA5's native Array.isArray + _.isArray = nativeIsArray || function(obj) { + return toString.call(obj) === '[object Array]'; + }; + + // Is a given variable an object? + _.isObject = function(obj) { + var type = typeof obj; + return type === 'function' || type === 'object' && !!obj; + }; + + // Add some isType methods: isArguments, isFunction, isString, isNumber, isDate, isRegExp, isError. + _.each(['Arguments', 'Function', 'String', 'Number', 'Date', 'RegExp', 'Error'], function(name) { + _['is' + name] = function(obj) { + return toString.call(obj) === '[object ' + name + ']'; + }; + }); + + // Define a fallback version of the method in browsers (ahem, IE < 9), where + // there isn't any inspectable "Arguments" type. + if (!_.isArguments(arguments)) { + _.isArguments = function(obj) { + return _.has(obj, 'callee'); + }; + } + + // Optimize `isFunction` if appropriate. Work around some typeof bugs in old v8, + // IE 11 (#1621), and in Safari 8 (#1929). + if (typeof /./ != 'function' && typeof Int8Array != 'object') { + _.isFunction = function(obj) { + return typeof obj == 'function' || false; + }; + } + + // Is a given object a finite number? + _.isFinite = function(obj) { + return isFinite(obj) && !isNaN(parseFloat(obj)); + }; + + // Is the given value `NaN`? (NaN is the only number which does not equal itself). + _.isNaN = function(obj) { + return _.isNumber(obj) && obj !== +obj; + }; + + // Is a given value a boolean? + _.isBoolean = function(obj) { + return obj === true || obj === false || toString.call(obj) === '[object Boolean]'; + }; + + // Is a given value equal to null? + _.isNull = function(obj) { + return obj === null; + }; + + // Is a given variable undefined? + _.isUndefined = function(obj) { + return obj === void 0; + }; + + // Shortcut function for checking if an object has a given property directly + // on itself (in other words, not on a prototype). + _.has = function(obj, key) { + return obj != null && hasOwnProperty.call(obj, key); + }; + + // Utility Functions + // ----------------- + + // Run Underscore.js in *noConflict* mode, returning the `_` variable to its + // previous owner. Returns a reference to the Underscore object. + _.noConflict = function() { + root._ = previousUnderscore; + return this; + }; + + // Keep the identity function around for default iteratees. + _.identity = function(value) { + return value; + }; + + // Predicate-generating functions. Often useful outside of Underscore. + _.constant = function(value) { + return function() { + return value; + }; + }; + + _.noop = function(){}; + + _.property = property; + + // Generates a function for a given object that returns a given property. + _.propertyOf = function(obj) { + return obj == null ? function(){} : function(key) { + return obj[key]; + }; + }; + + // Returns a predicate for checking whether an object has a given set of + // `key:value` pairs. + _.matcher = _.matches = function(attrs) { + attrs = _.extendOwn({}, attrs); + return function(obj) { + return _.isMatch(obj, attrs); + }; + }; + + // Run a function **n** times. + _.times = function(n, iteratee, context) { + var accum = Array(Math.max(0, n)); + iteratee = optimizeCb(iteratee, context, 1); + for (var i = 0; i < n; i++) accum[i] = iteratee(i); + return accum; + }; + + // Return a random integer between min and max (inclusive). + _.random = function(min, max) { + if (max == null) { + max = min; + min = 0; + } + return min + Math.floor(Math.random() * (max - min + 1)); + }; + + // A (possibly faster) way to get the current timestamp as an integer. + _.now = Date.now || function() { + return new Date().getTime(); + }; + + // List of HTML entities for escaping. + var escapeMap = { + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + '`': '`' + }; + var unescapeMap = _.invert(escapeMap); + + // Functions for escaping and unescaping strings to/from HTML interpolation. + var createEscaper = function(map) { + var escaper = function(match) { + return map[match]; + }; + // Regexes for identifying a key that needs to be escaped + var source = '(?:' + _.keys(map).join('|') + ')'; + var testRegexp = RegExp(source); + var replaceRegexp = RegExp(source, 'g'); + return function(string) { + string = string == null ? '' : '' + string; + return testRegexp.test(string) ? string.replace(replaceRegexp, escaper) : string; + }; + }; + _.escape = createEscaper(escapeMap); + _.unescape = createEscaper(unescapeMap); + + // If the value of the named `property` is a function then invoke it with the + // `object` as context; otherwise, return it. + _.result = function(object, property, fallback) { + var value = object == null ? void 0 : object[property]; + if (value === void 0) { + value = fallback; + } + return _.isFunction(value) ? value.call(object) : value; + }; + + // Generate a unique integer id (unique within the entire client session). + // Useful for temporary DOM ids. + var idCounter = 0; + _.uniqueId = function(prefix) { + var id = ++idCounter + ''; + return prefix ? prefix + id : id; + }; + + // By default, Underscore uses ERB-style template delimiters, change the + // following template settings to use alternative delimiters. + _.templateSettings = { + evaluate : /<%([\s\S]+?)%>/g, + interpolate : /<%=([\s\S]+?)%>/g, + escape : /<%-([\s\S]+?)%>/g + }; + + // When customizing `templateSettings`, if you don't want to define an + // interpolation, evaluation or escaping regex, we need one that is + // guaranteed not to match. + var noMatch = /(.)^/; + + // Certain characters need to be escaped so that they can be put into a + // string literal. + var escapes = { + "'": "'", + '\\': '\\', + '\r': 'r', + '\n': 'n', + '\u2028': 'u2028', + '\u2029': 'u2029' + }; + + var escaper = /\\|'|\r|\n|\u2028|\u2029/g; + + var escapeChar = function(match) { + return '\\' + escapes[match]; + }; + + // JavaScript micro-templating, similar to John Resig's implementation. + // Underscore templating handles arbitrary delimiters, preserves whitespace, + // and correctly escapes quotes within interpolated code. + // NB: `oldSettings` only exists for backwards compatibility. + _.template = function(text, settings, oldSettings) { + if (!settings && oldSettings) settings = oldSettings; + settings = _.defaults({}, settings, _.templateSettings); + + // Combine delimiters into one regular expression via alternation. + var matcher = RegExp([ + (settings.escape || noMatch).source, + (settings.interpolate || noMatch).source, + (settings.evaluate || noMatch).source + ].join('|') + '|$', 'g'); + + // Compile the template source, escaping string literals appropriately. + var index = 0; + var source = "__p+='"; + text.replace(matcher, function(match, escape, interpolate, evaluate, offset) { + source += text.slice(index, offset).replace(escaper, escapeChar); + index = offset + match.length; + + if (escape) { + source += "'+\n((__t=(" + escape + "))==null?'':_.escape(__t))+\n'"; + } else if (interpolate) { + source += "'+\n((__t=(" + interpolate + "))==null?'':__t)+\n'"; + } else if (evaluate) { + source += "';\n" + evaluate + "\n__p+='"; + } + + // Adobe VMs need the match returned to produce the correct offest. + return match; + }); + source += "';\n"; + + // If a variable is not specified, place data values in local scope. + if (!settings.variable) source = 'with(obj||{}){\n' + source + '}\n'; + + source = "var __t,__p='',__j=Array.prototype.join," + + "print=function(){__p+=__j.call(arguments,'');};\n" + + source + 'return __p;\n'; + + try { + var render = new Function(settings.variable || 'obj', '_', source); + } catch (e) { + e.source = source; + throw e; + } + + var template = function(data) { + return render.call(this, data, _); + }; + + // Provide the compiled source as a convenience for precompilation. + var argument = settings.variable || 'obj'; + template.source = 'function(' + argument + '){\n' + source + '}'; + + return template; + }; + + // Add a "chain" function. Start chaining a wrapped Underscore object. + _.chain = function(obj) { + var instance = _(obj); + instance._chain = true; + return instance; + }; + + // OOP + // --------------- + // If Underscore is called as a function, it returns a wrapped object that + // can be used OO-style. This wrapper holds altered versions of all the + // underscore functions. Wrapped objects may be chained. + + // Helper function to continue chaining intermediate results. + var result = function(instance, obj) { + return instance._chain ? _(obj).chain() : obj; + }; + + // Add your own custom functions to the Underscore object. + _.mixin = function(obj) { + _.each(_.functions(obj), function(name) { + var func = _[name] = obj[name]; + _.prototype[name] = function() { + var args = [this._wrapped]; + push.apply(args, arguments); + return result(this, func.apply(_, args)); + }; + }); + }; + + // Add all of the Underscore functions to the wrapper object. + _.mixin(_); + + // Add all mutator Array functions to the wrapper. + _.each(['pop', 'push', 'reverse', 'shift', 'sort', 'splice', 'unshift'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + var obj = this._wrapped; + method.apply(obj, arguments); + if ((name === 'shift' || name === 'splice') && obj.length === 0) delete obj[0]; + return result(this, obj); + }; + }); + + // Add all accessor Array functions to the wrapper. + _.each(['concat', 'join', 'slice'], function(name) { + var method = ArrayProto[name]; + _.prototype[name] = function() { + return result(this, method.apply(this._wrapped, arguments)); + }; + }); + + // Extracts the result from a wrapped and chained object. + _.prototype.value = function() { + return this._wrapped; + }; + + // Provide unwrapping proxy for some methods used in engine operations + // such as arithmetic and JSON stringification. + _.prototype.valueOf = _.prototype.toJSON = _.prototype.value; + + _.prototype.toString = function() { + return '' + this._wrapped; + }; + + // AMD registration happens at the end for compatibility with AMD loaders + // that may not enforce next-turn semantics on modules. Even though general + // practice for AMD registration is to be anonymous, underscore registers + // as a named module because, like jQuery, it is a base library that is + // popular enough to be bundled in a third party lib, but not be part of + // an AMD load request. Those cases could generate an error when an + // anonymous define() is called outside of a loader request. + if (typeof define === 'function' && define.amd) { + define('underscore', [], function() { + return _; + }); + } +}.call(this)); + +},{}],23:[function(require,module,exports){ +// calc.js +// measure calculations + +var _ = require('underscore'); +var geocrunch = require('geocrunch'); + +var pad = function (num) { + return num < 10 ? '0' + num.toString() : num.toString(); +}; + +var ddToDms = function (coordinate, posSymbol, negSymbol) { + var dd = Math.abs(coordinate), + d = Math.floor(dd), + m = Math.floor((dd - d) * 60), + s = Math.round((dd - d - (m/60)) * 3600 * 100)/100, + directionSymbol = dd === coordinate ? posSymbol : negSymbol; + return pad(d) + '° ' + pad(m) + '\' ' + pad(s) + '" ' + directionSymbol; +}; + +var measure = function (latlngs) { + var last = _.last(latlngs); + var path = geocrunch.path(_.map(latlngs, function (latlng) { + return [latlng.lng, latlng.lat]; + })); + + var meters = path.distance({ + units: 'meters' + }); + var sqMeters = path.area({ + units: 'sqmeters' + }); + + return { + lastCoord: { + dd: { + x: last.lng, + y: last.lat + }, + dms: { + x: ddToDms(last.lng, 'E', 'W'), + y: ddToDms(last.lat, 'N', 'S') + } + }, + length: meters, + area: sqMeters + }; +}; + +module.exports = { + measure: measure // `measure(latLngArray)` - returns object with calced measurements for passed points +}; +},{"geocrunch":7,"underscore":22}],24:[function(require,module,exports){ +// dom.js +// utility functions for managing DOM elements + +var selectOne = function (selector, el) { + if (!el) { + el = document; + } + return el.querySelector(selector); +}; + +var selectAll = function (selector, el) { + if (!el) { + el = document; + } + return Array.prototype.slice.call(el.querySelectorAll(selector)); +}; + +var hide = function (el) { + if (el) { + el.setAttribute('style', 'display:none;'); + return el; + } +}; + +var show = function (el) { + if (el) { + el.removeAttribute('style'); + return el; + } +}; + +module.exports = { + $: selectOne, // `$('.myclass', baseElement)` - returns selected element or undefined + $$: selectAll, // `$$('.myclass', baseElement)` - returns array of selected elements + hide: hide, // `hide(someElement)` - hide passed dom element + show: show // `show(someElement)` - show passed dom element +}; +},{}],25:[function(require,module,exports){ +// ca.js +// Catalan i18n translations + +module.exports = { + 'measure': 'Medir', + 'measureDistancesAndAreas': 'Medeix distancies i àreas', + 'createNewMeasurement': 'Crear nova medicio', + 'startCreating': 'Començi a crear la medicio afegint punts al mapa', + 'finishMeasurement': 'Acabar la medició', + 'lastPoint': 'Últim punt', + 'area': 'Área', + 'perimeter': 'Perómetre', + 'pointLocation': 'Localizació del punt', + 'areaMeasurement': 'Medició d\'área', + 'linearMeasurement': 'Medició lineal', + 'pathDistance': 'Distancia de ruta', + 'centerOnArea': 'Centrar en aquesta área', + 'centerOnLine': 'Centrar en aquesta línia', + 'centerOnLocation': 'Centrar en aquesta localizació', + 'cancel': 'Cancel·lar', + 'delete': 'Eliminar', + 'acres': 'Acres', + 'feet': 'Peus', + 'kilometers': 'Quilòmetres', + 'hectares': 'Hectàreas', + 'meters': 'Metros', + 'miles': 'Milles', + 'sqfeet': 'Peus cuadrats', + 'sqmeters': 'Metres cuadrats', + 'sqmiles': 'Milles cuadrades', + 'decPoint': '.', + 'thousandsSep': ' ' +}; + +},{}],26:[function(require,module,exports){ +// cn.js +// Chinese i18n translations + +module.exports = { + 'measure': '测量', + 'measureDistancesAndAreas': '同时测量距离和面积', + 'createNewMeasurement': '开始一次新的测量', + 'startCreating': '点击地图加点以开始创建测量', + 'finishMeasurement': '完成测量', + 'lastPoint': '最后点的坐标', + 'area': '面积', + 'perimeter': '周长', + 'pointLocation': '点的坐标', + 'areaMeasurement': '面积测量', + 'linearMeasurement': '距离测量', + 'pathDistance': '路径长度', + 'centerOnArea': '该面积居中', + 'centerOnLine': '该线段居中', + 'centerOnLocation': '该位置居中', + 'cancel': '取消', + 'delete': '删除', + 'acres': '公亩', + 'feet': '英尺', + 'kilometers': '公里', + 'hectares': '公顷', + 'meters': '米', + 'miles': '英里', + 'sqfeet': '平方英尺', + 'sqmeters': '平方米', + 'sqmiles': '平方英里', + 'decPoint': '.', + 'thousandsSep': ',' +}; + +},{}],27:[function(require,module,exports){ +// da.js +// Danish i18n translations + +module.exports = { + 'measure': 'Mål', + 'measureDistancesAndAreas': 'Mål afstande og arealer', + 'createNewMeasurement': 'Lav en ny måling', + 'startCreating': 'Begynd målingen ved at tilføje punkter på kortet', + 'finishMeasurement': 'Afslut måling', + 'lastPoint': 'Sidste punkt', + 'area': 'Areal', + 'perimeter': 'Omkreds', + 'pointLocation': 'Punkt', + 'areaMeasurement': 'Areal', + 'linearMeasurement': 'Linje', + 'pathDistance': 'Sti afstand', + 'centerOnArea': 'Centrér dette område', + 'centerOnLine': 'Centrér denne linje', + 'centerOnLocation': 'Centrér dette punkt', + 'cancel': 'Annuller', + 'delete': 'Slet', + 'acres': 'acre', + 'feet': 'fod', + 'kilometers': 'km', + 'hectares': 'ha', + 'meters': 'm', + 'miles': 'mil', + 'sqfeet': 'kvadratfod', + 'sqmeters': 'm²', + 'sqmiles': 'kvadratmil', + 'decPoint': ',', + 'thousandsSep': '.' +}; + +},{}],28:[function(require,module,exports){ +// de.js +// German i18n translations + +module.exports = { + 'measure': 'Messung', + 'measureDistancesAndAreas': 'Messung von Abständen und Flächen', + 'createNewMeasurement': 'Eine neue Messung durchführen', + 'startCreating': 'Führen Sie die Messung durch, indem Sie der Karte Punkte hinzufügen.', + 'finishMeasurement': 'Messung beenden', + 'lastPoint': 'Letzter Punkt', + 'area': 'Fläche', + 'perimeter': 'Rand', + 'pointLocation': 'Lage des Punkts', + 'areaMeasurement': 'Gemessene Fläche', + 'linearMeasurement': 'Gemessener Abstand', + 'pathDistance': 'Abstand entlang des Pfads', + 'centerOnArea': 'Auf diese Fläche zentrieren', + 'centerOnLine': 'Auf diesen Linienzug zentrieren', + 'centerOnLocation': 'Auf diesen Ort zentrieren', + 'cancel': 'Abbrechen', + 'delete': 'Löschen', + 'acres': 'Morgen', + 'feet': 'Fuß', + 'kilometers': 'Kilometer', + 'hectares': 'Hektar', + 'meters': 'Meter', + 'miles': 'Meilen', + 'sqfeet': 'Quadratfuß', + 'sqmeters': 'Quadratmeter', + 'sqmiles': 'Quadratmeilen', + 'decPoint': ',', + 'thousandsSep': '.' +}; + +},{}],29:[function(require,module,exports){ +// de.js +// German i18n translations + +module.exports = { + 'measure': 'Messung', + 'measureDistancesAndAreas': 'Abstände und Flächen messen', + 'createNewMeasurement': 'Eine neue Messung durchführen', + 'startCreating': 'Messen sie, indem Sie der Karte Punkte hinzufügen', + 'finishMeasurement': 'Messung beenden', + 'lastPoint': 'Letzter Punkt', + 'area': 'Fläche', + 'perimeter': 'Umfang', + 'pointLocation': 'Lage des Punkts', + 'areaMeasurement': 'Fläche', + 'linearMeasurement': 'Abstand', + 'pathDistance': 'Umfang', + 'centerOnArea': 'Auf diese Fläche zentrieren', + 'centerOnLine': 'Auf diese Linie zentrieren', + 'centerOnLocation': 'Auf diesen Ort zentrieren', + 'cancel': 'Abbrechen', + 'delete': 'Löschen', + 'acres': 'Morgen', + 'feet': 'Fuß', + 'kilometers': 'Kilometer', + 'hectares': 'Hektar', + 'meters': 'Meter', + 'miles': 'Meilen', + 'sqfeet': 'Quadratfuß', + 'sqmeters': 'Quadratmeter', + 'sqmiles': 'Quadratmeilen', + 'decPoint': '.', + 'thousandsSep': '\'' +}; + +},{}],30:[function(require,module,exports){ +// en.js +// English i18n translations + +module.exports = { + 'measure': 'Measure', + 'measureDistancesAndAreas': 'Measure distances and areas', + 'createNewMeasurement': 'Create a new measurement', + 'startCreating': 'Start creating a measurement by adding points to the map', + 'finishMeasurement': 'Finish measurement', + 'lastPoint': 'Last point', + 'area': 'Area', + 'perimeter': 'Perimeter', + 'pointLocation': 'Point location', + 'areaMeasurement': 'Area measurement', + 'linearMeasurement': 'Linear measurement', + 'pathDistance': 'Path distance', + 'centerOnArea': 'Center on this area', + 'centerOnLine': 'Center on this line', + 'centerOnLocation': 'Center on this location', + 'cancel': 'Cancel', + 'delete': 'Delete', + 'acres': 'Acres', + 'feet': 'Feet', + 'kilometers': 'Kilometers', + 'hectares': 'Hectares', + 'meters': 'Meters', + 'miles': 'Miles', + 'sqfeet': 'Sq Feet', + 'sqmeters': 'Sq Meters', + 'sqmiles': 'Sq Miles', + 'decPoint': '.', + 'thousandsSep': ',' +}; + +},{}],31:[function(require,module,exports){ +// en_UK.js +// British English i18n translations + +module.exports = { + 'measure': 'Measure', + 'measureDistancesAndAreas': 'Measure distances and areas', + 'createNewMeasurement': 'Create a new measurement', + 'startCreating': 'Start creating a measurement by adding points to the map', + 'finishMeasurement': 'Finish measurement', + 'lastPoint': 'Last point', + 'area': 'Area', + 'perimeter': 'Perimeter', + 'pointLocation': 'Point location', + 'areaMeasurement': 'Area measurement', + 'linearMeasurement': 'Linear measurement', + 'pathDistance': 'Path distance', + 'centerOnArea': 'Centre on this area', + 'centerOnLine': 'Centre on this line', + 'centerOnLocation': 'Centre on this location', + 'cancel': 'Cancel', + 'delete': 'Delete', + 'acres': 'Acres', + 'feet': 'Feet', + 'kilometers': 'Kilometres', + 'hectares': 'Hectares', + 'meters': 'Meters', + 'miles': 'Miles', + 'sqfeet': 'Sq Feet', + 'sqmeters': 'Sq Meters', + 'sqmiles': 'Sq Miles', + 'decPoint': '.', + 'thousandsSep': ',' +}; + +},{}],32:[function(require,module,exports){ +// es.js +// Spanish i18n translations + +module.exports = { + 'measure': 'Medición', + 'measureDistancesAndAreas': 'Mida distancias y áreas', + 'createNewMeasurement': 'Crear nueva medición', + 'startCreating': 'Empiece a crear la medición añadiendo puntos al mapa', + 'finishMeasurement': 'Terminar medición', + 'lastPoint': 'Último punto', + 'area': 'Área', + 'perimeter': 'Perímetro', + 'pointLocation': 'Localización del punto', + 'areaMeasurement': 'Medición de área', + 'linearMeasurement': 'Medición linear', + 'pathDistance': 'Distancia de ruta', + 'centerOnArea': 'Centrar en este área', + 'centerOnLine': 'Centrar en esta línea', + 'centerOnLocation': 'Centrar en esta localización', + 'cancel': 'Cancelar', + 'delete': 'Eliminar', + 'acres': 'Acres', + 'feet': 'Pies', + 'kilometers': 'Kilómetros', + 'hectares': 'Hectáreas', + 'meters': 'Metros', + 'miles': 'Millas', + 'sqfeet': 'Pies cuadrados', + 'sqmeters': 'Metros cuadrados', + 'sqmiles': 'Millas cuadradas', + 'decPoint': '.', + 'thousandsSep': ' ' +}; + +},{}],33:[function(require,module,exports){ +// fa.js +// Persian (Farsi) i18n translations + +module.exports = { + 'measure': 'اندازه گیری', + 'measureDistancesAndAreas': 'اندازه گیری فاصله و مساحت', + 'createNewMeasurement': 'ثبت اندازه گیری جدید', + 'startCreating': 'برای ثبت اندازه گیری جدید نقاطی را به نقشه اضافه کنید.', + 'finishMeasurement': 'پایان اندازه گیری', + 'lastPoint': 'آخرین نقطه', + 'area': 'مساحت', + 'perimeter': 'محیط', + 'pointLocation': 'مکان نقطه', + 'areaMeasurement': 'اندازه گیری مساحت', + 'linearMeasurement': 'اندازه گیری خطی', + 'pathDistance': 'فاصله مسیر', + 'centerOnArea': 'مرکز این سطح', + 'centerOnLine': 'مرکز این خط', + 'centerOnLocation': 'مرکز این مکان', + 'cancel': 'لغو', + 'delete': 'حذف', + 'acres': 'ایکر', + 'feet': 'پا', + 'kilometers': 'کیلومتر', + 'hectares': 'هکتار', + 'meters': 'متر', + 'miles': 'مایل', + 'sqfeet': 'پا مربع', + 'sqmeters': 'متر مربع', + 'sqmiles': 'مایل مربع', + 'decPoint': '/', + 'thousandsSep': ',' +}; + +},{}],34:[function(require,module,exports){ +// fil_PH.js +// Filipino i18n translations + +module.exports = { + 'measure': 'Sukat', + 'measureDistancesAndAreas': 'Kalkulahin ang tamang distansya at sukat', + 'createNewMeasurement': 'Lumikha ng isang bagong pagsukat', + 'startCreating': 'Simulan ang paglikha ng isang pagsukat sa pamamagitan ng pagdaragdag ng mga puntos sa mapa', + 'finishMeasurement': 'Tapusin ang pagsukat', + 'lastPoint': 'Huling punto sa mapa', + 'area': 'Sukat', + 'perimeter': 'Palibot', + 'pointLocation': 'Lokasyon ng punto', + 'areaMeasurement': 'Kabuuang sukat', + 'linearMeasurement': 'Pagsukat ng guhit', + 'pathDistance': 'Distansya ng daanan', + 'centerOnArea': 'I-sentro sa lugar na ito', + 'centerOnLine': 'I-sentro sa linya na ito', + 'centerOnLocation': 'I-sentro sa lokasyong ito', + 'cancel': 'Kanselahin', + 'delete': 'Tanggalin', + 'acres': 'Acres', + 'feet': 'Talampakan', + 'kilometers': 'Kilometro', + 'hectares': 'Hektarya', + 'meters': 'Metro', + 'miles': 'Milya', + 'sqfeet': 'Talampakang Kwadrado', + 'sqmeters': 'Metro Kwadrado', + 'sqmiles': 'Milya Kwadrado', + 'decPoint': '.', + 'thousandsSep': ',' +}; + +},{}],35:[function(require,module,exports){ +// fr.js +// French i18n translations + +module.exports = { + 'measure': 'Mesure', + 'measureDistancesAndAreas': 'Mesurer les distances et superficies', + 'createNewMeasurement': 'Créer une nouvelle mesure', + 'startCreating': 'Débuter la création d\'une nouvelle mesure en ajoutant des points sur la carte', + 'finishMeasurement': 'Finir la mesure', + 'lastPoint': 'Dernier point', + 'area': 'Superficie', + 'perimeter': 'Périmètre', + 'pointLocation': 'Placement du point', + 'areaMeasurement': 'Mesure de superficie', + 'linearMeasurement': 'Mesure linéaire', + 'pathDistance': 'Distance du chemin', + 'centerOnArea': 'Centrer sur cette zone', + 'centerOnLine': 'Centrer sur cette ligne', + 'centerOnLocation': 'Centrer à cet endroit', + 'cancel': 'Annuler', + 'delete': 'Supprimer', + 'acres': 'Acres', + 'feet': 'Pieds', + 'kilometers': 'Kilomètres', + 'hectares': 'Hectares', + 'meters': 'Mètres', + 'miles': 'Miles', + 'sqfeet': 'Pieds carrés', + 'sqmeters': 'Mètres carrés', + 'sqmiles': 'Miles carrés', + 'decPoint': ',', + 'thousandsSep': ' ' +}; + +},{}],36:[function(require,module,exports){ +// it.js +// Italian i18n translations + +module.exports = { + 'measure': 'Misura', + 'measureDistancesAndAreas': 'Misura distanze e aree', + 'createNewMeasurement': 'Crea una nuova misurazione', + 'startCreating': 'Comincia a creare una misurazione aggiungendo punti alla mappa', + 'finishMeasurement': 'Misurazione conclusa', + 'lastPoint': 'Ultimo punto', + 'area': 'Area', + 'perimeter': 'Perimetro', + 'pointLocation': 'Posizione punto', + 'areaMeasurement': 'Misura area', + 'linearMeasurement': 'Misura lineare', + 'pathDistance': 'Distanza percorso', + 'centerOnArea': 'Centra su questa area', + 'centerOnLine': 'Centra su questa linea', + 'centerOnLocation': 'Centra su questa posizione', + 'cancel': 'Annulla', + 'delete': 'Cancella', + 'acres': 'Acri', + 'feet': 'Piedi', + 'kilometers': 'Chilometri', + 'hectares': 'Ettari', + 'meters': 'Metri', + 'miles': 'Miglia', + 'sqfeet': 'Piedi quadri', + 'sqmeters': 'Metri quadri', + 'sqmiles': 'Miglia quadre', + 'decPoint': '.', + 'thousandsSep': ',' +}; + +},{}],37:[function(require,module,exports){ +// nl.js +// Dutch i18n translations + +module.exports = { + 'measure': 'Meet', + 'measureDistancesAndAreas': 'Meet afstanden en oppervlakten', + 'createNewMeasurement': 'Maak een nieuwe meting', + 'startCreating': 'Begin een meting door punten toe te voegen aan de kaart', + 'finishMeasurement': 'Beëindig meting', + 'lastPoint': 'Laatste punt', + 'area': 'Oppervlakte', + 'perimeter': 'Omtrek', + 'pointLocation': 'Locatie punt', + 'areaMeasurement': 'Oppervlakte meting', + 'linearMeasurement': 'Gemeten afstand', + 'pathDistance': 'Afstand over de lijn', + 'centerOnArea': 'Centreer op dit gebied', + 'centerOnLine': 'Centreer op deze lijn', + 'centerOnLocation': 'Centreer op deze locatie', + 'cancel': 'Annuleer', + 'delete': 'Wis', + 'acres': 'are', + 'feet': 'Voet', + 'kilometers': 'km', + 'hectares': 'ha', + 'meters': 'm', + 'miles': 'Mijl', + 'sqfeet': 'Vierkante Feet', + 'sqmeters': 'm2', + 'sqmiles': 'Vierkante Mijl', + 'decPoint': ',', + 'thousandsSep': '.' +}; + +},{}],38:[function(require,module,exports){ +// pl.js +// Polish i18n translations + +module.exports = { + 'measure': 'Pomiar', + 'measureDistancesAndAreas': 'Pomiar odległości i powierzchni', + 'createNewMeasurement': 'Utwórz nowy pomiar', + 'startCreating': 'Rozpocznij tworzenie nowego pomiaru poprzez dodanie punktów na mapie', + 'finishMeasurement': 'Zakończ pomiar', + 'lastPoint': 'Ostatni punkt', + 'area': 'Powierzchnia', + 'perimeter': 'Obwód', + 'pointLocation': 'Punkt lokalizacji', + 'areaMeasurement': 'Pomiar powierzchni', + 'linearMeasurement': 'Pomiar liniowy', + 'pathDistance': 'Długość ścieżki', + 'centerOnArea': 'Środek tego obszaru', + 'centerOnLine': 'Środek tej linii', + 'centerOnLocation': 'Środek w tej lokalizacji', + 'cancel': 'Anuluj', + 'delete': 'Skasuj', + 'acres': 'akrów', + 'feet': 'stóp', + 'kilometers': 'kilometrów', + 'hectares': 'hektarów', + 'meters': 'metrów', + 'miles': 'mil', + 'sqfeet': 'stóp kwadratowych', + 'sqmeters': 'metrów kwadratowych', + 'sqmiles': 'mil kwadratowych', + 'decPoint': ',', + 'thousandsSep': '.' +}; + +},{}],39:[function(require,module,exports){ +// pt_BR.js +// portuguese brazillian i18n translations + +module.exports = { + 'measure': 'Medidas', + 'measureDistancesAndAreas': 'Mede distâncias e áreas', + 'createNewMeasurement': 'Criar nova medida', + 'startCreating': 'Comece criando uma medida, adicionando pontos no mapa', + 'finishMeasurement': 'Finalizar medida', + 'lastPoint': 'Último ponto', + 'area': 'Área', + 'perimeter': 'Perímetro', + 'pointLocation': 'Localização do ponto', + 'areaMeasurement': 'Medida de área', + 'linearMeasurement': 'Medida linear', + 'pathDistance': 'Distância', + 'centerOnArea': 'Centralizar nesta área', + 'centerOnLine': 'Centralizar nesta linha', + 'centerOnLocation': 'Centralizar nesta localização', + 'cancel': 'Cancelar', + 'delete': 'Excluir', + 'acres': 'Acres', + 'feet': 'Pés', + 'kilometers': 'Quilômetros', + 'hectares': 'Hectares', + 'meters': 'Metros', + 'miles': 'Milhas', + 'sqfeet': 'Pés²', + 'sqmeters': 'Metros²', + 'sqmiles': 'Milhas²', + 'decPoint': ',', + 'thousandsSep': '.' +}; + +},{}],40:[function(require,module,exports){ +// en.js +// portuguese i18n translations + +module.exports = { + 'measure': 'Medições', + 'measureDistancesAndAreas': 'Medir distâncias e áreas', + 'createNewMeasurement': 'Criar uma nova medição', + 'startCreating': 'Adicione pontos no mapa, para criar uma nova medição', + 'finishMeasurement': 'Finalizar medição', + 'lastPoint': 'Último ponto', + 'area': 'Área', + 'perimeter': 'Perímetro', + 'pointLocation': 'Localização do ponto', + 'areaMeasurement': 'Medição da área', + 'linearMeasurement': 'Medição linear', + 'pathDistance': 'Distância', + 'centerOnArea': 'Centrar nesta área', + 'centerOnLine': 'Centrar nesta linha', + 'centerOnLocation': 'Centrar nesta localização', + 'cancel': 'Cancelar', + 'delete': 'Eliminar', + 'acres': 'Acres', + 'feet': 'Pés', + 'kilometers': 'Kilômetros', + 'hectares': 'Hectares', + 'meters': 'Metros', + 'miles': 'Milhas', + 'sqfeet': 'Pés²', + 'sqmeters': 'Metros²', + 'sqmiles': 'Milhas²', + 'decPoint': ',', + 'thousandsSep': '.' +}; + + +},{}],41:[function(require,module,exports){ +// ru.js +// Russian i18n translations + +module.exports = { + 'measure': 'Измерение', + 'measureDistancesAndAreas': 'Измерение расстояний и площади', + 'createNewMeasurement': 'Создать новое измерение', + 'startCreating': 'Для начала измерения добавьте точку на карту', + 'finishMeasurement': 'Закончить измерение', + 'lastPoint': 'Последняя точка', + 'area': 'Область', + 'perimeter': 'Периметр', + 'pointLocation': 'Местоположение точки', + 'areaMeasurement': 'Измерение области', + 'linearMeasurement': 'Линейное измерение', + 'pathDistance': 'Расстояние', + 'centerOnArea': 'Сфокусироваться на данной области', + 'centerOnLine': 'Сфокусироваться на данной линии', + 'centerOnLocation': 'Сфокусироваться на данной местности', + 'cancel': 'Отменить', + 'delete': 'Удалить', + 'acres': 'акры', + 'feet': 'фут', + 'kilometers': 'км', + 'hectares': 'га', + 'meters': 'м', + 'miles': 'миль', + 'sqfeet': 'футов²', + 'sqmeters': 'м²', + 'sqmiles': 'миль²', + 'decPoint': '.', + 'thousandsSep': ',' +}; + +},{}],42:[function(require,module,exports){ +// sv.js +// Swedish (svenska) i18n translations + +module.exports = { + 'measure': 'Mäta', + 'measureDistancesAndAreas': 'Mäta avstånd och yta', + 'createNewMeasurement': 'Skapa ny mätning', + 'startCreating': 'Börja mätning genom att lägga till punkter på kartan', + 'finishMeasurement': 'Avsluta mätning', + 'lastPoint': 'Sista punkt', + 'area': 'Yta', + 'perimeter': 'Omkrets', + 'pointLocation': 'Punktens Läge', + 'areaMeasurement': 'Arealmätning', + 'linearMeasurement': 'Längdmätning', + 'pathDistance': 'Total linjelängd', + 'centerOnArea': 'Centrera på detta område', + 'centerOnLine': 'Centrera på denna linje', + 'centerOnLocation': 'Centrera på denna punkt', + 'cancel': 'Avbryt', + 'delete': 'Radera', + 'acres': 'Tunnland', + 'feet': 'Fot', + 'kilometers': 'Kilometer', + 'hectares': 'Hektar', + 'meters': 'Meter', + 'miles': 'Miles', + 'sqfeet': 'Kvadratfot', + 'sqmeters': 'Kvadratmeter', + 'sqmiles': 'Kvadratmiles', + 'decPoint': ',', + 'thousandsSep': ' ' //space +}; + +},{}],43:[function(require,module,exports){ +// tr.js +// Turkish i18n translations + +module.exports = { + 'measure': 'Hesapla', + 'measureDistancesAndAreas': 'Uzaklık ve alan hesapla', + 'createNewMeasurement': 'Yeni hesaplama', + 'startCreating': 'Yeni nokta ekleyerek hesaplamaya başla', + 'finishMeasurement': 'Hesaplamayı bitir', + 'lastPoint': 'Son nokta', + 'area': 'Alan', + 'perimeter': 'Çevre uzunluğu', + 'pointLocation': 'Nokta yeri', + 'areaMeasurement': 'Alan hesaplaması', + 'linearMeasurement': 'Doğrusal hesaplama', + 'pathDistance': 'Yol uzunluğu', + 'centerOnArea': 'Bu alana odaklan', + 'centerOnLine': 'Bu doğtuya odaklan', + 'centerOnLocation': 'Bu yere odaklan', + 'cancel': 'Çıkış', + 'delete': 'Sil', + 'acres': 'Dönüm', + 'feet': 'Feet', + 'kilometers': 'Kilometre', + 'hectares': 'Hektar', + 'meters': 'Metre', + 'miles': 'Mil', + 'sqfeet': 'Feet kare', + 'sqmeters': 'Metre kare', + 'sqmiles': 'Mil kare', + 'decPoint': '.', + 'thousandsSep': ',' +}; + +},{}],44:[function(require,module,exports){ +(function (global){ +// leaflet-measure.js + +var _ = require('underscore'); +var L = (typeof window !== "undefined" ? window['L'] : typeof global !== "undefined" ? global['L'] : null); +var humanize = require('humanize'); + +var units = require('./units'); +var calc = require('./calc'); +var dom = require('./dom'); +var $ = dom.$; + +var Symbology = require('./mapsymbology'); + + +var controlTemplate = _.template("-toggle js-toggle\" href=\"#\" title=\"<%= i18n.__('measureDistancesAndAreas') %>\"><%= i18n.__('measure') %>\n
-interaction js-interaction\">\n
\n

<%= i18n.__('measureDistancesAndAreas') %>

\n \n
\n
\n

<%= i18n.__('measureDistancesAndAreas') %>

\n

<%= i18n.__('startCreating') %>

\n
\n \n
\n
"); +var resultsTemplate = _.template("
\n

<%= i18n.__('lastPoint') %>

\n

<%= model.lastCoord.dms.y %> / <%= model.lastCoord.dms.x %>

\n

<%= humanize.numberFormat(model.lastCoord.dd.y, 6) %> / <%= humanize.numberFormat(model.lastCoord.dd.x, 6) %>

\n
\n<% if (model.pointCount > 1) { %>\n
\n

<%= i18n.__('pathDistance') %> <%= model.lengthDisplay %>

\n
\n<% } %>\n<% if (model.pointCount > 2) { %>\n
\n

<%= i18n.__('area') %> <%= model.areaDisplay %>

\n
\n<% } %>"); +var pointPopupTemplate = _.template("

<%= i18n.__('pointLocation') %>

\n

<%= model.lastCoord.dms.y %> / <%= model.lastCoord.dms.x %>

\n

<%= humanize.numberFormat(model.lastCoord.dd.y, 6) %> / <%= humanize.numberFormat(model.lastCoord.dd.x, 6) %>

\n"); +var linePopupTemplate = _.template("

<%= i18n.__('linearMeasurement') %>

\n

<%= model.lengthDisplay %>

\n"); +var areaPopupTemplate = _.template("

<%= i18n.__('areaMeasurement') %>

\n

<%= model.areaDisplay %>

\n

<%= model.lengthDisplay %> <%= i18n.__('perimeter') %>

\n"); + +var i18n = new (require('i18n-2'))({ + devMode: false, + locales: { + 'ca': require('./i18n/ca'), + 'cn': require('./i18n/cn'), + 'da': require('./i18n/da'), + 'de': require('./i18n/de'), + 'de_CH': require('./i18n/de_CH'), + 'en': require('./i18n/en'), + 'en_UK': require('./i18n/en_UK'), + 'es': require('./i18n/es'), + 'fa': require('./i18n/fa'), + 'fil_PH': require('./i18n/fil_PH'), + 'fr': require('./i18n/fr'), + 'it': require('./i18n/it'), + 'nl': require('./i18n/nl'), + 'pl': require('./i18n/pl'), + 'pt_BR': require('./i18n/pt_BR'), + 'pt_PT': require('./i18n/pt_PT'), + 'ru': require('./i18n/ru'), + 'sv': require('./i18n/sv'), + 'tr': require('./i18n/tr') + } +}); + +L.Control.Measure = L.Control.extend({ + _className: 'leaflet-control-measure', + options: { + units: {}, + position: 'topright', + primaryLengthUnit: 'feet', + secondaryLengthUnit: 'miles', + primaryAreaUnit: 'acres', + activeColor: '#ABE67E', // base color for map features while actively measuring + completedColor: '#C8F2BE', // base color for permenant features generated from completed measure + captureZIndex: 10000, // z-index of the marker used to capture measure events + popupOptions: { // standard leaflet popup options http://leafletjs.com/reference.html#popup-options + className: 'leaflet-measure-resultpopup', + autoPanPadding: [10, 10] + } + }, + initialize: function (options) { + L.setOptions(this, options); + this.options.units = L.extend({}, units, this.options.units); + this._symbols = new Symbology(_.pick(this.options, 'activeColor', 'completedColor')); + i18n.setLocale(this.options.localization); + }, + onAdd: function (map) { + this._map = map; + this._latlngs = []; + this._initLayout(); + map.on('click', this._collapse, this); + this._layer = L.layerGroup().addTo(map); + return this._container; + }, + onRemove: function (map) { + map.off('click', this._collapse, this); + map.removeLayer(this._layer); + }, + _initLayout: function () { + var className = this._className, container = this._container = L.DomUtil.create('div', className); + var $toggle, $start, $cancel, $finish; + + container.innerHTML = controlTemplate({ + model: { + className: className + }, + i18n: i18n + }); + + // copied from leaflet + // https://bitbucket.org/ljagis/js-mapbootstrap/src/4ab1e9e896c08bdbc8164d4053b2f945143f4f3a/app/components/measure/leaflet-measure-control.js?at=master#cl-30 + container.setAttribute('aria-haspopup', true); + if (!L.Browser.touch) { + L.DomEvent.disableClickPropagation(container); + L.DomEvent.disableScrollPropagation(container); + } else { + L.DomEvent.on(container, 'click', L.DomEvent.stopPropagation); + } + + $toggle = this.$toggle = $('.js-toggle', container); // collapsed content + this.$interaction = $('.js-interaction', container); // expanded content + $start = $('.js-start', container); // start button + $cancel = $('.js-cancel', container); // cancel button + $finish = $('.js-finish', container); // finish button + this.$startPrompt = $('.js-startprompt', container); // full area with button to start measurment + this.$measuringPrompt = $('.js-measuringprompt', container); // full area with all stuff for active measurement + this.$startHelp = $('.js-starthelp', container); // "Start creating a measurement by adding points" + this.$results = $('.js-results', container); // div with coordinate, linear, area results + this.$measureTasks = $('.js-measuretasks', container); // active measure buttons container + + this._collapse(); + this._updateMeasureNotStarted(); + + if (!L.Browser.android) { + L.DomEvent.on(container, 'mouseenter', this._expand, this); + L.DomEvent.on(container, 'mouseleave', this._collapse, this); + } + L.DomEvent.on($toggle, 'click', L.DomEvent.stop); + if (L.Browser.touch) { + L.DomEvent.on($toggle, 'click', this._expand, this); + } else { + L.DomEvent.on($toggle, 'focus', this._expand, this); + } + L.DomEvent.on($start, 'click', L.DomEvent.stop); + L.DomEvent.on($start, 'click', this._startMeasure, this); + L.DomEvent.on($cancel, 'click', L.DomEvent.stop); + L.DomEvent.on($cancel, 'click', this._finishMeasure, this); + L.DomEvent.on($finish, 'click', L.DomEvent.stop); + L.DomEvent.on($finish, 'click', this._handleMeasureDoubleClick, this); + }, + _expand: function () { + dom.hide(this.$toggle); + dom.show(this.$interaction); + }, + _collapse: function () { + if (!this._locked) { + dom.hide(this.$interaction); + dom.show(this.$toggle); + } + }, + // move between basic states: + // measure not started, started/in progress but no points added, in progress and with points + _updateMeasureNotStarted: function () { + dom.hide(this.$startHelp); + dom.hide(this.$results); + dom.hide(this.$measureTasks); + dom.hide(this.$measuringPrompt); + dom.show(this.$startPrompt); + }, + _updateMeasureStartedNoPoints: function () { + dom.hide(this.$results); + dom.show(this.$startHelp); + dom.show(this.$measureTasks); + dom.hide(this.$startPrompt); + dom.show(this.$measuringPrompt); + }, + _updateMeasureStartedWithPoints: function () { + dom.hide(this.$startHelp); + dom.show(this.$results); + dom.show(this.$measureTasks); + dom.hide(this.$startPrompt); + dom.show(this.$measuringPrompt); + }, + // get state vars and interface ready for measure + _startMeasure: function () { + this._locked = true; + this._measureVertexes = L.featureGroup().addTo(this._layer); + this._captureMarker = L.marker(this._map.getCenter(), { + clickable: true, + zIndexOffset: this.options.captureZIndex, + opacity: 0 + }).addTo(this._layer); + this._setCaptureMarkerIcon(); + + this._captureMarker + .on('mouseout', this._handleMapMouseOut, this) + .on('dblclick', this._handleMeasureDoubleClick, this) + .on('click', this._handleMeasureClick, this); + + this._map + .on('mousemove', this._handleMeasureMove, this) + .on('mouseout', this._handleMapMouseOut, this) + .on('move', this._centerCaptureMarker, this) + .on('resize', this._setCaptureMarkerIcon, this); + + L.DomEvent.on(this._container, 'mouseenter', this._handleMapMouseOut, this); + + this._updateMeasureStartedNoPoints(); + + this._map.fire('measurestart', null, false); + }, + // return to state with no measure in progress, undo `this._startMeasure` + _finishMeasure: function () { + var model = _.extend({}, this._resultsModel, { + points: this._latlngs + }); + + this._locked = false; + + L.DomEvent.off(this._container, 'mouseover', this._handleMapMouseOut, this); + + this._clearMeasure(); + + this._captureMarker + .off('mouseout', this._handleMapMouseOut, this) + .off('dblclick', this._handleMeasureDoubleClick, this) + .off('click', this._handleMeasureClick, this); + + this._map + .off('mousemove', this._handleMeasureMove, this) + .off('mouseout', this._handleMapMouseOut, this) + .off('move', this._centerCaptureMarker, this) + .off('resize', this._setCaptureMarkerIcon, this); + + this._layer + .removeLayer(this._measureVertexes) + .removeLayer(this._captureMarker); + this._measureVertexes = null; + + this._updateMeasureNotStarted(); + this._collapse(); + + this._map.fire('measurefinish', model, false); + }, + // clear all running measure data + _clearMeasure: function () { + this._latlngs = []; + this._resultsModel = null; + this._measureVertexes.clearLayers(); + if (this._measureDrag) { + this._layer.removeLayer(this._measureDrag); + } + if (this._measureArea) { + this._layer.removeLayer(this._measureArea); + } + if (this._measureBoundary) { + this._layer.removeLayer(this._measureBoundary); + } + this._measureDrag = null; + this._measureArea = null; + this._measureBoundary = null; + }, + // centers the event capture marker + _centerCaptureMarker: function () { + this._captureMarker.setLatLng(this._map.getCenter()); + }, + // set icon on the capture marker + _setCaptureMarkerIcon: function () { + this._captureMarker.setIcon(L.divIcon({ + iconSize: this._map.getSize().multiplyBy(2) + })); + }, + // format measurements to nice display string based on units in options + // `{ lengthDisplay: '100 Feet (0.02 Miles)', areaDisplay: ... }` + _getMeasurementDisplayStrings: function (measurement) { + var unitDefinitions = this.options.units; + + return { + lengthDisplay: buildDisplay(measurement.length, this.options.primaryLengthUnit, this.options.secondaryLengthUnit, this.options.decPoint, this.options.thousandsSep), + areaDisplay: buildDisplay(measurement.area, this.options.primaryAreaUnit, this.options.secondaryAreaUnit, this.options.decPoint, this.options.thousandsSep) + }; + + function buildDisplay (val, primaryUnit, secondaryUnit, decPoint, thousandsSep) { + var display; + if (primaryUnit && unitDefinitions[primaryUnit]) { + display = formatMeasure(val, unitDefinitions[primaryUnit], decPoint, thousandsSep); + if (secondaryUnit && unitDefinitions[secondaryUnit]) { + display = display + ' (' + formatMeasure(val, unitDefinitions[secondaryUnit], decPoint, thousandsSep) + ')'; + } + } else { + display = formatMeasure(val, null, decPoint, thousandsSep); + } + return display; + } + + function formatMeasure (val, unit, decPoint, thousandsSep) { + return unit && unit.factor && unit.display ? + humanize.numberFormat(val * unit.factor, unit.decimals || 0, decPoint || i18n.__('decPoint'), thousandsSep || i18n.__('thousandsSep')) + ' ' + i18n.__([unit.display]) || unit.display : + humanize.numberFormat(val, 0, decPoint || i18n.__('decPoint'), thousandsSep || i18n.__('thousandsSep')); + } + }, + // update results area of dom with calced measure from `this._latlngs` + _updateResults: function () { + var calced = calc.measure(this._latlngs); + var resultsModel = this._resultsModel = _.extend({}, calced, this._getMeasurementDisplayStrings(calced), { + pointCount: this._latlngs.length + }); + this.$results.innerHTML = resultsTemplate({ + model: resultsModel, + humanize: humanize, + i18n: i18n + }); + }, + // mouse move handler while measure in progress + // adds floating measure marker under cursor + _handleMeasureMove: function (evt) { + if (!this._measureDrag) { + this._measureDrag = L.circleMarker(evt.latlng, this._symbols.getSymbol('measureDrag')).addTo(this._layer); + } else { + this._measureDrag.setLatLng(evt.latlng); + } + this._measureDrag.bringToFront(); + }, + // handler for both double click and clicking finish button + // do final calc and finish out current measure, clear dom and internal state, add permanent map features + _handleMeasureDoubleClick: function () { + var latlngs = this._latlngs, calced, resultFeature, popupContainer, popupContent, zoomLink, deleteLink; + + this._finishMeasure(); + + if (!latlngs.length) { + return; + } + + if (latlngs.length > 2) { + latlngs.push(_.first(latlngs)); // close path to get full perimeter measurement for areas + } + + calced = calc.measure(latlngs); + + if (latlngs.length === 1) { + resultFeature = L.circleMarker(latlngs[0], this._symbols.getSymbol('resultPoint')); + popupContent = pointPopupTemplate({ + model: calced, + humanize: humanize, + i18n: i18n + }); + } else if (latlngs.length === 2) { + resultFeature = L.polyline(latlngs, this._symbols.getSymbol('resultLine')); + popupContent = linePopupTemplate({ + model: _.extend({}, calced, this._getMeasurementDisplayStrings(calced)), + humanize: humanize, + i18n: i18n + }); + } else { + resultFeature = L.polygon(latlngs, this._symbols.getSymbol('resultArea')); + popupContent = areaPopupTemplate({ + model: _.extend({}, calced, this._getMeasurementDisplayStrings(calced)), + humanize: humanize, + i18n: i18n + }); + } + + popupContainer = L.DomUtil.create('div', ''); + popupContainer.innerHTML = popupContent; + + zoomLink = $('.js-zoomto', popupContainer); + if (zoomLink) { + L.DomEvent.on(zoomLink, 'click', L.DomEvent.stop); + L.DomEvent.on(zoomLink, 'click', function () { + if (resultFeature.getBounds) { + this._map.fitBounds(resultFeature.getBounds(), { + padding: [20, 20], + maxZoom: 17 + }); + } else if (resultFeature.getLatLng) { + this._map.panTo(resultFeature.getLatLng()); + } + }, this); + } + + deleteLink = $('.js-deletemarkup', popupContainer); + if (deleteLink) { + L.DomEvent.on(deleteLink, 'click', L.DomEvent.stop); + L.DomEvent.on(deleteLink, 'click', function () { + // TODO. maybe remove any event handlers on zoom and delete buttons? + this._layer.removeLayer(resultFeature); + }, this); + } + + resultFeature.addTo(this._layer); + resultFeature.bindPopup(popupContainer, this.options.popupOptions); + if (resultFeature.getBounds) { + resultFeature.openPopup(resultFeature.getBounds().getCenter()); + } else if (resultFeature.getLatLng) { + resultFeature.openPopup(resultFeature.getLatLng()); + } + }, + // handle map click during ongoing measurement + // add new clicked point, update measure layers and results ui + _handleMeasureClick: function (evt) { + var latlng = this._map.mouseEventToLatLng(evt.originalEvent), // get actual latlng instead of the marker's latlng from originalEvent + lastClick = _.last(this._latlngs), + vertexSymbol = this._symbols.getSymbol('measureVertex'); + + if (!lastClick || !latlng.equals(lastClick)) { // skip if same point as last click, happens on `dblclick` + this._latlngs.push(latlng); + this._addMeasureArea(this._latlngs); + this._addMeasureBoundary(this._latlngs); + + this._measureVertexes.eachLayer(function (layer) { + layer.setStyle(vertexSymbol); + // reset all vertexes to non-active class - only last vertex is active + // `layer.setStyle({ className: 'layer-measurevertex'})` doesn't work. https://github.com/leaflet/leaflet/issues/2662 + // set attribute on path directly + layer._path.setAttribute('class', vertexSymbol.className); + }); + + this._addNewVertex(latlng); + + if (this._measureBoundary) { + this._measureBoundary.bringToFront(); + } + this._measureVertexes.bringToFront(); + } + + this._updateResults(); + this._updateMeasureStartedWithPoints(); + }, + // handle map mouse out during ongoing measure + // remove floating cursor vertex from map + _handleMapMouseOut: function () { + if (this._measureDrag) { + this._layer.removeLayer(this._measureDrag); + this._measureDrag = null; + } + }, + // add various measure graphics to map - vertex, area, boundary + _addNewVertex: function (latlng) { + L.circleMarker(latlng, this._symbols.getSymbol('measureVertexActive')).addTo(this._measureVertexes); + }, + _addMeasureArea: function (latlngs) { + if (latlngs.length < 3) { + if (this._measureArea) { + this._layer.removeLayer(this._measureArea); + this._measureArea = null; + } + return; + } + if (!this._measureArea) { + this._measureArea = L.polygon(latlngs, this._symbols.getSymbol('measureArea')).addTo(this._layer); + } else { + this._measureArea.setLatLngs(latlngs); + } + }, + _addMeasureBoundary: function (latlngs) { + if (latlngs.length < 2) { + if (this._measureBoundary) { + this._layer.removeLayer(this._measureBoundary); + this._measureBoundary = null; + } + return; + } + if (!this._measureBoundary) { + this._measureBoundary = L.polyline(latlngs, this._symbols.getSymbol('measureBoundary')).addTo(this._layer); + } else { + this._measureBoundary.setLatLngs(latlngs); + } + } +}); + +L.Map.mergeOptions({ + measureControl: false +}); + +L.Map.addInitHook(function () { + if (this.options.measureControl) { + this.measureControl = (new L.Control.Measure()).addTo(this); + } +}); + +L.control.measure = function (options) { + return new L.Control.Measure(options); +}; + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +},{"./calc":23,"./dom":24,"./i18n/ca":25,"./i18n/cn":26,"./i18n/da":27,"./i18n/de":28,"./i18n/de_CH":29,"./i18n/en":30,"./i18n/en_UK":31,"./i18n/es":32,"./i18n/fa":33,"./i18n/fil_PH":34,"./i18n/fr":35,"./i18n/it":36,"./i18n/nl":37,"./i18n/pl":38,"./i18n/pt_BR":39,"./i18n/pt_PT":40,"./i18n/ru":41,"./i18n/sv":42,"./i18n/tr":43,"./mapsymbology":45,"./units":46,"humanize":16,"i18n-2":18,"underscore":22}],45:[function(require,module,exports){ +// mapsymbology.js + +var _ = require('underscore'); + +var color = require('color'); + +var Symbology = function (options) { + this.setOptions(options); +}; + +Symbology.DEFAULTS = { + activeColor: '#ABE67E', // base color for map features while actively measuring + completedColor: '#C8F2BE' // base color for permenant features generated from completed measure +}; + +_.extend(Symbology.prototype, { + setOptions: function (options) { + this._options = _.extend({}, Symbology.DEFAULTS, this._options, options); + return this; + }, + getSymbol: function (name) { + var symbols = { + measureDrag: { + clickable: false, + radius: 4, + color: this._options.activeColor, + weight: 2, + opacity: 0.7, + fillColor: this._options.activeColor, + fillOpacity: 0.5, + className: 'layer-measuredrag' + }, + measureArea: { + clickable: false, + stroke: false, + fillColor: this._options.activeColor, + fillOpacity: 0.2, + className: 'layer-measurearea' + }, + measureBoundary: { + clickable: false, + color: this._options.activeColor, + weight: 2, + opacity: 0.9, + fill: false, + className: 'layer-measureboundary' + }, + measureVertex: { + clickable: false, + radius: 4, + color: this._options.activeColor, + weight: 2, + opacity: 1, + fillColor: this._options.activeColor, + fillOpacity: 0.7, + className: 'layer-measurevertex' + }, + measureVertexActive: { + clickable: false, + radius: 4, + color: this._options.activeColor, + weight: 2, + opacity: 1, + fillColor: color(this._options.activeColor).darken(0.15), + fillOpacity: 0.7, + className: 'layer-measurevertex active' + }, + resultArea: { + clickable: true, + color: this._options.completedColor, + weight: 2, + opacity: 0.9, + fillColor: this._options.completedColor, + fillOpacity: 0.2, + className: 'layer-measure-resultarea' + }, + resultLine: { + clickable: true, + color: this._options.completedColor, + weight: 3, + opacity: 0.9, + fill: false, + className: 'layer-measure-resultline' + }, + resultPoint: { + clickable: true, + radius: 4, + color: this._options.completedColor, + weight: 2, + opacity: 1, + fillColor: this._options.completedColor, + fillOpacity: 0.7, + className: 'layer-measure-resultpoint' + } + }; + return symbols[name]; + } +}); + +module.exports = Symbology; +},{"color":6,"underscore":22}],46:[function(require,module,exports){ +// units.js +// Unit configurations +// Factor is with respect to meters/sqmeters + +module.exports = { + acres: { + factor: 0.00024711, + display: 'acres', + decimals: 2 + }, + feet: { + factor: 3.2808, + display: 'feet', + decimals: 0 + }, + kilometers: { + factor: 0.001, + display: 'kilometers', + decimals: 2 + }, + hectares: { + factor: 0.0001, + display: 'hectares', + decimals: 2 + }, + meters: { + factor: 1, + display: 'meters', + decimals: 0 + }, + miles: { + factor: 3.2808 / 5280, + display: 'miles', + decimals: 2 + }, + sqfeet: { + factor: 10.7639, + display: 'sqfeet', + decimals: 0 + }, + sqmeters: { + factor: 1, + display: 'sqmeters', + decimals: 0 + }, + sqmiles: { + factor: 0.000000386102, + display: 'sqmiles', + decimals: 2 + } +}; +},{}]},{},[44]); diff --git a/js/leaflet-svg-shape-markers.min.js b/js/leaflet-svg-shape-markers.min.js new file mode 100644 index 0000000..7a5e693 --- /dev/null +++ b/js/leaflet-svg-shape-markers.min.js @@ -0,0 +1 @@ +L.SVG.include({_updateShape:function(t){var i=t._point,s=t._radius,e=t.options.shape;if("diamond"===e){var n="M"+(i.x-s)+" "+i.y+" L "+i.x+" "+(i.y-s)+" L"+(i.x+s)+" "+i.y+" L"+i.x+" "+(i.y+s)+" L"+(i.x-s)+" "+i.y;this._setPath(t,n)}if("square"===e){var n="M"+(i.x-s)+" "+(i.y-s)+" L "+(i.x+s)+" "+(i.y-s)+" L"+(i.x+s)+" "+(i.y+s)+" L"+(i.x-s)+" "+(i.y+s)+" L"+(i.x-s)+" "+(i.y-s);this._setPath(t,n)}if("triangle"===e||"triangle-up"===e){var n="M"+(i.x-s)+" "+(i.y+s)+" L"+i.x+" "+(i.y-s)+" L"+(i.x+s)+" "+(i.y+s)+" Z";this._setPath(t,n)}if("triangle-down"===e){var n="M"+(i.x-s)+" "+(i.y-s)+" L"+i.x+" "+(i.y+s)+" L"+(i.x+s)+" "+(i.y-s)+" Z";this._setPath(t,n)}if("circle"===e&&this._updateCircle(t),"x"===e){s/=2;var n="M"+(i.x+s)+","+(i.y+s)+"L"+(i.x-s)+","+(i.y-s)+"M"+(i.x-s)+","+(i.y+s)+"L"+(i.x+s)+","+(i.y-s);this._setPath(t,n)}}}),L.ShapeMarker=L.Path.extend({options:{fill:!0,shape:"triangle",radius:10},initialize:function(t,i){L.setOptions(this,i),this._latlng=L.latLng(t),this._radius=this.options.radius},setLatLng:function(t){return this._latlng=L.latLng(t),this.redraw(),this.fire("move",{latlng:this._latlng})},getLatLng:function(){return this._latlng},setRadius:function(t){return this.options.radius=this._radius=t,this.redraw()},getRadius:function(){return this._radius},setStyle:function(t){var i=t&&t.radius||this._radius;return L.Path.prototype.setStyle.call(this,t),this.setRadius(i),this},_project:function(){this._point=this._map.latLngToLayerPoint(this._latlng),this._updateBounds()},_updateBounds:function(){var t=this._radius,i=this._radiusY||t,s=this._clickTolerance(),e=[t+s,i+s];this._pxBounds=new L.Bounds(this._point.subtract(e),this._point.add(e))},_update:function(){this._map&&this._updatePath()},_updatePath:function(){this._renderer._updateShape(this)},_empty:function(){return this._size&&!this._renderer._bounds.intersects(this._pxBounds)},toGeoJSON:function(){return L.GeoJSON.getFeature(this,{type:"Point",coordinates:L.GeoJSON.latLngToCoords(this.getLatLng())})}}),L.shapeMarker=function(t,i){return new L.ShapeMarker(t,i)}; \ No newline at end of file diff --git a/js/leaflet-tilelayer-wmts.js b/js/leaflet-tilelayer-wmts.js new file mode 100644 index 0000000..c9a673a --- /dev/null +++ b/js/leaflet-tilelayer-wmts.js @@ -0,0 +1 @@ +L.TileLayer.WMTS=L.TileLayer.extend({defaultWmtsParams:{service:"WMTS",request:"GetTile",version:"1.0.0",layer:"",style:"",tilematrixSet:"",format:"image/jpeg"},initialize:function(e,t){this._url=e;var n=L.extend({},this.defaultWmtsParams),r=t.tileSize||this.options.tileSize;if(t.detectRetina&&L.Browser.retina){n.width=n.height=r*2}else{n.width=n.height=r}for(var i in t){if(!this.options.hasOwnProperty(i)&&i!="matrixIds"){n[i]=t[i]}}this.wmtsParams=n;this.matrixIds=t.matrixIds||this.getDefaultMatrix();L.setOptions(this,t)},onAdd:function(e){L.TileLayer.prototype.onAdd.call(this,e)},getTileUrl:function(e,t){var n=this._map;crs=n.options.crs;tileSize=this.options.tileSize;nwPoint=e.multiplyBy(tileSize);nwPoint.x+=1;nwPoint.y-=1;sePoint=nwPoint.add(new L.Point(tileSize,tileSize));nw=crs.project(n.unproject(nwPoint,t));se=crs.project(n.unproject(sePoint,t));tilewidth=se.x-nw.x;t=n.getZoom();ident=this.matrixIds[t].identifier;X0=this.matrixIds[t].topLeftCorner.lng;Y0=this.matrixIds[t].topLeftCorner.lat;tilecol=Math.floor((nw.x-X0)/tilewidth);tilerow=-Math.floor((nw.y-Y0)/tilewidth);url=L.Util.template(this._url,{s:this._getSubdomain(e)});return url+L.Util.getParamString(this.wmtsParams,url)+"&tilematrix="+ident+"&tilerow="+tilerow+"&tilecol="+tilecol},setParams:function(e,t){L.extend(this.wmtsParams,e);if(!t){this.redraw()}return this},getDefaultMatrix:function(){var e=new Array(22);for(var t=0;t<22;t++){e[t]={identifier:""+t,topLeftCorner:new L.LatLng(20037508.3428,-20037508.3428)}}return e}});L.tileLayer.wmts=function(e,t){return new L.TileLayer.WMTS(e,t)} diff --git a/js/leaflet.js b/js/leaflet.js new file mode 100644 index 0000000..302845e --- /dev/null +++ b/js/leaflet.js @@ -0,0 +1,6 @@ +/* @preserve + * Leaflet 1.7.1, a JS library for interactive maps. http://leafletjs.com + * (c) 2010-2019 Vladimir Agafonkin, (c) 2010-2011 CloudMade + */ +!function(t,i){"object"==typeof exports&&"undefined"!=typeof module?i(exports):"function"==typeof define&&define.amd?define(["exports"],i):i(t.L={})}(this,function(t){"use strict";function h(t){for(var i,e,n=1,o=arguments.length;n=this.min.x&&e.x<=this.max.x&&i.y>=this.min.y&&e.y<=this.max.y},intersects:function(t){t=O(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>=i.x&&n.x<=e.x,r=o.y>=i.y&&n.y<=e.y;return s&&r},overlaps:function(t){t=O(t);var i=this.min,e=this.max,n=t.min,o=t.max,s=o.x>i.x&&n.xi.y&&n.y=n.lat&&e.lat<=o.lat&&i.lng>=n.lng&&e.lng<=o.lng},intersects:function(t){t=N(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>=i.lat&&n.lat<=e.lat,r=o.lng>=i.lng&&n.lng<=e.lng;return s&&r},overlaps:function(t){t=N(t);var i=this._southWest,e=this._northEast,n=t.getSouthWest(),o=t.getNorthEast(),s=o.lat>i.lat&&n.lati.lng&&n.lng';var i=t.firstChild;return i.style.behavior="url(#default#VML)",i&&"object"==typeof i.adj}catch(t){return!1}}();function kt(t){return 0<=navigator.userAgent.toLowerCase().indexOf(t)}var Bt={ie:tt,ielt9:it,edge:et,webkit:nt,android:ot,android23:st,androidStock:at,opera:ht,chrome:ut,gecko:lt,safari:ct,phantom:_t,opera12:dt,win:pt,ie3d:mt,webkit3d:ft,gecko3d:gt,any3d:vt,mobile:yt,mobileWebkit:xt,mobileWebkit3d:wt,msPointer:Pt,pointer:Lt,touch:bt,mobileOpera:Tt,mobileGecko:Mt,retina:zt,passiveEvents:Ct,canvas:St,svg:Zt,vml:Et},At=Pt?"MSPointerDown":"pointerdown",It=Pt?"MSPointerMove":"pointermove",Ot=Pt?"MSPointerUp":"pointerup",Rt=Pt?"MSPointerCancel":"pointercancel",Nt={},Dt=!1;function jt(t,i,e,n){function o(t){Ut(t,r)}var s,r,a,h,u,l,c,_;function d(t){t.pointerType===(t.MSPOINTER_TYPE_MOUSE||"mouse")&&0===t.buttons||Ut(t,h)}return"touchstart"===i?(u=t,l=e,c=n,_=p(function(t){t.MSPOINTER_TYPE_TOUCH&&t.pointerType===t.MSPOINTER_TYPE_TOUCH&&Ri(t),Ut(t,l)}),u["_leaflet_touchstart"+c]=_,u.addEventListener(At,_,!1),Dt||(document.addEventListener(At,Wt,!0),document.addEventListener(It,Ht,!0),document.addEventListener(Ot,Ft,!0),document.addEventListener(Rt,Ft,!0),Dt=!0)):"touchmove"===i?(h=e,(a=t)["_leaflet_touchmove"+n]=d,a.addEventListener(It,d,!1)):"touchend"===i&&(r=e,(s=t)["_leaflet_touchend"+n]=o,s.addEventListener(Ot,o,!1),s.addEventListener(Rt,o,!1)),this}function Wt(t){Nt[t.pointerId]=t}function Ht(t){Nt[t.pointerId]&&(Nt[t.pointerId]=t)}function Ft(t){delete Nt[t.pointerId]}function Ut(t,i){for(var e in t.touches=[],Nt)t.touches.push(Nt[e]);t.changedTouches=[t],i(t)}var Vt=Pt?"MSPointerDown":Lt?"pointerdown":"touchstart",qt=Pt?"MSPointerUp":Lt?"pointerup":"touchend",Gt="_leaflet_";var Kt,Yt,Xt,Jt,$t,Qt,ti=fi(["transform","webkitTransform","OTransform","MozTransform","msTransform"]),ii=fi(["webkitTransition","transition","OTransition","MozTransition","msTransition"]),ei="webkitTransition"===ii||"OTransition"===ii?ii+"End":"transitionend";function ni(t){return"string"==typeof t?document.getElementById(t):t}function oi(t,i){var e,n=t.style[i]||t.currentStyle&&t.currentStyle[i];return n&&"auto"!==n||!document.defaultView||(n=(e=document.defaultView.getComputedStyle(t,null))?e[i]:null),"auto"===n?null:n}function si(t,i,e){var n=document.createElement(t);return n.className=i||"",e&&e.appendChild(n),n}function ri(t){var i=t.parentNode;i&&i.removeChild(t)}function ai(t){for(;t.firstChild;)t.removeChild(t.firstChild)}function hi(t){var i=t.parentNode;i&&i.lastChild!==t&&i.appendChild(t)}function ui(t){var i=t.parentNode;i&&i.firstChild!==t&&i.insertBefore(t,i.firstChild)}function li(t,i){if(void 0!==t.classList)return t.classList.contains(i);var e=pi(t);return 0this.options.maxZoom)?this.setZoom(t):this},panInsideBounds:function(t,i){this._enforcingBounds=!0;var e=this.getCenter(),n=this._limitCenter(e,this._zoom,N(t));return e.equals(n)||this.panTo(n,i),this._enforcingBounds=!1,this},panInside:function(t,i){var e,n,o=A((i=i||{}).paddingTopLeft||i.padding||[0,0]),s=A(i.paddingBottomRight||i.padding||[0,0]),r=this.getCenter(),a=this.project(r),h=this.project(t),u=this.getPixelBounds(),l=u.getSize().divideBy(2),c=O([u.min.add(o),u.max.subtract(s)]);return c.contains(h)||(this._enforcingBounds=!0,e=a.subtract(h),n=A(h.x+e.x,h.y+e.y),(h.xc.max.x)&&(n.x=a.x-e.x,0c.max.y)&&(n.y=a.y-e.y,0=this.options.transform3DLimit&&this._resetView(this.getCenter(),this.getZoom())},_findEventTargets:function(t,i){for(var e,n=[],o="mouseout"===i||"mouseover"===i,s=t.target||t.srcElement,r=!1;s;){if((e=this._targets[m(s)])&&("click"===i||"preclick"===i)&&!t._simulated&&this._draggableMoved(e)){r=!0;break}if(e&&e.listens(i,!0)){if(o&&!Vi(s,t))break;if(n.push(e),o)break}if(s===this._container)break;s=s.parentNode}return n.length||r||o||!Vi(s,t)||(n=[this]),n},_handleDOMEvent:function(t){var i;this._loaded&&!Ui(t)&&("mousedown"!==(i=t.type)&&"keypress"!==i&&"keyup"!==i&&"keydown"!==i||Pi(t.target||t.srcElement),this._fireDOMEvent(t,i))},_mouseEvents:["click","dblclick","mouseover","mouseout","contextmenu"],_fireDOMEvent:function(t,i,e){var n;if("click"===t.type&&((n=h({},t)).type="preclick",this._fireDOMEvent(n,n.type,e)),!t._stopped&&(e=(e||[]).concat(this._findEventTargets(t,i))).length){var o=e[0];"contextmenu"===i&&o.listens(i,!0)&&Ri(t);var s,r={originalEvent:t};"keypress"!==t.type&&"keydown"!==t.type&&"keyup"!==t.type&&(s=o.getLatLng&&(!o._radius||o._radius<=10),r.containerPoint=s?this.latLngToContainerPoint(o.getLatLng()):this.mouseEventToContainerPoint(t),r.layerPoint=this.containerPointToLayerPoint(r.containerPoint),r.latlng=s?o.getLatLng():this.layerPointToLatLng(r.layerPoint));for(var a=0;athis.options.zoomAnimationThreshold)return!1;var n=this.getZoomScale(i),o=this._getCenterOffset(t)._divideBy(1-1/n);return!(!0!==e.animate&&!this.getSize().contains(o))&&(M(function(){this._moveStart(!0,!1)._animateZoom(t,i,!0)},this),!0)},_animateZoom:function(t,i,e,n){this._mapPane&&(e&&(this._animatingZoom=!0,this._animateToCenter=t,this._animateToZoom=i,ci(this._mapPane,"leaflet-zoom-anim")),this.fire("zoomanim",{center:t,zoom:i,noUpdate:n}),setTimeout(p(this._onZoomTransitionEnd,this),250))},_onZoomTransitionEnd:function(){this._animatingZoom&&(this._mapPane&&_i(this._mapPane,"leaflet-zoom-anim"),this._animatingZoom=!1,this._move(this._animateToCenter,this._animateToZoom),M(function(){this._moveEnd(!0)},this))}});function Yi(t){return new Xi(t)}var Xi=S.extend({options:{position:"topright"},initialize:function(t){c(this,t)},getPosition:function(){return this.options.position},setPosition:function(t){var i=this._map;return i&&i.removeControl(this),this.options.position=t,i&&i.addControl(this),this},getContainer:function(){return this._container},addTo:function(t){this.remove(),this._map=t;var i=this._container=this.onAdd(t),e=this.getPosition(),n=t._controlCorners[e];return ci(i,"leaflet-control"),-1!==e.indexOf("bottom")?n.insertBefore(i,n.firstChild):n.appendChild(i),this._map.on("unload",this.remove,this),this},remove:function(){return this._map&&(ri(this._container),this.onRemove&&this.onRemove(this._map),this._map.off("unload",this.remove,this),this._map=null),this},_refocusOnMap:function(t){this._map&&t&&0",n=document.createElement("div");return n.innerHTML=e,n.firstChild},_addItem:function(t){var i,e=document.createElement("label"),n=this._map.hasLayer(t.layer);t.overlay?((i=document.createElement("input")).type="checkbox",i.className="leaflet-control-layers-selector",i.defaultChecked=n):i=this._createRadioElement("leaflet-base-layers_"+m(this),n),this._layerControlInputs.push(i),i.layerId=m(t.layer),zi(i,"click",this._onInputClick,this);var o=document.createElement("span");o.innerHTML=" "+t.name;var s=document.createElement("div");return e.appendChild(s),s.appendChild(i),s.appendChild(o),(t.overlay?this._overlaysList:this._baseLayersList).appendChild(e),this._checkDisabledLayers(),e},_onInputClick:function(){var t,i,e=this._layerControlInputs,n=[],o=[];this._handlingClick=!0;for(var s=e.length-1;0<=s;s--)t=e[s],i=this._getLayer(t.layerId).layer,t.checked?n.push(i):t.checked||o.push(i);for(s=0;si.options.maxZoom},_expandIfNotCollapsed:function(){return this._map&&!this.options.collapsed&&this.expand(),this},_expand:function(){return this.expand()},_collapse:function(){return this.collapse()}}),$i=Xi.extend({options:{position:"topleft",zoomInText:"+",zoomInTitle:"Zoom in",zoomOutText:"−",zoomOutTitle:"Zoom out"},onAdd:function(t){var i="leaflet-control-zoom",e=si("div",i+" leaflet-bar"),n=this.options;return this._zoomInButton=this._createButton(n.zoomInText,n.zoomInTitle,i+"-in",e,this._zoomIn),this._zoomOutButton=this._createButton(n.zoomOutText,n.zoomOutTitle,i+"-out",e,this._zoomOut),this._updateDisabled(),t.on("zoomend zoomlevelschange",this._updateDisabled,this),e},onRemove:function(t){t.off("zoomend zoomlevelschange",this._updateDisabled,this)},disable:function(){return this._disabled=!0,this._updateDisabled(),this},enable:function(){return this._disabled=!1,this._updateDisabled(),this},_zoomIn:function(t){!this._disabled&&this._map._zoomthis._map.getMinZoom()&&this._map.zoomOut(this._map.options.zoomDelta*(t.shiftKey?3:1))},_createButton:function(t,i,e,n,o){var s=si("a",e,n);return s.innerHTML=t,s.href="#",s.title=i,s.setAttribute("role","button"),s.setAttribute("aria-label",i),Oi(s),zi(s,"click",Ni),zi(s,"click",o,this),zi(s,"click",this._refocusOnMap,this),s},_updateDisabled:function(){var t=this._map,i="leaflet-disabled";_i(this._zoomInButton,i),_i(this._zoomOutButton,i),!this._disabled&&t._zoom!==t.getMinZoom()||ci(this._zoomOutButton,i),!this._disabled&&t._zoom!==t.getMaxZoom()||ci(this._zoomInButton,i)}});Ki.mergeOptions({zoomControl:!0}),Ki.addInitHook(function(){this.options.zoomControl&&(this.zoomControl=new $i,this.addControl(this.zoomControl))});var Qi=Xi.extend({options:{position:"bottomleft",maxWidth:100,metric:!0,imperial:!0},onAdd:function(t){var i="leaflet-control-scale",e=si("div",i),n=this.options;return this._addScales(n,i+"-line",e),t.on(n.updateWhenIdle?"moveend":"move",this._update,this),t.whenReady(this._update,this),e},onRemove:function(t){t.off(this.options.updateWhenIdle?"moveend":"move",this._update,this)},_addScales:function(t,i,e){t.metric&&(this._mScale=si("div",i,e)),t.imperial&&(this._iScale=si("div",i,e))},_update:function(){var t=this._map,i=t.getSize().y/2,e=t.distance(t.containerPointToLatLng([0,i]),t.containerPointToLatLng([this.options.maxWidth,i]));this._updateScales(e)},_updateScales:function(t){this.options.metric&&t&&this._updateMetric(t),this.options.imperial&&t&&this._updateImperial(t)},_updateMetric:function(t){var i=this._getRoundNum(t),e=i<1e3?i+" m":i/1e3+" km";this._updateScale(this._mScale,e,i/t)},_updateImperial:function(t){var i,e,n,o=3.2808399*t;5280Leaflet'},initialize:function(t){c(this,t),this._attributions={}},onAdd:function(t){for(var i in(t.attributionControl=this)._container=si("div","leaflet-control-attribution"),Oi(this._container),t._layers)t._layers[i].getAttribution&&this.addAttribution(t._layers[i].getAttribution());return this._update(),this._container},setPrefix:function(t){return this.options.prefix=t,this._update(),this},addAttribution:function(t){return t&&(this._attributions[t]||(this._attributions[t]=0),this._attributions[t]++,this._update()),this},removeAttribution:function(t){return t&&this._attributions[t]&&(this._attributions[t]--,this._update()),this},_update:function(){if(this._map){var t=[];for(var i in this._attributions)this._attributions[i]&&t.push(i);var e=[];this.options.prefix&&e.push(this.options.prefix),t.length&&e.push(t.join(", ")),this._container.innerHTML=e.join(" | ")}}});Ki.mergeOptions({attributionControl:!0}),Ki.addInitHook(function(){this.options.attributionControl&&(new te).addTo(this)});Xi.Layers=Ji,Xi.Zoom=$i,Xi.Scale=Qi,Xi.Attribution=te,Yi.layers=function(t,i,e){return new Ji(t,i,e)},Yi.zoom=function(t){return new $i(t)},Yi.scale=function(t){return new Qi(t)},Yi.attribution=function(t){return new te(t)};var ie=S.extend({initialize:function(t){this._map=t},enable:function(){return this._enabled||(this._enabled=!0,this.addHooks()),this},disable:function(){return this._enabled&&(this._enabled=!1,this.removeHooks()),this},enabled:function(){return!!this._enabled}});ie.addTo=function(t,i){return t.addHandler(i,this),this};var ee,ne={Events:Z},oe=bt?"touchstart mousedown":"mousedown",se={mousedown:"mouseup",touchstart:"touchend",pointerdown:"touchend",MSPointerDown:"touchend"},re={mousedown:"mousemove",touchstart:"touchmove",pointerdown:"touchmove",MSPointerDown:"touchmove"},ae=E.extend({options:{clickTolerance:3},initialize:function(t,i,e,n){c(this,n),this._element=t,this._dragStartTarget=i||t,this._preventOutline=e},enable:function(){this._enabled||(zi(this._dragStartTarget,oe,this._onDown,this),this._enabled=!0)},disable:function(){this._enabled&&(ae._dragging===this&&this.finishDrag(),Si(this._dragStartTarget,oe,this._onDown,this),this._enabled=!1,this._moved=!1)},_onDown:function(t){var i,e;!t._simulated&&this._enabled&&(this._moved=!1,li(this._element,"leaflet-zoom-anim")||ae._dragging||t.shiftKey||1!==t.which&&1!==t.button&&!t.touches||((ae._dragging=this)._preventOutline&&Pi(this._element),xi(),Xt(),this._moving||(this.fire("down"),i=t.touches?t.touches[0]:t,e=bi(this._element),this._startPoint=new k(i.clientX,i.clientY),this._parentScale=Ti(e),zi(document,re[t.type],this._onMove,this),zi(document,se[t.type],this._onUp,this))))},_onMove:function(t){var i,e;!t._simulated&&this._enabled&&(t.touches&&1i&&(e.push(t[n]),o=n);oi.max.x&&(e|=2),t.yi.max.y&&(e|=8),e}function de(t,i,e,n){var o,s=i.x,r=i.y,a=e.x-s,h=e.y-r,u=a*a+h*h;return 0this._layersMaxZoom&&this.setZoom(this._layersMaxZoom),void 0===this.options.minZoom&&this._layersMinZoom&&this.getZoom()t.y!=n.y>t.y&&t.x<(n.x-e.x)*(t.y-e.y)/(n.y-e.y)+e.x&&(u=!u);return u||Oe.prototype._containsPoint.call(this,t,!0)}});var Ne=Ce.extend({initialize:function(t,i){c(this,i),this._layers={},t&&this.addData(t)},addData:function(t){var i,e,n,o=g(t)?t:t.features;if(o){for(i=0,e=o.length;iu.x&&(l=s.x+n-u.x+h.x),s.x-l-a.x<0&&(l=s.x-a.x),s.y+e+h.y>u.y&&(c=s.y+e-u.y+h.y),s.y-c-a.y<0&&(c=s.y-a.y),(l||c)&&t.fire("autopanstart").panBy([l,c]))},_onCloseButtonClick:function(t){this._close(),Ni(t)},_getAnchor:function(){return A(this._source&&this._source._getPopupAnchor?this._source._getPopupAnchor():[0,0])}});Ki.mergeOptions({closePopupOnClick:!0}),Ki.include({openPopup:function(t,i,e){return t instanceof tn||(t=new tn(e).setContent(t)),i&&t.setLatLng(i),this.hasLayer(t)?this:(this._popup&&this._popup.options.autoClose&&this.closePopup(),this._popup=t,this.addLayer(t))},closePopup:function(t){return t&&t!==this._popup||(t=this._popup,this._popup=null),t&&this.removeLayer(t),this}}),Me.include({bindPopup:function(t,i){return t instanceof tn?(c(t,i),(this._popup=t)._source=this):(this._popup&&!i||(this._popup=new tn(i,this)),this._popup.setContent(t)),this._popupHandlersAdded||(this.on({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!0),this},unbindPopup:function(){return this._popup&&(this.off({click:this._openPopup,keypress:this._onKeyPress,remove:this.closePopup,move:this._movePopup}),this._popupHandlersAdded=!1,this._popup=null),this},openPopup:function(t,i){return this._popup&&this._map&&(i=this._popup._prepareOpen(this,t,i),this._map.openPopup(this._popup,i)),this},closePopup:function(){return this._popup&&this._popup._close(),this},togglePopup:function(t){return this._popup&&(this._popup._map?this.closePopup():this.openPopup(t)),this},isPopupOpen:function(){return!!this._popup&&this._popup.isOpen()},setPopupContent:function(t){return this._popup&&this._popup.setContent(t),this},getPopup:function(){return this._popup},_openPopup:function(t){var i=t.layer||t.target;this._popup&&this._map&&(Ni(t),i instanceof Be?this.openPopup(t.layer||t.target,t.latlng):this._map.hasLayer(this._popup)&&this._popup._source===i?this.closePopup():this.openPopup(i,t.latlng))},_movePopup:function(t){this._popup.setLatLng(t.latlng)},_onKeyPress:function(t){13===t.originalEvent.keyCode&&this._openPopup(t)}});var en=Qe.extend({options:{pane:"tooltipPane",offset:[0,0],direction:"auto",permanent:!1,sticky:!1,interactive:!1,opacity:.9},onAdd:function(t){Qe.prototype.onAdd.call(this,t),this.setOpacity(this.options.opacity),t.fire("tooltipopen",{tooltip:this}),this._source&&this._source.fire("tooltipopen",{tooltip:this},!0)},onRemove:function(t){Qe.prototype.onRemove.call(this,t),t.fire("tooltipclose",{tooltip:this}),this._source&&this._source.fire("tooltipclose",{tooltip:this},!0)},getEvents:function(){var t=Qe.prototype.getEvents.call(this);return bt&&!this.options.permanent&&(t.preclick=this._close),t},_close:function(){this._map&&this._map.closeTooltip(this)},_initLayout:function(){var t="leaflet-tooltip "+(this.options.className||"")+" leaflet-zoom-"+(this._zoomAnimated?"animated":"hide");this._contentNode=this._container=si("div",t)},_updateLayout:function(){},_adjustPan:function(){},_setPosition:function(t){var i,e=this._map,n=this._container,o=e.latLngToContainerPoint(e.getCenter()),s=e.layerPointToContainerPoint(t),r=this.options.direction,a=n.offsetWidth,h=n.offsetHeight,u=A(this.options.offset),l=this._getAnchor(),c="top"===r?(i=a/2,h):"bottom"===r?(i=a/2,0):(i="center"===r?a/2:"right"===r?0:"left"===r?a:s.xthis.options.maxZoom||nthis.options.maxZoom||void 0!==this.options.minZoom&&oe.max.x)||!i.wrapLat&&(t.ye.max.y))return!1}if(!this.options.bounds)return!0;var n=this._tileCoordsToBounds(t);return N(this.options.bounds).overlaps(n)},_keyToBounds:function(t){return this._tileCoordsToBounds(this._keyToTileCoords(t))},_tileCoordsToNwSe:function(t){var i=this._map,e=this.getTileSize(),n=t.scaleBy(e),o=n.add(e);return[i.unproject(n,t.z),i.unproject(o,t.z)]},_tileCoordsToBounds:function(t){var i=this._tileCoordsToNwSe(t),e=new R(i[0],i[1]);return this.options.noWrap||(e=this._map.wrapLatLngBounds(e)),e},_tileCoordsToKey:function(t){return t.x+":"+t.y+":"+t.z},_keyToTileCoords:function(t){var i=t.split(":"),e=new k(+i[0],+i[1]);return e.z=+i[2],e},_removeTile:function(t){var i=this._tiles[t];i&&(ri(i.el),delete this._tiles[t],this.fire("tileunload",{tile:i.el,coords:this._keyToTileCoords(t)}))},_initTile:function(t){ci(t,"leaflet-tile");var i=this.getTileSize();t.style.width=i.x+"px",t.style.height=i.y+"px",t.onselectstart=a,t.onmousemove=a,it&&this.options.opacity<1&&mi(t,this.options.opacity),ot&&!st&&(t.style.WebkitBackfaceVisibility="hidden")},_addTile:function(t,i){var e=this._getTilePos(t),n=this._tileCoordsToKey(t),o=this.createTile(this._wrapCoords(t),p(this._tileReady,this,t));this._initTile(o),this.createTile.length<2&&M(p(this._tileReady,this,t,null,o)),vi(o,e),this._tiles[n]={el:o,coords:t,current:!0},i.appendChild(o),this.fire("tileloadstart",{tile:o,coords:t})},_tileReady:function(t,i,e){i&&this.fire("tileerror",{error:i,tile:e,coords:t});var n=this._tileCoordsToKey(t);(e=this._tiles[n])&&(e.loaded=+new Date,this._map._fadeAnimated?(mi(e.el,0),z(this._fadeFrame),this._fadeFrame=M(this._updateOpacity,this)):(e.active=!0,this._pruneTiles()),i||(ci(e.el,"leaflet-tile-loaded"),this.fire("tileload",{tile:e.el,coords:t})),this._noTilesToLoad()&&(this._loading=!1,this.fire("load"),it||!this._map._fadeAnimated?M(this._pruneTiles,this):setTimeout(p(this._pruneTiles,this),250)))},_getTilePos:function(t){return t.scaleBy(this.getTileSize()).subtract(this._level.origin)},_wrapCoords:function(t){var i=new k(this._wrapX?o(t.x,this._wrapX):t.x,this._wrapY?o(t.y,this._wrapY):t.y);return i.z=t.z,i},_pxBoundsToTileRange:function(t){var i=this.getTileSize();return new I(t.min.unscaleBy(i).floor(),t.max.unscaleBy(i).ceil().subtract([1,1]))},_noTilesToLoad:function(){for(var t in this._tiles)if(!this._tiles[t].loaded)return!1;return!0}});var sn=on.extend({options:{minZoom:0,maxZoom:18,subdomains:"abc",errorTileUrl:"",zoomOffset:0,tms:!1,zoomReverse:!1,detectRetina:!1,crossOrigin:!1},initialize:function(t,i){this._url=t,(i=c(this,i)).detectRetina&&zt&&0')}}catch(t){return function(t){return document.createElement("<"+t+' xmlns="urn:schemas-microsoft.com:vml" class="lvml">')}}}(),_n={_initContainer:function(){this._container=si("div","leaflet-vml-container")},_update:function(){this._map._animatingZoom||(hn.prototype._update.call(this),this.fire("update"))},_initPath:function(t){var i=t._container=cn("shape");ci(i,"leaflet-vml-shape "+(this.options.className||"")),i.coordsize="1 1",t._path=cn("path"),i.appendChild(t._path),this._updateStyle(t),this._layers[m(t)]=t},_addPath:function(t){var i=t._container;this._container.appendChild(i),t.options.interactive&&t.addInteractiveTarget(i)},_removePath:function(t){var i=t._container;ri(i),t.removeInteractiveTarget(i),delete this._layers[m(t)]},_updateStyle:function(t){var i=t._stroke,e=t._fill,n=t.options,o=t._container;o.stroked=!!n.stroke,o.filled=!!n.fill,n.stroke?(i=i||(t._stroke=cn("stroke")),o.appendChild(i),i.weight=n.weight+"px",i.color=n.color,i.opacity=n.opacity,n.dashArray?i.dashStyle=g(n.dashArray)?n.dashArray.join(" "):n.dashArray.replace(/( *, *)/g," "):i.dashStyle="",i.endcap=n.lineCap.replace("butt","flat"),i.joinstyle=n.lineJoin):i&&(o.removeChild(i),t._stroke=null),n.fill?(e=e||(t._fill=cn("fill")),o.appendChild(e),e.color=n.fillColor||n.color,e.opacity=n.fillOpacity):e&&(o.removeChild(e),t._fill=null)},_updateCircle:function(t){var i=t._point.round(),e=Math.round(t._radius),n=Math.round(t._radiusY||e);this._setPath(t,t._empty()?"M0 0":"AL "+i.x+","+i.y+" "+e+","+n+" 0,23592600")},_setPath:function(t,i){t._path.v=i},_bringToFront:function(t){hi(t._container)},_bringToBack:function(t){ui(t._container)}},dn=Et?cn:J,pn=hn.extend({getEvents:function(){var t=hn.prototype.getEvents.call(this);return t.zoomstart=this._onZoomStart,t},_initContainer:function(){this._container=dn("svg"),this._container.setAttribute("pointer-events","none"),this._rootGroup=dn("g"),this._container.appendChild(this._rootGroup)},_destroyContainer:function(){ri(this._container),Si(this._container),delete this._container,delete this._rootGroup,delete this._svgSize},_onZoomStart:function(){this._update()},_update:function(){var t,i,e;this._map._animatingZoom&&this._bounds||(hn.prototype._update.call(this),i=(t=this._bounds).getSize(),e=this._container,this._svgSize&&this._svgSize.equals(i)||(this._svgSize=i,e.setAttribute("width",i.x),e.setAttribute("height",i.y)),vi(e,t.min),e.setAttribute("viewBox",[t.min.x,t.min.y,i.x,i.y].join(" ")),this.fire("update"))},_initPath:function(t){var i=t._path=dn("path");t.options.className&&ci(i,t.options.className),t.options.interactive&&ci(i,"leaflet-interactive"),this._updateStyle(t),this._layers[m(t)]=t},_addPath:function(t){this._rootGroup||this._initContainer(),this._rootGroup.appendChild(t._path),t.addInteractiveTarget(t._path)},_removePath:function(t){ri(t._path),t.removeInteractiveTarget(t._path),delete this._layers[m(t)]},_updatePath:function(t){t._project(),t._update()},_updateStyle:function(t){var i=t._path,e=t.options;i&&(e.stroke?(i.setAttribute("stroke",e.color),i.setAttribute("stroke-opacity",e.opacity),i.setAttribute("stroke-width",e.weight),i.setAttribute("stroke-linecap",e.lineCap),i.setAttribute("stroke-linejoin",e.lineJoin),e.dashArray?i.setAttribute("stroke-dasharray",e.dashArray):i.removeAttribute("stroke-dasharray"),e.dashOffset?i.setAttribute("stroke-dashoffset",e.dashOffset):i.removeAttribute("stroke-dashoffset")):i.setAttribute("stroke","none"),e.fill?(i.setAttribute("fill",e.fillColor||e.color),i.setAttribute("fill-opacity",e.fillOpacity),i.setAttribute("fill-rule",e.fillRule||"evenodd")):i.setAttribute("fill","none"))},_updatePoly:function(t,i){this._setPath(t,$(t._parts,i))},_updateCircle:function(t){var i=t._point,e=Math.max(Math.round(t._radius),1),n="a"+e+","+(Math.max(Math.round(t._radiusY),1)||e)+" 0 1,0 ",o=t._empty()?"M0 0":"M"+(i.x-e)+","+i.y+n+2*e+",0 "+n+2*-e+",0 ";this._setPath(t,o)},_setPath:function(t,i){t._path.setAttribute("d",i)},_bringToFront:function(t){hi(t._path)},_bringToBack:function(t){ui(t._path)}});function mn(t){return Zt||Et?new pn(t):null}Et&&pn.include(_n),Ki.include({getRenderer:function(t){var i=(i=t.options.renderer||this._getPaneRenderer(t.options.pane)||this.options.renderer||this._renderer)||(this._renderer=this._createRenderer());return this.hasLayer(i)||this.addLayer(i),i},_getPaneRenderer:function(t){if("overlayPane"===t||void 0===t)return!1;var i=this._paneRenderers[t];return void 0===i&&(i=this._createRenderer({pane:t}),this._paneRenderers[t]=i),i},_createRenderer:function(t){return this.options.preferCanvas&&ln(t)||mn(t)}});var fn=Re.extend({initialize:function(t,i){Re.prototype.initialize.call(this,this._boundsToLatLngs(t),i)},setBounds:function(t){return this.setLatLngs(this._boundsToLatLngs(t))},_boundsToLatLngs:function(t){return[(t=N(t)).getSouthWest(),t.getNorthWest(),t.getNorthEast(),t.getSouthEast()]}});pn.create=dn,pn.pointsToPath=$,Ne.geometryToLayer=De,Ne.coordsToLatLng=We,Ne.coordsToLatLngs=He,Ne.latLngToCoords=Fe,Ne.latLngsToCoords=Ue,Ne.getFeature=Ve,Ne.asFeature=qe,Ki.mergeOptions({boxZoom:!0});var gn=ie.extend({initialize:function(t){this._map=t,this._container=t._container,this._pane=t._panes.overlayPane,this._resetStateTimeout=0,t.on("unload",this._destroy,this)},addHooks:function(){zi(this._container,"mousedown",this._onMouseDown,this)},removeHooks:function(){Si(this._container,"mousedown",this._onMouseDown,this)},moved:function(){return this._moved},_destroy:function(){ri(this._pane),delete this._pane},_resetState:function(){this._resetStateTimeout=0,this._moved=!1},_clearDeferredResetState:function(){0!==this._resetStateTimeout&&(clearTimeout(this._resetStateTimeout),this._resetStateTimeout=0)},_onMouseDown:function(t){if(!t.shiftKey||1!==t.which&&1!==t.button)return!1;this._clearDeferredResetState(),this._resetState(),Xt(),xi(),this._startPoint=this._map.mouseEventToContainerPoint(t),zi(document,{contextmenu:Ni,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseMove:function(t){this._moved||(this._moved=!0,this._box=si("div","leaflet-zoom-box",this._container),ci(this._container,"leaflet-crosshair"),this._map.fire("boxzoomstart")),this._point=this._map.mouseEventToContainerPoint(t);var i=new I(this._point,this._startPoint),e=i.getSize();vi(this._box,i.min),this._box.style.width=e.x+"px",this._box.style.height=e.y+"px"},_finish:function(){this._moved&&(ri(this._box),_i(this._container,"leaflet-crosshair")),Jt(),wi(),Si(document,{contextmenu:Ni,mousemove:this._onMouseMove,mouseup:this._onMouseUp,keydown:this._onKeyDown},this)},_onMouseUp:function(t){var i;1!==t.which&&1!==t.button||(this._finish(),this._moved&&(this._clearDeferredResetState(),this._resetStateTimeout=setTimeout(p(this._resetState,this),0),i=new R(this._map.containerPointToLatLng(this._startPoint),this._map.containerPointToLatLng(this._point)),this._map.fitBounds(i).fire("boxzoomend",{boxZoomBounds:i})))},_onKeyDown:function(t){27===t.keyCode&&this._finish()}});Ki.addInitHook("addHandler","boxZoom",gn),Ki.mergeOptions({doubleClickZoom:!0});var vn=ie.extend({addHooks:function(){this._map.on("dblclick",this._onDoubleClick,this)},removeHooks:function(){this._map.off("dblclick",this._onDoubleClick,this)},_onDoubleClick:function(t){var i=this._map,e=i.getZoom(),n=i.options.zoomDelta,o=t.originalEvent.shiftKey?e-n:e+n;"center"===i.options.doubleClickZoom?i.setZoom(o):i.setZoomAround(t.containerPoint,o)}});Ki.addInitHook("addHandler","doubleClickZoom",vn),Ki.mergeOptions({dragging:!0,inertia:!st,inertiaDeceleration:3400,inertiaMaxSpeed:1/0,easeLinearity:.2,worldCopyJump:!1,maxBoundsViscosity:0});var yn=ie.extend({addHooks:function(){var t;this._draggable||(t=this._map,this._draggable=new ae(t._mapPane,t._container),this._draggable.on({dragstart:this._onDragStart,drag:this._onDrag,dragend:this._onDragEnd},this),this._draggable.on("predrag",this._onPreDragLimit,this),t.options.worldCopyJump&&(this._draggable.on("predrag",this._onPreDragWrap,this),t.on("zoomend",this._onZoomEnd,this),t.whenReady(this._onZoomEnd,this))),ci(this._map._container,"leaflet-grab leaflet-touch-drag"),this._draggable.enable(),this._positions=[],this._times=[]},removeHooks:function(){_i(this._map._container,"leaflet-grab"),_i(this._map._container,"leaflet-touch-drag"),this._draggable.disable()},moved:function(){return this._draggable&&this._draggable._moved},moving:function(){return this._draggable&&this._draggable._moving},_onDragStart:function(){var t,i=this._map;i._stop(),this._map.options.maxBounds&&this._map.options.maxBoundsViscosity?(t=N(this._map.options.maxBounds),this._offsetLimit=O(this._map.latLngToContainerPoint(t.getNorthWest()).multiplyBy(-1),this._map.latLngToContainerPoint(t.getSouthEast()).multiplyBy(-1).add(this._map.getSize())),this._viscosity=Math.min(1,Math.max(0,this._map.options.maxBoundsViscosity))):this._offsetLimit=null,i.fire("movestart").fire("dragstart"),i.options.inertia&&(this._positions=[],this._times=[])},_onDrag:function(t){var i,e;this._map.options.inertia&&(i=this._lastTime=+new Date,e=this._lastPos=this._draggable._absPos||this._draggable._newPos,this._positions.push(e),this._times.push(i),this._prunePositions(i)),this._map.fire("move",t).fire("drag",t)},_prunePositions:function(t){for(;1i.max.x&&(t.x=this._viscousLimit(t.x,i.max.x)),t.y>i.max.y&&(t.y=this._viscousLimit(t.y,i.max.y)),this._draggable._newPos=this._draggable._startPos.add(t))},_onPreDragWrap:function(){var t=this._worldWidth,i=Math.round(t/2),e=this._initialWorldOffset,n=this._draggable._newPos.x,o=(n-i+e)%t+i-e,s=(n+i+e)%t-i-e,r=Math.abs(o+e)i.getMaxZoom()&&1=i;)t=t.__parent;return this._currentShownBounds.contains(t.getLatLng())&&(this.options.animateAddingMarkers?this._animationAddLayer(e,t):this._animationAddLayerNonAnimated(e,t)),this},removeLayer:function(e){return e instanceof L.LayerGroup?this.removeLayers([e]):e.getLatLng?this._map?e.__parent?(this._unspiderfy&&(this._unspiderfy(),this._unspiderfyLayer(e)),this._removeLayer(e,!0),this._topClusterLevel._recalculateBounds(),e.off("move",this._childMarkerMoved,this),this._featureGroup.hasLayer(e)&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow()),this):this:(!this._arraySplice(this._needsClustering,e)&&this.hasLayer(e)&&this._needsRemoving.push(e),this):(this._nonPointGroup.removeLayer(e),this)},addLayers:function(e){if(!L.Util.isArray(e))return this.addLayer(e);var t,i=this._featureGroup,n=this._nonPointGroup,s=this.options.chunkedLoading,r=this.options.chunkInterval,o=this.options.chunkProgress,a=e.length,h=0,u=!0;if(this._map){var l=(new Date).getTime(),_=L.bind(function(){for(var d=(new Date).getTime();a>h;h++){if(s&&0===h%200){var c=(new Date).getTime()-d;if(c>r)break}if(t=e[h],t instanceof L.LayerGroup)u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(t,e),a=e.length;else if(t.getLatLng){if(!this.hasLayer(t)&&(this._addLayer(t,this._maxZoom),t.__parent&&2===t.__parent.getChildCount())){var p=t.__parent.getAllChildMarkers(),f=p[0]===t?p[1]:p[0];i.removeLayer(f)}}else n.addLayer(t)}o&&o(h,a,(new Date).getTime()-l),h===a?(this._topClusterLevel._recalculateBounds(),this._featureGroup.eachLayer(function(e){e instanceof L.MarkerCluster&&e._iconNeedsUpdate&&e._updateIcon()}),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds)):setTimeout(_,this.options.chunkDelay)},this);_()}else for(var d=this._needsClustering;a>h;h++)t=e[h],t instanceof L.LayerGroup?(u&&(e=e.slice(),u=!1),this._extractNonGroupLayers(t,e),a=e.length):t.getLatLng?this.hasLayer(t)||d.push(t):n.addLayer(t);return this},removeLayers:function(e){var t,i,n=e.length,s=this._featureGroup,r=this._nonPointGroup,o=!0;if(!this._map){for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):(this._arraySplice(this._needsClustering,i),r.removeLayer(i),this.hasLayer(i)&&this._needsRemoving.push(i));return this}if(this._unspiderfy){this._unspiderfy();var a=e.slice(),h=n;for(t=0;h>t;t++)i=a[t],i instanceof L.LayerGroup?(this._extractNonGroupLayers(i,a),h=a.length):this._unspiderfyLayer(i)}for(t=0;n>t;t++)i=e[t],i instanceof L.LayerGroup?(o&&(e=e.slice(),o=!1),this._extractNonGroupLayers(i,e),n=e.length):i.__parent?(this._removeLayer(i,!0,!0),s.hasLayer(i)&&(s.removeLayer(i),i.clusterShow&&i.clusterShow())):r.removeLayer(i);return this._topClusterLevel._recalculateBounds(),this._topClusterLevel._recursivelyAddChildrenToMap(null,this._zoom,this._currentShownBounds),s.eachLayer(function(e){e instanceof L.MarkerCluster&&e._updateIcon()}),this},clearLayers:function(){return this._map||(this._needsClustering=[],delete this._gridClusters,delete this._gridUnclustered),this._noanimationUnspiderfy&&this._noanimationUnspiderfy(),this._featureGroup.clearLayers(),this._nonPointGroup.clearLayers(),this.eachLayer(function(e){e.off("move",this._childMarkerMoved,this),delete e.__parent}),this._map&&this._generateInitialClusters(),this},getBounds:function(){var e=new L.LatLngBounds;this._topClusterLevel&&e.extend(this._topClusterLevel._bounds);for(var t=this._needsClustering.length-1;t>=0;t--)e.extend(this._needsClustering[t].getLatLng());return e.extend(this._nonPointGroup.getBounds()),e},eachLayer:function(e,t){var i,n=this._needsClustering.slice(),s=this._needsRemoving;for(this._topClusterLevel&&this._topClusterLevel.getAllChildMarkers(n),i=n.length-1;i>=0;i--)-1===s.indexOf(n[i])&&e.call(t,n[i]);this._nonPointGroup.eachLayer(e,t)},getLayers:function(){var e=[];return this.eachLayer(function(t){e.push(t)}),e},getLayer:function(e){var t=null;return e=parseInt(e,10),this.eachLayer(function(i){L.stamp(i)===e&&(t=i)}),t},hasLayer:function(e){if(!e)return!1;var t,i=this._needsClustering;for(t=i.length-1;t>=0;t--)if(i[t]===e)return!0;for(i=this._needsRemoving,t=i.length-1;t>=0;t--)if(i[t]===e)return!1;return!(!e.__parent||e.__parent._group!==this)||this._nonPointGroup.hasLayer(e)},zoomToShowLayer:function(e,t){"function"!=typeof t&&(t=function(){});var i=function(){!e._icon&&!e.__parent._icon||this._inZoomAnimation||(this._map.off("moveend",i,this),this.off("animationend",i,this),e._icon?t():e.__parent._icon&&(this.once("spiderfied",t,this),e.__parent.spiderfy()))};if(e._icon&&this._map.getBounds().contains(e.getLatLng()))t();else if(e.__parent._zoomt;t++)n=this._needsRemoving[t],this._removeLayer(n,!0);this._needsRemoving=[],this._zoom=this._map.getZoom(),this._currentShownBounds=this._getExpandedVisibleBounds(),this._map.on("zoomend",this._zoomEnd,this),this._map.on("moveend",this._moveEnd,this),this._spiderfierOnAdd&&this._spiderfierOnAdd(),this._bindEvents(),i=this._needsClustering,this._needsClustering=[],this.addLayers(i)},onRemove:function(e){e.off("zoomend",this._zoomEnd,this),e.off("moveend",this._moveEnd,this),this._unbindEvents(),this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim",""),this._spiderfierOnRemove&&this._spiderfierOnRemove(),delete this._maxLat,this._hideCoverage(),this._featureGroup.remove(),this._nonPointGroup.remove(),this._featureGroup.clearLayers(),this._map=null},getVisibleParent:function(e){for(var t=e;t&&!t._icon;)t=t.__parent;return t||null},_arraySplice:function(e,t){for(var i=e.length-1;i>=0;i--)if(e[i]===t)return e.splice(i,1),!0},_removeFromGridUnclustered:function(e,t){for(var i=this._map,n=this._gridUnclustered;t>=0&&n[t].removeObject(e,i.project(e.getLatLng(),t));t--);},_childMarkerMoved:function(e){this._ignoreMove||(e.target._latlng=e.oldLatLng,this.removeLayer(e.target),e.target._latlng=e.latlng,this.addLayer(e.target))},_removeLayer:function(e,t,i){var n=this._gridClusters,s=this._gridUnclustered,r=this._featureGroup,o=this._map;t&&this._removeFromGridUnclustered(e,this._maxZoom);var a,h=e.__parent,u=h._markers;for(this._arraySplice(u,e);h&&(h._childCount--,h._boundsNeedUpdate=!0,!(h._zoom<0));)t&&h._childCount<=1?(a=h._markers[0]===e?h._markers[1]:h._markers[0],n[h._zoom].removeObject(h,o.project(h._cLatLng,h._zoom)),s[h._zoom].addObject(a,o.project(a.getLatLng(),h._zoom)),this._arraySplice(h.__parent._childClusters,h),h.__parent._markers.push(a),a.__parent=h.__parent,h._icon&&(r.removeLayer(h),i||r.addLayer(a))):i&&h._icon||h._updateIcon(),h=h.__parent;delete e.__parent},_isOrIsParent:function(e,t){for(;t;){if(e===t)return!0;t=t.parentNode}return!1},fire:function(e,t,i){if(t&&t.layer instanceof L.MarkerCluster){if(t.originalEvent&&this._isOrIsParent(t.layer._icon,t.originalEvent.relatedTarget))return;e="cluster"+e}L.FeatureGroup.prototype.fire.call(this,e,t,i)},listens:function(e,t){return L.FeatureGroup.prototype.listens.call(this,e,t)||L.FeatureGroup.prototype.listens.call(this,"cluster"+e,t)},_defaultIconCreateFunction:function(e){var t=e.getChildCount(),i=" marker-cluster-";return i+=10>t?"small":100>t?"medium":"large",new L.DivIcon({html:"
"+t+"
",className:"marker-cluster"+i,iconSize:new L.Point(40,40)})},_bindEvents:function(){var e=this._map,t=this.options.spiderfyOnMaxZoom,i=this.options.showCoverageOnHover,n=this.options.zoomToBoundsOnClick;(t||n)&&this.on("clusterclick",this._zoomOrSpiderfy,this),i&&(this.on("clustermouseover",this._showCoverage,this),this.on("clustermouseout",this._hideCoverage,this),e.on("zoomend",this._hideCoverage,this))},_zoomOrSpiderfy:function(e){for(var t=e.layer,i=t;1===i._childClusters.length;)i=i._childClusters[0];i._zoom===this._maxZoom&&i._childCount===t._childCount&&this.options.spiderfyOnMaxZoom?t.spiderfy():this.options.zoomToBoundsOnClick&&t.zoomToBounds(),e.originalEvent&&13===e.originalEvent.keyCode&&this._map._container.focus()},_showCoverage:function(e){var t=this._map;this._inZoomAnimation||(this._shownPolygon&&t.removeLayer(this._shownPolygon),e.layer.getChildCount()>2&&e.layer!==this._spiderfied&&(this._shownPolygon=new L.Polygon(e.layer.getConvexHull(),this.options.polygonOptions),t.addLayer(this._shownPolygon)))},_hideCoverage:function(){this._shownPolygon&&(this._map.removeLayer(this._shownPolygon),this._shownPolygon=null)},_unbindEvents:function(){var e=this.options.spiderfyOnMaxZoom,t=this.options.showCoverageOnHover,i=this.options.zoomToBoundsOnClick,n=this._map;(e||i)&&this.off("clusterclick",this._zoomOrSpiderfy,this),t&&(this.off("clustermouseover",this._showCoverage,this),this.off("clustermouseout",this._hideCoverage,this),n.off("zoomend",this._hideCoverage,this))},_zoomEnd:function(){this._map&&(this._mergeSplitClusters(),this._zoom=Math.round(this._map._zoom),this._currentShownBounds=this._getExpandedVisibleBounds())},_moveEnd:function(){if(!this._inZoomAnimation){var e=this._getExpandedVisibleBounds();this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,this._zoom,e),this._topClusterLevel._recursivelyAddChildrenToMap(null,Math.round(this._map._zoom),e),this._currentShownBounds=e}},_generateInitialClusters:function(){var e=this._map.getMaxZoom(),t=this.options.maxClusterRadius,i=t;"function"!=typeof t&&(i=function(){return t}),this.options.disableClusteringAtZoom&&(e=this.options.disableClusteringAtZoom-1),this._maxZoom=e,this._gridClusters={},this._gridUnclustered={};for(var n=e;n>=0;n--)this._gridClusters[n]=new L.DistanceGrid(i(n)),this._gridUnclustered[n]=new L.DistanceGrid(i(n));this._topClusterLevel=new this._markerCluster(this,-1)},_addLayer:function(e,t){var i,n,s=this._gridClusters,r=this._gridUnclustered;for(this.options.singleMarkerMode&&this._overrideMarkerIcon(e),e.on("move",this._childMarkerMoved,this);t>=0;t--){i=this._map.project(e.getLatLng(),t);var o=s[t].getNearObject(i);if(o)return o._addChild(e),e.__parent=o,void 0;if(o=r[t].getNearObject(i)){var a=o.__parent;a&&this._removeLayer(o,!1);var h=new this._markerCluster(this,t,o,e);s[t].addObject(h,this._map.project(h._cLatLng,t)),o.__parent=h,e.__parent=h;var u=h;for(n=t-1;n>a._zoom;n--)u=new this._markerCluster(this,n,u),s[n].addObject(u,this._map.project(o.getLatLng(),n));return a._addChild(u),this._removeFromGridUnclustered(o,t),void 0}r[t].addObject(e,i)}this._topClusterLevel._addChild(e),e.__parent=this._topClusterLevel},_enqueue:function(e){this._queue.push(e),this._queueTimeout||(this._queueTimeout=setTimeout(L.bind(this._processQueue,this),300))},_processQueue:function(){for(var e=0;ee?(this._animationStart(),this._animationZoomOut(this._zoom,e)):this._moveEnd()},_getExpandedVisibleBounds:function(){return this.options.removeOutsideVisibleBounds?L.Browser.mobile?this._checkBoundsMaxLat(this._map.getBounds()):this._checkBoundsMaxLat(this._map.getBounds().pad(1)):this._mapBoundsInfinite},_checkBoundsMaxLat:function(e){var t=this._maxLat;return t!==i&&(e.getNorth()>=t&&(e._northEast.lat=1/0),e.getSouth()<=-t&&(e._southWest.lat=-1/0)),e},_animationAddLayerNonAnimated:function(e,t){if(t===e)this._featureGroup.addLayer(e);else if(2===t._childCount){t._addToMap();var i=t.getAllChildMarkers();this._featureGroup.removeLayer(i[0]),this._featureGroup.removeLayer(i[1])}else t._updateIcon()},_extractNonGroupLayers:function(e,t){var i,n=e.getLayers(),s=0;for(t=t||[];s=0;i--)o=h[i],n.contains(o._latlng)||s.removeLayer(o)}),this._forceLayout(),this._topClusterLevel._recursivelyBecomeVisible(n,t),s.eachLayer(function(e){e instanceof L.MarkerCluster||!e._icon||e.clusterShow()}),this._topClusterLevel._recursively(n,e,t,function(e){e._recursivelyRestoreChildPositions(t)}),this._ignoreMove=!1,this._enqueue(function(){this._topClusterLevel._recursively(n,e,0,function(e){s.removeLayer(e),e.clusterShow()}),this._animationEnd()})},_animationZoomOut:function(e,t){this._animationZoomOutSingle(this._topClusterLevel,e-1,t),this._topClusterLevel._recursivelyAddChildrenToMap(null,t,this._getExpandedVisibleBounds()),this._topClusterLevel._recursivelyRemoveChildrenFromMap(this._currentShownBounds,e,this._getExpandedVisibleBounds())},_animationAddLayer:function(e,t){var i=this,n=this._featureGroup;n.addLayer(e),t!==e&&(t._childCount>2?(t._updateIcon(),this._forceLayout(),this._animationStart(),e._setPos(this._map.latLngToLayerPoint(t.getLatLng())),e.clusterHide(),this._enqueue(function(){n.removeLayer(e),e.clusterShow(),i._animationEnd()})):(this._forceLayout(),i._animationStart(),i._animationZoomOutSingle(t,this._map.getMaxZoom(),this._map.getZoom())))}},_animationZoomOutSingle:function(e,t,i){var n=this._getExpandedVisibleBounds();e._recursivelyAnimateChildrenInAndAddSelfToMap(n,t+1,i);var s=this;this._forceLayout(),e._recursivelyBecomeVisible(n,i),this._enqueue(function(){if(1===e._childCount){var r=e._markers[0];this._ignoreMove=!0,r.setLatLng(r.getLatLng()),this._ignoreMove=!1,r.clusterShow&&r.clusterShow()}else e._recursively(n,i,0,function(e){e._recursivelyRemoveChildrenFromMap(n,t+1)});s._animationEnd()})},_animationEnd:function(){this._map&&(this._map._mapPane.className=this._map._mapPane.className.replace(" leaflet-cluster-anim","")),this._inZoomAnimation--,this.fire("animationend")},_forceLayout:function(){L.Util.falseFn(t.body.offsetWidth)}}),L.markerClusterGroup=function(e){return new L.MarkerClusterGroup(e)},L.MarkerCluster=L.Marker.extend({initialize:function(e,t,i,n){L.Marker.prototype.initialize.call(this,i?i._cLatLng||i.getLatLng():new L.LatLng(0,0),{icon:this}),this._group=e,this._zoom=t,this._markers=[],this._childClusters=[],this._childCount=0,this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._bounds=new L.LatLngBounds,i&&this._addChild(i),n&&this._addChild(n)},getAllChildMarkers:function(e){e=e||[];for(var t=this._childClusters.length-1;t>=0;t--)this._childClusters[t].getAllChildMarkers(e);for(var i=this._markers.length-1;i>=0;i--)e.push(this._markers[i]);return e},getChildCount:function(){return this._childCount},zoomToBounds:function(){for(var e,t=this._childClusters.slice(),i=this._group._map,n=i.getBoundsZoom(this._bounds),s=this._zoom+1,r=i.getZoom();t.length>0&&n>s;){s++;var o=[];for(e=0;es?this._group._map.setView(this._latlng,s):r>=n?this._group._map.setView(this._latlng,r+1):this._group._map.fitBounds(this._bounds)},getBounds:function(){var e=new L.LatLngBounds;return e.extend(this._bounds),e},_updateIcon:function(){this._iconNeedsUpdate=!0,this._icon&&this.setIcon(this)},createIcon:function(){return this._iconNeedsUpdate&&(this._iconObj=this._group.options.iconCreateFunction(this),this._iconNeedsUpdate=!1),this._iconObj.createIcon()},createShadow:function(){return this._iconObj.createShadow()},_addChild:function(e,t){this._iconNeedsUpdate=!0,this._boundsNeedUpdate=!0,this._setClusterCenter(e),e instanceof L.MarkerCluster?(t||(this._childClusters.push(e),e.__parent=this),this._childCount+=e._childCount):(t||this._markers.push(e),this._childCount++),this.__parent&&this.__parent._addChild(e,!0)},_setClusterCenter:function(e){this._cLatLng||(this._cLatLng=e._cLatLng||e._latlng)},_resetBounds:function(){var e=this._bounds;e._southWest&&(e._southWest.lat=1/0,e._southWest.lng=1/0),e._northEast&&(e._northEast.lat=-1/0,e._northEast.lng=-1/0)},_recalculateBounds:function(){var e,t,i,n,s=this._markers,r=this._childClusters,o=0,a=0,h=this._childCount;if(0!==h){for(this._resetBounds(),e=0;e=0;i--)n=s[i],n._icon&&(n._setPos(t),n.clusterHide())},function(e){var i,n,s=e._childClusters;for(i=s.length-1;i>=0;i--)n=s[i],n._icon&&(n._setPos(t),n.clusterHide())})},_recursivelyAnimateChildrenInAndAddSelfToMap:function(e,t,i){this._recursively(e,i,0,function(n){n._recursivelyAnimateChildrenIn(e,n._group._map.latLngToLayerPoint(n.getLatLng()).round(),t),n._isSingleParent()&&t-1===i?(n.clusterShow(),n._recursivelyRemoveChildrenFromMap(e,t)):n.clusterHide(),n._addToMap()})},_recursivelyBecomeVisible:function(e,t){this._recursively(e,0,t,null,function(e){e.clusterShow()})},_recursivelyAddChildrenToMap:function(e,t,i){this._recursively(i,-1,t,function(n){if(t!==n._zoom)for(var s=n._markers.length-1;s>=0;s--){var r=n._markers[s];i.contains(r._latlng)&&(e&&(r._backupLatlng=r.getLatLng(),r.setLatLng(e),r.clusterHide&&r.clusterHide()),n._group._featureGroup.addLayer(r))}},function(t){t._addToMap(e)})},_recursivelyRestoreChildPositions:function(e){for(var t=this._markers.length-1;t>=0;t--){var i=this._markers[t];i._backupLatlng&&(i.setLatLng(i._backupLatlng),delete i._backupLatlng)}if(e-1===this._zoom)for(var n=this._childClusters.length-1;n>=0;n--)this._childClusters[n]._restorePosition();else for(var s=this._childClusters.length-1;s>=0;s--)this._childClusters[s]._recursivelyRestoreChildPositions(e)},_restorePosition:function(){this._backupLatlng&&(this.setLatLng(this._backupLatlng),delete this._backupLatlng)},_recursivelyRemoveChildrenFromMap:function(e,t,i){var n,s;this._recursively(e,-1,t-1,function(e){for(s=e._markers.length-1;s>=0;s--)n=e._markers[s],i&&i.contains(n._latlng)||(e._group._featureGroup.removeLayer(n),n.clusterShow&&n.clusterShow())},function(e){for(s=e._childClusters.length-1;s>=0;s--)n=e._childClusters[s],i&&i.contains(n._latlng)||(e._group._featureGroup.removeLayer(n),n.clusterShow&&n.clusterShow())})},_recursively:function(e,t,i,n,s){var r,o,a=this._childClusters,h=this._zoom;if(t>h)for(r=a.length-1;r>=0;r--)o=a[r],e.intersects(o._bounds)&&o._recursively(e,t,i,n,s);else if(n&&n(this),s&&this._zoom===i&&s(this),i>h)for(r=a.length-1;r>=0;r--)o=a[r],e.intersects(o._bounds)&&o._recursively(e,t,i,n,s)},_isSingleParent:function(){return this._childClusters.length>0&&this._childClusters[0]._childCount===this._childCount}}),L.Marker.include({clusterHide:function(){return this.options.opacityWhenUnclustered=this.options.opacity||1,this.setOpacity(0)},clusterShow:function(){var e=this.setOpacity(this.options.opacity||this.options.opacityWhenUnclustered);return delete this.options.opacityWhenUnclustered,e}}),L.DistanceGrid=function(e){this._cellSize=e,this._sqCellSize=e*e,this._grid={},this._objectPoint={}},L.DistanceGrid.prototype={addObject:function(e,t){var i=this._getCoord(t.x),n=this._getCoord(t.y),s=this._grid,r=s[n]=s[n]||{},o=r[i]=r[i]||[],a=L.Util.stamp(e);this._objectPoint[a]=t,o.push(e)},updateObject:function(e,t){this.removeObject(e),this.addObject(e,t)},removeObject:function(e,t){var i,n,s=this._getCoord(t.x),r=this._getCoord(t.y),o=this._grid,a=o[r]=o[r]||{},h=a[s]=a[s]||[];for(delete this._objectPoint[L.Util.stamp(e)],i=0,n=h.length;n>i;i++)if(h[i]===e)return h.splice(i,1),1===n&&delete a[s],!0},eachObject:function(e,t){var i,n,s,r,o,a,h,u=this._grid;for(i in u){o=u[i];for(n in o)for(a=o[n],s=0,r=a.length;r>s;s++)h=e.call(t,a[s]),h&&(s--,r--)}},getNearObject:function(e){var t,i,n,s,r,o,a,h,u=this._getCoord(e.x),l=this._getCoord(e.y),_=this._objectPoint,d=this._sqCellSize,c=null;for(t=l-1;l+1>=t;t++)if(s=this._grid[t])for(i=u-1;u+1>=i;i++)if(r=s[i])for(n=0,o=r.length;o>n;n++)a=r[n],h=this._sqDist(_[L.Util.stamp(a)],e),d>h&&(d=h,c=a);return c},_getCoord:function(e){return Math.floor(e/this._cellSize)},_sqDist:function(e,t){var i=t.x-e.x,n=t.y-e.y;return i*i+n*n}},function(){L.QuickHull={getDistant:function(e,t){var i=t[1].lat-t[0].lat,n=t[0].lng-t[1].lng;return n*(e.lat-t[0].lat)+i*(e.lng-t[0].lng)},findMostDistantPointFromBaseLine:function(e,t){var i,n,s,r=0,o=null,a=[];for(i=t.length-1;i>=0;i--)n=t[i],s=this.getDistant(n,e),s>0&&(a.push(n),s>r&&(r=s,o=n));return{maxPoint:o,newPoints:a}},buildConvexHull:function(e,t){var i=[],n=this.findMostDistantPointFromBaseLine(e,t);return n.maxPoint?(i=i.concat(this.buildConvexHull([e[0],n.maxPoint],n.newPoints)),i=i.concat(this.buildConvexHull([n.maxPoint,e[1]],n.newPoints))):[e[0]]},getConvexHull:function(e){var t,i=!1,n=!1,s=!1,r=!1,o=null,a=null,h=null,u=null,l=null,_=null;for(t=e.length-1;t>=0;t--){var d=e[t];(i===!1||d.lat>i)&&(o=d,i=d.lat),(n===!1||d.lats)&&(h=d,s=d.lng),(r===!1||d.lng=0;t--)e=i[t].getLatLng(),n.push(e);return L.QuickHull.getConvexHull(n)}}),L.MarkerCluster.include({_2PI:2*Math.PI,_circleFootSeparation:25,_circleStartAngle:Math.PI/6,_spiralFootSeparation:28,_spiralLengthStart:11,_spiralLengthFactor:5,_circleSpiralSwitchover:9,spiderfy:function(){if(this._group._spiderfied!==this&&!this._group._inZoomAnimation){var e,t=this.getAllChildMarkers(),i=this._group,n=i._map,s=n.latLngToLayerPoint(this._latlng);this._group._unspiderfy(),this._group._spiderfied=this,t.length>=this._circleSpiralSwitchover?e=this._generatePointsSpiral(t.length,s):(s.y+=10,e=this._generatePointsCircle(t.length,s)),this._animationSpiderfy(t,e)}},unspiderfy:function(e){this._group._inZoomAnimation||(this._animationUnspiderfy(e),this._group._spiderfied=null)},_generatePointsCircle:function(e,t){var i,n,s=this._group.options.spiderfyDistanceMultiplier*this._circleFootSeparation*(2+e),r=s/this._2PI,o=this._2PI/e,a=[];for(a.length=e,i=e-1;i>=0;i--)n=this._circleStartAngle+i*o,a[i]=new L.Point(t.x+r*Math.cos(n),t.y+r*Math.sin(n))._round();return a},_generatePointsSpiral:function(e,t){var i,n=this._group.options.spiderfyDistanceMultiplier,s=n*this._spiralLengthStart,r=n*this._spiralFootSeparation,o=n*this._spiralLengthFactor*this._2PI,a=0,h=[];for(h.length=e,i=e-1;i>=0;i--)a+=r/s+5e-4*i,h[i]=new L.Point(t.x+s*Math.cos(a),t.y+s*Math.sin(a))._round(),s+=o/a;return h},_noanimationUnspiderfy:function(){var e,t,i=this._group,n=i._map,s=i._featureGroup,r=this.getAllChildMarkers();for(i._ignoreMove=!0,this.setOpacity(1),t=r.length-1;t>=0;t--)e=r[t],s.removeLayer(e),e._preSpiderfyLatlng&&(e.setLatLng(e._preSpiderfyLatlng),delete e._preSpiderfyLatlng),e.setZIndexOffset&&e.setZIndexOffset(0),e._spiderLeg&&(n.removeLayer(e._spiderLeg),delete e._spiderLeg);i.fire("unspiderfied",{cluster:this,markers:r}),i._ignoreMove=!1,i._spiderfied=null}}),L.MarkerClusterNonAnimated=L.MarkerCluster.extend({_animationSpiderfy:function(e,t){var i,n,s,r,o=this._group,a=o._map,h=o._featureGroup,u=this._group.options.spiderLegPolylineOptions;for(o._ignoreMove=!0,i=0;i=0;n--)h=_.layerPointToLatLng(t[n]),s=e[n],s._preSpiderfyLatlng=s._latlng,s.setLatLng(h),s.clusterShow&&s.clusterShow(),f&&(r=s._spiderLeg,o=r._path,o.style.strokeDashoffset=0,r.setStyle({opacity:g}));this.setOpacity(.3),l._ignoreMove=!1,setTimeout(function(){l._animationEnd(),l.fire("spiderfied",{cluster:u,markers:e})},200)},_animationUnspiderfy:function(e){var t,i,n,s,r,o,a=this,h=this._group,u=h._map,l=h._featureGroup,_=e?u._latLngToNewLayerPoint(this._latlng,e.zoom,e.center):u.latLngToLayerPoint(this._latlng),d=this.getAllChildMarkers(),c=L.Path.SVG;for(h._ignoreMove=!0,h._animationStart(),this.setOpacity(1),i=d.length-1;i>=0;i--)t=d[i],t._preSpiderfyLatlng&&(t.setLatLng(t._preSpiderfyLatlng),delete t._preSpiderfyLatlng,o=!0,t._setPos&&(t._setPos(_),o=!1),t.clusterHide&&(t.clusterHide(),o=!1),o&&l.removeLayer(t),c&&(n=t._spiderLeg,s=n._path,r=s.getTotalLength()+.1,s.style.strokeDashoffset=r,n.setStyle({opacity:0})));h._ignoreMove=!1,setTimeout(function(){var e=0;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&e++;for(i=d.length-1;i>=0;i--)t=d[i],t._spiderLeg&&(t.clusterShow&&t.clusterShow(),t.setZIndexOffset&&t.setZIndexOffset(0),e>1&&l.removeLayer(t),u.removeLayer(t._spiderLeg),delete t._spiderLeg);h._animationEnd(),h.fire("unspiderfied",{cluster:a,markers:d})},200)}}),L.MarkerClusterGroup.include({_spiderfied:null,unspiderfy:function(){this._unspiderfy.apply(this,arguments)},_spiderfierOnAdd:function(){this._map.on("click",this._unspiderfyWrapper,this),this._map.options.zoomAnimation&&this._map.on("zoomstart",this._unspiderfyZoomStart,this),this._map.on("zoomend",this._noanimationUnspiderfy,this),L.Browser.touch||this._map.getRenderer(this)},_spiderfierOnRemove:function(){this._map.off("click",this._unspiderfyWrapper,this),this._map.off("zoomstart",this._unspiderfyZoomStart,this),this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._map.off("zoomend",this._noanimationUnspiderfy,this),this._noanimationUnspiderfy()},_unspiderfyZoomStart:function(){this._map&&this._map.on("zoomanim",this._unspiderfyZoomAnim,this)},_unspiderfyZoomAnim:function(e){L.DomUtil.hasClass(this._map._mapPane,"leaflet-touching")||(this._map.off("zoomanim",this._unspiderfyZoomAnim,this),this._unspiderfy(e))},_unspiderfyWrapper:function(){this._unspiderfy()},_unspiderfy:function(e){this._spiderfied&&this._spiderfied.unspiderfy(e)},_noanimationUnspiderfy:function(){this._spiderfied&&this._spiderfied._noanimationUnspiderfy()},_unspiderfyLayer:function(e){e._spiderLeg&&(this._featureGroup.removeLayer(e),e.clusterShow&&e.clusterShow(),e.setZIndexOffset&&e.setZIndexOffset(0),this._map.removeLayer(e._spiderLeg),delete e._spiderLeg)}}),L.MarkerClusterGroup.include({refreshClusters:function(e){return e?e instanceof L.MarkerClusterGroup?e=e._topClusterLevel.getAllChildMarkers():e instanceof L.LayerGroup?e=e._layers:e instanceof L.MarkerCluster?e=e.getAllChildMarkers():e instanceof L.Marker&&(e=[e]):e=this._topClusterLevel.getAllChildMarkers(),this._flagParentsIconsNeedUpdate(e),this._refreshClustersIcons(),this.options.singleMarkerMode&&this._refreshSingleMarkerModeMarkers(e),this},_flagParentsIconsNeedUpdate:function(e){var t,i;for(t in e)for(i=e[t].__parent;i;)i._iconNeedsUpdate=!0,i=i.__parent},_refreshClustersIcons:function(){this._featureGroup.eachLayer(function(e){e instanceof L.MarkerCluster&&e._iconNeedsUpdate&&e._updateIcon()})},_refreshSingleMarkerModeMarkers:function(e){var t,i;for(t in e)i=e[t],this.hasLayer(i)&&i.setIcon(this._overrideMarkerIcon(i))}}),L.Marker.include({refreshIconOptions:function(e,t){var i=this.options.icon;return L.setOptions(i,e),this.setIcon(i),t&&this.__parent&&this.__parent._group.refreshClusters(this),this}})}(window,document); \ No newline at end of file diff --git a/js/leaflet.pattern.js b/js/leaflet.pattern.js new file mode 100644 index 0000000..364165e --- /dev/null +++ b/js/leaflet.pattern.js @@ -0,0 +1,6 @@ +/* + Leaflet.pattern, Provides tools to set the backgrounds of vector shapes in Leaflet to be patterns. + https://github.com/teastman/Leaflet.pattern + (c) 2015, Tyler Eastman +*/ +!function(t,e){L.Pattern=L.Class.extend({includes:[L.Mixin.Events],options:{x:0,y:0,width:8,height:8,patternUnits:"userSpaceOnUse",patternContentUnits:"userSpaceOnUse"},_addShapes:L.Util.falseFn,_update:L.Util.falseFn,initialize:function(t){this._shapes={},L.setOptions(this,t)},onAdd:function(t){this._map=t.target?t.target:t,this._map._initDefRoot(),this._initDom();for(var e in this._shapes)this._shapes[e].onAdd(this);this._addShapes(),this._addDom(),this.redraw(),this.getEvents&&this._map.on(this.getEvents(),this),this.fire("add"),this._map.fire("patternadd",{pattern:this})},onRemove:function(){this._removeDom()},redraw:function(){if(this._map){this._update();for(var t in this._shapes)this._shapes[t].redraw()}return this},setStyle:function(t){return L.setOptions(this,t),this._map&&(this._updateStyle(),this.redraw()),this},addTo:function(t){return t.addPattern(this),this},remove:function(){return this.removeFrom(this._map)},removeFrom:function(t){return t&&t.removePattern(this),this}}),L.Map.addInitHook(function(){this._patterns={}}),L.Map.include({addPattern:function(t){var e=L.stamp(t);return this._patterns[e]?t:(this._patterns[e]=t,this.whenReady(t.onAdd,t),this)},removePattern:function(t){var e=L.stamp(t);return this._patterns[e]?(this._loaded&&t.onRemove(this),t.getEvents&&this.off(t.getEvents(),t),delete this._patterns[e],this._loaded&&(this.fire("patternremove",{pattern:t}),t.fire("remove")),t._map=null,this):this},hasPattern:function(t){return!!t&&L.stamp(t)in this._patterns}}),L.Pattern.SVG_NS="http://www.w3.org/2000/svg",L.Pattern=L.Pattern.extend({_createElement:function(t){return e.createElementNS(L.Pattern.SVG_NS,t)},_initDom:function(){this._dom=this._createElement("pattern"),this.options.className&&L.DomUtil.addClass(this._dom,this.options.className),this._updateStyle()},_addDom:function(){this._map._defRoot.appendChild(this._dom)},_removeDom:function(){L.DomUtil.remove(this._dom)},_updateStyle:function(){var t=this._dom,e=this.options;if(t){if(t.setAttribute("id",L.stamp(this)),t.setAttribute("x",e.x),t.setAttribute("y",e.y),t.setAttribute("width",e.width),t.setAttribute("height",e.height),t.setAttribute("patternUnits",e.patternUnits),t.setAttribute("patternContentUnits",e.patternContentUnits),e.patternTransform||e.angle){var i=e.patternTransform?e.patternTransform+" ":"";i+=e.angle?"rotate("+e.angle+") ":"",t.setAttribute("patternTransform",i)}else t.removeAttribute("patternTransform");for(var s in this._shapes)this._shapes[s]._updateStyle()}}}),L.Map.include({_initDefRoot:function(){if(!this._defRoot)if("function"==typeof this.getRenderer){var t=this.getRenderer(this);this._defRoot=L.Pattern.prototype._createElement("defs"),t._container.appendChild(this._defRoot)}else this._pathRoot||this._initPathRoot(),this._defRoot=L.Pattern.prototype._createElement("defs"),this._pathRoot.appendChild(this._defRoot)}}),L.SVG?L.SVG.include({_superUpdateStyle:L.SVG.prototype._updateStyle,_updateStyle:function(t){this._superUpdateStyle(t),t.options.fill&&t.options.fillPattern&&t._path.setAttribute("fill","url(#"+L.stamp(t.options.fillPattern)+")")}}):L.Path.include({_superUpdateStyle:L.Path.prototype._updateStyle,_updateStyle:function(){this._superUpdateStyle(),this.options.fill&&this.options.fillPattern&&this._path.setAttribute("fill","url(#"+L.stamp(this.options.fillPattern)+")")}}),L.StripePattern=L.Pattern.extend({options:{weight:4,spaceWeight:4,color:"#000000",spaceColor:"#ffffff",opacity:1,spaceOpacity:0},_addShapes:function(){this._stripe=new L.PatternPath({stroke:!0,weight:this.options.weight,color:this.options.color,opacity:this.options.opacity}),this._space=new L.PatternPath({stroke:!0,weight:this.options.spaceWeight,color:this.options.spaceColor,opacity:this.options.spaceOpacity}),this.addShape(this._stripe),this.addShape(this._space),this._update()},_update:function(){this._stripe.options.d="M0 "+this._stripe.options.weight/2+" H "+this.options.width,this._space.options.d="M0 "+(this._stripe.options.weight+this._space.options.weight/2)+" H "+this.options.width},setStyle:L.Pattern.prototype.setStyle}),L.stripePattern=function(t){return new L.StripePattern(t)},L.PatternShape=L.Class.extend({options:{stroke:!0,color:"#3388ff",weight:3,opacity:1,lineCap:"round",lineJoin:"round",fillOpacity:.2,fillRule:"evenodd"},initialize:function(t){L.setOptions(this,t)},onAdd:function(t){this._pattern=t,this._pattern._dom&&(this._initDom(),this._addDom())},addTo:function(t){return t.addShape(this),this},redraw:function(){return this._pattern&&this._updateShape(),this},setStyle:function(t){return L.setOptions(this,t),this._pattern&&this._updateStyle(),this},setShape:function(t){this.options=L.extend({},this.options,t),this._updateShape()}}),L.Pattern.include({addShape:function(t){var e=L.stamp(t);return this._shapes[e]?t:(this._shapes[e]=t,t.onAdd(this),void 0)}}),L.PatternShape.SVG_NS="http://www.w3.org/2000/svg",L.PatternShape=L.PatternShape.extend({_createElement:function(t){return e.createElementNS(L.PatternShape.SVG_NS,t)},_initDom:L.Util.falseFn,_updateShape:L.Util.falseFn,_initDomElement:function(t){this._dom=this._createElement(t),this.options.className&&L.DomUtil.addClass(this._dom,this.options.className),this._updateStyle()},_addDom:function(){this._pattern._dom.appendChild(this._dom)},_updateStyle:function(){var t=this._dom,e=this.options;t&&(e.stroke?(t.setAttribute("stroke",e.color),t.setAttribute("stroke-opacity",e.opacity),t.setAttribute("stroke-width",e.weight),t.setAttribute("stroke-linecap",e.lineCap),t.setAttribute("stroke-linejoin",e.lineJoin),e.dashArray?t.setAttribute("stroke-dasharray",e.dashArray):t.removeAttribute("stroke-dasharray"),e.dashOffset?t.setAttribute("stroke-dashoffset",e.dashOffset):t.removeAttribute("stroke-dashoffset")):t.setAttribute("stroke","none"),e.fill?(e.fillPattern?t.setAttribute("fill","url(#"+L.stamp(e.fillPattern)+")"):t.setAttribute("fill",e.fillColor||e.color),t.setAttribute("fill-opacity",e.fillOpacity),t.setAttribute("fill-rule",e.fillRule||"evenodd")):t.setAttribute("fill","none"),t.setAttribute("pointer-events",e.pointerEvents||(e.interactive?"visiblePainted":"none")))}}),L.PatternPath=L.PatternShape.extend({_initDom:function(){this._initDomElement("path")},_updateShape:function(){this._dom&&this._dom.setAttribute("d",this.options.d)}}),L.PatternCircle=L.PatternShape.extend({options:{x:0,y:0,radius:0},_initDom:function(){this._initDomElement("circle")},_updateShape:function(){this._dom&&(this._dom.setAttribute("cx",this.options.x),this._dom.setAttribute("cy",this.options.y),this._dom.setAttribute("r",this.options.radius))}}),L.PatternRect=L.PatternShape.extend({options:{x:0,y:0,width:10,height:10},_initDom:function(){this._initDomElement("rect")},_updateShape:function(){this._dom&&(this._dom.setAttribute("x",this.options.x),this._dom.setAttribute("y",this.options.y),this._dom.setAttribute("width",this.options.width),this._dom.setAttribute("height",this.options.height),this.options.rx&&this._dom.setAttribute("rx",this.options.rx),this.options.ry&&this._dom.setAttribute("ry",this.options.ry))}})}(window,document); \ No newline at end of file diff --git a/js/leaflet.rotatedMarker.js b/js/leaflet.rotatedMarker.js new file mode 100644 index 0000000..d187645 --- /dev/null +++ b/js/leaflet.rotatedMarker.js @@ -0,0 +1,51 @@ +(function() { + // save these original methods before they are overwritten + var proto_initIcon = L.Marker.prototype._initIcon; + var proto_setPos = L.Marker.prototype._setPos; + + var oldIE = (L.DomUtil.TRANSFORM === 'msTransform'); + + L.Marker.addInitHook(function () { + var iconOptions = this.options.icon && this.options.icon.options; + var iconAnchor = iconOptions && this.options.icon.options.iconAnchor; + if (iconAnchor) { + iconAnchor = (iconAnchor[0] + 'px ' + iconAnchor[1] + 'px'); + } + this.options.rotationOrigin = this.options.rotationOrigin || iconAnchor || 'center bottom' ; + this.options.rotationAngle = this.options.rotationAngle || 0; + }); + + L.Marker.include({ + _initIcon: function() { + proto_initIcon.call(this); + }, + + _setPos: function (pos) { + proto_setPos.call(this, pos); + + if(this.options.rotationAngle) { + this._icon.style[L.DomUtil.TRANSFORM+'Origin'] = this.options.rotationOrigin; + + if(oldIE) { + // for IE 9, use the 2D rotation + this._icon.style[L.DomUtil.TRANSFORM] = 'rotate(' + this.options.rotationAngle + 'deg)'; + } else { + // for modern browsers, prefer the 3D accelerated version + this._icon.style[L.DomUtil.TRANSFORM] += ' rotateZ(' + this.options.rotationAngle + 'deg)'; + } + } + }, + + setRotationAngle: function(angle) { + this.options.rotationAngle = angle; + this.update(); + return this; + }, + + setRotationOrigin: function(origin) { + this.options.rotationOrigin = origin; + this.update(); + return this; + } + }); +})(); diff --git a/js/leaflet.wms.js b/js/leaflet.wms.js new file mode 100644 index 0000000..219e1dd --- /dev/null +++ b/js/leaflet.wms.js @@ -0,0 +1,495 @@ +/*! + * leaflet.wms.js + * A collection of Leaflet utilities for working with Web Mapping services. + * (c) 2014-2016, Houston Engineering, Inc. + * MIT License + */ + +(function (factory) { + // Module systems magic dance, Leaflet edition + if (typeof define === 'function' && define.amd) { + // AMD + define(['leaflet'], factory); + } else if (typeof module !== 'undefined') { + // Node/CommonJS + module.exports = factory(require('leaflet')); + } else { + // Browser globals + if (typeof this.L === 'undefined') + throw 'Leaflet must be loaded first!'; + // Namespace + this.L.WMS = this.L.wms = factory(this.L); + } +}(function (L) { + +// Module object +var wms = {}; + +// Quick shim for Object.keys() +if (!('keys' in Object)) { + Object.keys = function(obj) { + var result = []; + for (var i in obj) { + if (obj.hasOwnProperty(i)) { + result.push(i); + } + } + return result; + }; +} + +/* + * wms.Source + * The Source object manages a single WMS connection. Multiple "layers" can be + * created with the getLayer function, but a single request will be sent for + * each image update. Can be used in non-tiled "overlay" mode (default), or + * tiled mode, via an internal wms.Overlay or wms.TileLayer, respectively. + */ +wms.Source = L.Layer.extend({ + 'options': { + 'untiled': true, + 'identify': true + }, + + 'initialize': function(url, options) { + L.setOptions(this, options); + if (this.options.tiled) { + this.options.untiled = false; + } + this._url = url; + this._subLayers = {}; + this._overlay = this.createOverlay(this.options.untiled); + }, + + 'createOverlay': function(untiled) { + // Create overlay with all options other than untiled & identify + var overlayOptions = {}; + for (var opt in this.options) { + if (opt != 'untiled' && opt != 'identify') { + overlayOptions[opt] = this.options[opt]; + } + } + if (untiled) { + return wms.overlay(this._url, overlayOptions); + } else { + return wms.tileLayer(this._url, overlayOptions); + } + }, + + 'onAdd': function() { + this.refreshOverlay(); + }, + + 'getEvents': function() { + if (this.options.identify) { + return {'click': this.identify}; + } else { + return {}; + } + }, + + 'setOpacity': function(opacity) { + this.options.opacity = opacity; + if (this._overlay) { + this._overlay.setOpacity(opacity); + } + }, + + 'bringToBack': function() { + this.options.isBack = true; + if (this._overlay) { + this._overlay.bringToBack(); + } + }, + + 'bringToFront': function() { + this.options.isBack = false; + if (this._overlay) { + this._overlay.bringToFront(); + } + }, + + 'getLayer': function(name) { + return wms.layer(this, name); + }, + + 'addSubLayer': function(name) { + this._subLayers[name] = true; + this.refreshOverlay(); + }, + + 'removeSubLayer': function(name) { + delete this._subLayers[name]; + this.refreshOverlay(); + }, + + 'refreshOverlay': function() { + var subLayers = Object.keys(this._subLayers).join(","); + if (!this._map) { + return; + } + if (!subLayers) { + this._overlay.remove(); + } else { + this._overlay.setParams({'layers': subLayers}); + this._overlay.addTo(this._map); + } + }, + + 'identify': function(evt) { + // Identify map features in response to map clicks. To customize this + // behavior, create a class extending wms.Source and override one or + // more of the following hook functions. + + var layers = this.getIdentifyLayers(); + if (!layers.length) { + return; + } + this.getFeatureInfo( + evt.containerPoint, evt.latlng, layers, + this.showFeatureInfo + ); + }, + + 'getFeatureInfo': function(point, latlng, layers, callback) { + // Request WMS GetFeatureInfo and call callback with results + // (split from identify() to faciliate use outside of map events) + var params = this.getFeatureInfoParams(point, layers), + url = this._url + L.Util.getParamString(params, this._url); + + this.showWaiting(); + this.ajax(url, done); + + function done(result) { + this.hideWaiting(); + var text = this.parseFeatureInfo(result, url); + callback.call(this, latlng, text); + } + }, + + 'ajax': function(url, callback) { + ajax.call(this, url, callback); + }, + + 'getIdentifyLayers': function() { + // Hook to determine which layers to identify + if (this.options.identifyLayers) + return this.options.identifyLayers; + return Object.keys(this._subLayers); + }, + + 'getFeatureInfoParams': function(point, layers) { + // Hook to generate parameters for WMS service GetFeatureInfo request + var wmsParams, overlay; + if (this.options.untiled) { + // Use existing overlay + wmsParams = this._overlay.wmsParams; + } else { + // Create overlay instance to leverage updateWmsParams + overlay = this.createOverlay(true); + overlay.updateWmsParams(this._map); + wmsParams = overlay.wmsParams; + wmsParams.layers = layers.join(','); + } + var infoParams = { + 'request': 'GetFeatureInfo', + 'query_layers': layers.join(','), + 'X': Math.round(point.x), + 'Y': Math.round(point.y) + }; + return L.extend({}, wmsParams, infoParams); + }, + + 'parseFeatureInfo': function(result, url) { + // Hook to handle parsing AJAX response + if (result == "error") { + // AJAX failed, possibly due to CORS issues. + // Try loading content in